Learn
Getting Started
Helium Program Library lets you build on the Helium Network.
Looking to learn more about the Helium Program Library? You're in the right place!
Initializing the SDK
Let's get started by installing the sdks
yarn add @helium/account-fetch-cache @helium/account-fetch-cache-hooks @helium/address @helium/crypto-react-native @helium/currency @helium/currency-utils @helium/data-credits-sdk @helium/distributor-oracle @helium/helium-entity-manager-sdk @helium/helium-react-hooks @helium/helium-sub-daos-sdk @helium/hotspot-utils @helium/http @helium/idls @helium/lazy-distributor-sdk @helium/spl-utils
Note that you only need to install the sdks of the contracts you wish to use.
Claiming Hotspot Rewards
The lazy-distributor
contract is used to claim rewards for hotspots.
First you need to get the compressed collectables by creator
import { entityCreatorKey } from '@helium/helium-entity-manager-sdk'
import { daoKey } from '@helium/helium-sub-daos-sdk'
import { HNT_MINT, searchAssets } from '@helium/spl-utils'
import { AnchorProvider } from '@coral-xyz/anchor'
import { PublicKey } from '@solana/web3.js'
export const DAO_KEY = daoKey(HNT_MINT)[0]
export const getCompressedCollectablesByCreator = async (
pubKey: PublicKey,
anchorProvider: AnchorProvider,
page?: number,
limit?: number
) => {
const conn = anchorProvider.connection
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
const items = await searchAssets(conn.rpcEndpoint, {
ownerAddress: pubKey.toBase58(),
creatorVerified: true,
creatorAddress: entityCreatorKey(DAO_KEY)[0].toBase58(),
page,
limit,
})
return items
}
Annotate pending rewards to all hotspots
import { AnchorProvider } from '@coral-xyz/anchor'
import { Asset, HNT_MINT } from '@helium/spl-utils'
import * as lz from '@helium/lazy-distributor-sdk'
import { init, keyToAssetForAsset, decodeEntityKey } from '@helium/helium-entity-manager-sdk'
import { daoKey } from '@helium/helium-sub-daos-sdk'
import { getPendingRewards } from '@helium/distributor-oracle'
export const DAO_KEY = daoKey(HNT_MINT)[0]
export type HotspotWithPendingRewards = Asset & {
// mint id to pending rewards
pendingRewards: Record<string, string> | undefined
}
export async function annotateWithPendingRewards(
provider: AnchorProvider,
hotspots: Asset[],
): Promise<HotspotWithPendingRewards[]> {
const program = await lz.init(provider)
const hemProgram = await init(provider)
const dao = DAO_KEY
const keyToAssets = hotspots.map((h) =>
keyToAssetForAsset(h),
)
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const ktaAccs = await getCachedKeyToAssets(hemProgram as any, keyToAssets)
const entityKeys = ktaAccs.map(
(kta) =>
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
decodeEntityKey(kta.entityKey, kta.keySerialization)!,
)
const mobileRewards = await getPendingRewards(
program,
MOBILE_LAZY_KEY,
dao,
entityKeys,
)
const iotRewards = await getPendingRewards(
program,
IOT_LAZY_KEY,
dao,
entityKeys,
)
return hotspots.map((hotspot, index) => {
const entityKey = entityKeys[index]
return {
...hotspot,
pendingRewards: {
[Mints.MOBILE]: mobileRewards[entityKey],
[Mints.IOT]: iotRewards[entityKey],
},
} as HotspotWithPendingRewards
})
}
Generate and send claim txn for a hotspot
import { AnchorProvider } from '@coral-xyz/anchor'
import { daoKey } from '@helium/helium-sub-daos-sdk'
import { bs58 } from '@coral-xyz/anchor/dist/cjs/utils/bytes'
import {
init as initHem,
keyToAssetKey,
} from '@helium/helium-entity-manager-sdk'
import * as client from '@helium/distributor-oracle'
import { init as initLazy, recipientKey } from '@helium/lazy-distributor-sdk'
import {
bulkSendRawTransactions,
Asset,
HNT_MINT,
MOBILE_MINT,
} from '@helium/spl-utils'
import { lazyDistributorKey } from '@helium/lazy-distributor-sdk'
import { PublicKey } from '@solana/web3.js'
export const MOBILE_LAZY_KEY = lazyDistributorKey(MOBILE_MINT)[0]
export type HotspotWithPendingRewards = Asset & {
// mint id to pending rewards
pendingRewards: Record<string, string> | undefined,
}
export const claimHotspotReward = async ({
publicAddress,
provider,
hotspot,
}: {
publicAddress: string,
provider: AnchorProvider,
hotspot: HotspotWithPendingRewards,
}) => {
const hemProgram = await initHem(provider)
const [entityKey] = keyToAssetKey(
daoKey(HNT_MINT)[0],
bs58.decode(hotspot?.content?.json_uri?.split('/')?.slice(-1)?.[0])
)
const keyToAsset = await hemProgram.account.keyToAssetV0.fetchNullable(
entityKey
)
const recipient = new PublicKey(publicAddress)
const asset = keyToAsset?.asset
const lazyDistributorProgram = await initLazy(provider)
const lazyDistributor = MOBILE_LAZY_KEY
if (!asset) {
throw new Error('No asset found')
}
const recipientK = recipientKey(lazyDistributor, asset)
const recipientAcc = await lazyDistributorProgram.account.recipientV0.fetch(
recipientK[0]
)
if (!recipientAcc) {
throw new Error('Recipient account not found')
}
const rewards = await client.getCurrentRewards(
lazyDistributorProgram,
lazyDistributor,
asset
)
// Creating claim txn with helium mobile wallet as fee payer
const claimTxn = await client.formTransaction({
program: lazyDistributorProgram,
provider,
rewards,
asset: asset,
lazyDistributor: MOBILE_LAZY_KEY,
assetEndpoint: provider.connection.rpcEndpoint,
wallet: recipient,
payer: provider.wallet.publicKey,
})
const signedTxn = await provider.wallet.signTransaction(claimTxn)
const serializedTxn = signedTxn.serialize()
const sigs = await bulkSendRawTransactions(provider.connection, [
serializedTxn,
])
return sigs
}