UNPKG

@nosana/kit

Version:

Nosana KIT

87 lines 3.24 kB
import { parseBase64RpcAccount } from '@solana/kit'; import * as programClient from '../../../generated_clients/staking/index.js'; import { convertBigIntToNumber } from '../../../utils/index.js'; import bs58 from 'bs58'; export function createStakeProgram(deps, config) { const programId = config.stakeAddress; const client = programClient; /** * Transform stake account to include address and convert BigInt to numbers */ function transformStakeAccount(stakeAccount) { const { discriminator: _, ...stakeAccountData } = stakeAccount.data; return { address: stakeAccount.address, ...convertBigIntToNumber(stakeAccountData), }; } return { /** * Fetch a stake account by address */ async get(addr) { try { const stakeAccount = await client.fetchStakeAccount(deps.solana.rpc, addr); const stake = transformStakeAccount(stakeAccount); return stake; } catch (err) { deps.logger.error(`Failed to fetch stake ${err}`); throw err; } }, /** * Fetch multiple stake accounts by address */ async multiple(addresses) { try { const stakeAccounts = await client.fetchAllStakeAccount(deps.solana.rpc, addresses); const stakes = stakeAccounts.map((stakeAccount) => transformStakeAccount(stakeAccount)); return stakes; } catch (err) { deps.logger.error(`Failed to fetch stakes ${err}`); throw err; } }, /** * Fetch all stake accounts */ async all() { try { const getProgramAccountsResponse = await deps.solana.rpc .getProgramAccounts(programId, { encoding: 'base64', filters: [ { memcmp: { offset: BigInt(0), bytes: bs58.encode(Buffer.from(client.STAKE_ACCOUNT_DISCRIMINATOR)), encoding: 'base58', }, }, ], }) .send(); const stakes = getProgramAccountsResponse .map((result) => { try { const stakeAccount = programClient.decodeStakeAccount(parseBase64RpcAccount(result.pubkey, result.account)); return transformStakeAccount(stakeAccount); } catch (err) { deps.logger.error(`Failed to decode stake ${err}`); return null; } }) .filter((account) => account !== null); return stakes; } catch (err) { deps.logger.error(`Failed to fetch all stakes ${err}`); throw err; } }, }; } //# sourceMappingURL=StakeProgram.js.map