/** * This code was AUTOGENERATED using the Codama library. * Please DO NOT EDIT THIS FILE, instead use visitors * to add features, then rerun Codama to update it. * * @see https://github.com/codama-idl/codama */ import { combineCodec, getStructDecoder, getStructEncoder, getU8Decoder, getU8Encoder, SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, SolanaError, transformEncoder, type AccountMeta, type AccountSignerMeta, type Address, type FixedSizeCodec, type FixedSizeDecoder, type FixedSizeEncoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlySignerAccount, type ReadonlyUint8Array, type TransactionSigner, type WritableAccount, } from "@solana/kit"; import { getAccountMetaFactory, getAddressFromResolvedInstructionAccount, type ResolvedInstructionAccount, } from "@solana/program-client-core"; import { findWithdrawAuthorityPda } from "../pdas/index.ts"; import { SPL_STAKE_POOL_PROGRAM_ADDRESS } from "../programs/index.ts"; export const DEPOSIT_STAKE_DISCRIMINATOR = 9; export function getDepositStakeDiscriminatorBytes(): ReadonlyUint8Array { return getU8Encoder().encode(DEPOSIT_STAKE_DISCRIMINATOR); } export type DepositStakeInstruction< TProgram extends string = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, TAccountStakePool extends string | AccountMeta = string, TAccountValidatorList extends string | AccountMeta = string, TAccountDepositAuthority extends string | AccountMeta = string, TAccountWithdrawAuthority extends string | AccountMeta = string, TAccountStakeToMerge extends string | AccountMeta = string, TAccountValidatorStakeAccount extends string | AccountMeta = string, TAccountReserveStake extends string | AccountMeta = string, TAccountUserPoolTokenAccount extends string | AccountMeta = string, TAccountFeeAccount extends string | AccountMeta = string, TAccountReferralFeeAccount extends string | AccountMeta = string, TAccountPoolMint extends string | AccountMeta = string, TAccountClockSysvar extends string | AccountMeta = "SysvarC1ock11111111111111111111111111111111", TAccountStakeHistorySysvar extends string | AccountMeta = "SysvarStakeHistory1111111111111111111111111", TAccountTokenProgram extends string | AccountMeta = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", TAccountStakeProgram extends string | AccountMeta = "Stake11111111111111111111111111111111111111", TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ TAccountStakePool extends string ? WritableAccount : TAccountStakePool, TAccountValidatorList extends string ? WritableAccount : TAccountValidatorList, TAccountDepositAuthority extends string ? ReadonlyAccount : TAccountDepositAuthority, TAccountWithdrawAuthority extends string ? ReadonlyAccount : TAccountWithdrawAuthority, TAccountStakeToMerge extends string ? WritableAccount : TAccountStakeToMerge, TAccountValidatorStakeAccount extends string ? WritableAccount : TAccountValidatorStakeAccount, TAccountReserveStake extends string ? WritableAccount : TAccountReserveStake, TAccountUserPoolTokenAccount extends string ? WritableAccount : TAccountUserPoolTokenAccount, TAccountFeeAccount extends string ? WritableAccount : TAccountFeeAccount, TAccountReferralFeeAccount extends string ? WritableAccount : TAccountReferralFeeAccount, TAccountPoolMint extends string ? WritableAccount : TAccountPoolMint, TAccountClockSysvar extends string ? ReadonlyAccount : TAccountClockSysvar, TAccountStakeHistorySysvar extends string ? ReadonlyAccount : TAccountStakeHistorySysvar, TAccountTokenProgram extends string ? ReadonlyAccount : TAccountTokenProgram, TAccountStakeProgram extends string ? ReadonlyAccount : TAccountStakeProgram, ...TRemainingAccounts, ] >; export type DepositStakeInstructionData = { discriminator: number }; export type DepositStakeInstructionDataArgs = {}; export function getDepositStakeInstructionDataEncoder(): FixedSizeEncoder { return transformEncoder( getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ ...value, discriminator: DEPOSIT_STAKE_DISCRIMINATOR }), ); } export function getDepositStakeInstructionDataDecoder(): FixedSizeDecoder { return getStructDecoder([["discriminator", getU8Decoder()]]); } export function getDepositStakeInstructionDataCodec(): FixedSizeCodec< DepositStakeInstructionDataArgs, DepositStakeInstructionData > { return combineCodec( getDepositStakeInstructionDataEncoder(), getDepositStakeInstructionDataDecoder(), ); } export type DepositStakeAsyncInput< TAccountStakePool extends string = string, TAccountValidatorList extends string = string, TAccountDepositAuthority extends string = string, TAccountWithdrawAuthority extends string = string, TAccountStakeToMerge extends string = string, TAccountValidatorStakeAccount extends string = string, TAccountReserveStake extends string = string, TAccountUserPoolTokenAccount extends string = string, TAccountFeeAccount extends string = string, TAccountReferralFeeAccount extends string = string, TAccountPoolMint extends string = string, TAccountClockSysvar extends string = string, TAccountStakeHistorySysvar extends string = string, TAccountTokenProgram extends string = string, TAccountStakeProgram extends string = string, > = { stakePool: Address; validatorList: Address; depositAuthority: | Address | TransactionSigner; withdrawAuthority?: Address; stakeToMerge: Address; validatorStakeAccount: Address; reserveStake: Address; userPoolTokenAccount: Address; feeAccount: Address; referralFeeAccount: Address; poolMint: Address; clockSysvar?: Address; stakeHistorySysvar?: Address; tokenProgram?: Address; stakeProgram?: Address; }; /** * Deposit some stake into the pool. The output is a "pool" token * representing ownership into the pool. Inputs are converted to the * current ratio. * 0. `[w]` Stake pool * 1. `[w]` Validator stake list storage account * 2. `[s]/[]` Stake pool deposit authority * 3. `[]` Stake pool withdraw authority * 4. `[w]` Stake account to join the pool (withdraw authority for the * stake account should be first set to the stake pool deposit * authority) * 5. `[w]` Validator stake account for the stake account to be merged * with * 6. `[w]` Reserve stake account, to withdraw rent exempt reserve * 7. `[w]` User account to receive pool tokens * 8. `[w]` Account to receive pool fee tokens * 9. `[w]` Account to receive a portion of pool fee tokens as referral * fees * 10. `[w]` Pool token mint account * 11. '[]' Sysvar clock account * 12. '[]' Sysvar stake history account * 13. `[]` Pool token program id, * 14. `[]` Stake program id, */ export async function getDepositStakeInstructionAsync< TAccountStakePool extends string, TAccountValidatorList extends string, TAccountDepositAuthority extends string, TAccountWithdrawAuthority extends string, TAccountStakeToMerge extends string, TAccountValidatorStakeAccount extends string, TAccountReserveStake extends string, TAccountUserPoolTokenAccount extends string, TAccountFeeAccount extends string, TAccountReferralFeeAccount extends string, TAccountPoolMint extends string, TAccountClockSysvar extends string, TAccountStakeHistorySysvar extends string, TAccountTokenProgram extends string, TAccountStakeProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: DepositStakeAsyncInput< TAccountStakePool, TAccountValidatorList, TAccountDepositAuthority, TAccountWithdrawAuthority, TAccountStakeToMerge, TAccountValidatorStakeAccount, TAccountReserveStake, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountReferralFeeAccount, TAccountPoolMint, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountTokenProgram, TAccountStakeProgram >, config?: { programAddress?: TProgramAddress }, ): Promise< DepositStakeInstruction< TProgramAddress, TAccountStakePool, TAccountValidatorList, (typeof input)["depositAuthority"] extends TransactionSigner ? ReadonlySignerAccount & AccountSignerMeta : TAccountDepositAuthority, TAccountWithdrawAuthority, TAccountStakeToMerge, TAccountValidatorStakeAccount, TAccountReserveStake, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountReferralFeeAccount, TAccountPoolMint, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountTokenProgram, TAccountStakeProgram > > { // Program address. const programAddress = config?.programAddress ?? SPL_STAKE_POOL_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { stakePool: { value: input.stakePool ?? null, isWritable: true }, validatorList: { value: input.validatorList ?? null, isWritable: true }, depositAuthority: { value: input.depositAuthority ?? null, isWritable: false, }, withdrawAuthority: { value: input.withdrawAuthority ?? null, isWritable: false, }, stakeToMerge: { value: input.stakeToMerge ?? null, isWritable: true }, validatorStakeAccount: { value: input.validatorStakeAccount ?? null, isWritable: true, }, reserveStake: { value: input.reserveStake ?? null, isWritable: true }, userPoolTokenAccount: { value: input.userPoolTokenAccount ?? null, isWritable: true, }, feeAccount: { value: input.feeAccount ?? null, isWritable: true }, referralFeeAccount: { value: input.referralFeeAccount ?? null, isWritable: true, }, poolMint: { value: input.poolMint ?? null, isWritable: true }, clockSysvar: { value: input.clockSysvar ?? null, isWritable: false }, stakeHistorySysvar: { value: input.stakeHistorySysvar ?? null, isWritable: false, }, tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, stakeProgram: { value: input.stakeProgram ?? null, isWritable: false }, }; const accounts = originalAccounts as Record< keyof typeof originalAccounts, ResolvedInstructionAccount >; // Resolve default values. if (!accounts.withdrawAuthority.value) { accounts.withdrawAuthority.value = await findWithdrawAuthorityPda( { stakePoolAddress: getAddressFromResolvedInstructionAccount( "stakePool", accounts.stakePool.value, ), }, { programAddress }, ); } if (!accounts.clockSysvar.value) { accounts.clockSysvar.value = "SysvarC1ock11111111111111111111111111111111" as Address<"SysvarC1ock11111111111111111111111111111111">; } if (!accounts.stakeHistorySysvar.value) { accounts.stakeHistorySysvar.value = "SysvarStakeHistory1111111111111111111111111" as Address<"SysvarStakeHistory1111111111111111111111111">; } if (!accounts.tokenProgram.value) { accounts.tokenProgram.value = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address<"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA">; } if (!accounts.stakeProgram.value) { accounts.stakeProgram.value = "Stake11111111111111111111111111111111111111" as Address<"Stake11111111111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ accounts: [ getAccountMeta("stakePool", accounts.stakePool), getAccountMeta("validatorList", accounts.validatorList), getAccountMeta("depositAuthority", accounts.depositAuthority), getAccountMeta("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("stakeToMerge", accounts.stakeToMerge), getAccountMeta("validatorStakeAccount", accounts.validatorStakeAccount), getAccountMeta("reserveStake", accounts.reserveStake), getAccountMeta("userPoolTokenAccount", accounts.userPoolTokenAccount), getAccountMeta("feeAccount", accounts.feeAccount), getAccountMeta("referralFeeAccount", accounts.referralFeeAccount), getAccountMeta("poolMint", accounts.poolMint), getAccountMeta("clockSysvar", accounts.clockSysvar), getAccountMeta("stakeHistorySysvar", accounts.stakeHistorySysvar), getAccountMeta("tokenProgram", accounts.tokenProgram), getAccountMeta("stakeProgram", accounts.stakeProgram), ], data: getDepositStakeInstructionDataEncoder().encode({}), programAddress, } as DepositStakeInstruction< TProgramAddress, TAccountStakePool, TAccountValidatorList, (typeof input)["depositAuthority"] extends TransactionSigner ? ReadonlySignerAccount & AccountSignerMeta : TAccountDepositAuthority, TAccountWithdrawAuthority, TAccountStakeToMerge, TAccountValidatorStakeAccount, TAccountReserveStake, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountReferralFeeAccount, TAccountPoolMint, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountTokenProgram, TAccountStakeProgram >); } export type DepositStakeInput< TAccountStakePool extends string = string, TAccountValidatorList extends string = string, TAccountDepositAuthority extends string = string, TAccountWithdrawAuthority extends string = string, TAccountStakeToMerge extends string = string, TAccountValidatorStakeAccount extends string = string, TAccountReserveStake extends string = string, TAccountUserPoolTokenAccount extends string = string, TAccountFeeAccount extends string = string, TAccountReferralFeeAccount extends string = string, TAccountPoolMint extends string = string, TAccountClockSysvar extends string = string, TAccountStakeHistorySysvar extends string = string, TAccountTokenProgram extends string = string, TAccountStakeProgram extends string = string, > = { stakePool: Address; validatorList: Address; depositAuthority: | Address | TransactionSigner; withdrawAuthority: Address; stakeToMerge: Address; validatorStakeAccount: Address; reserveStake: Address; userPoolTokenAccount: Address; feeAccount: Address; referralFeeAccount: Address; poolMint: Address; clockSysvar?: Address; stakeHistorySysvar?: Address; tokenProgram?: Address; stakeProgram?: Address; }; /** * Deposit some stake into the pool. The output is a "pool" token * representing ownership into the pool. Inputs are converted to the * current ratio. * 0. `[w]` Stake pool * 1. `[w]` Validator stake list storage account * 2. `[s]/[]` Stake pool deposit authority * 3. `[]` Stake pool withdraw authority * 4. `[w]` Stake account to join the pool (withdraw authority for the * stake account should be first set to the stake pool deposit * authority) * 5. `[w]` Validator stake account for the stake account to be merged * with * 6. `[w]` Reserve stake account, to withdraw rent exempt reserve * 7. `[w]` User account to receive pool tokens * 8. `[w]` Account to receive pool fee tokens * 9. `[w]` Account to receive a portion of pool fee tokens as referral * fees * 10. `[w]` Pool token mint account * 11. '[]' Sysvar clock account * 12. '[]' Sysvar stake history account * 13. `[]` Pool token program id, * 14. `[]` Stake program id, */ export function getDepositStakeInstruction< TAccountStakePool extends string, TAccountValidatorList extends string, TAccountDepositAuthority extends string, TAccountWithdrawAuthority extends string, TAccountStakeToMerge extends string, TAccountValidatorStakeAccount extends string, TAccountReserveStake extends string, TAccountUserPoolTokenAccount extends string, TAccountFeeAccount extends string, TAccountReferralFeeAccount extends string, TAccountPoolMint extends string, TAccountClockSysvar extends string, TAccountStakeHistorySysvar extends string, TAccountTokenProgram extends string, TAccountStakeProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: DepositStakeInput< TAccountStakePool, TAccountValidatorList, TAccountDepositAuthority, TAccountWithdrawAuthority, TAccountStakeToMerge, TAccountValidatorStakeAccount, TAccountReserveStake, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountReferralFeeAccount, TAccountPoolMint, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountTokenProgram, TAccountStakeProgram >, config?: { programAddress?: TProgramAddress }, ): DepositStakeInstruction< TProgramAddress, TAccountStakePool, TAccountValidatorList, (typeof input)["depositAuthority"] extends TransactionSigner ? ReadonlySignerAccount & AccountSignerMeta : TAccountDepositAuthority, TAccountWithdrawAuthority, TAccountStakeToMerge, TAccountValidatorStakeAccount, TAccountReserveStake, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountReferralFeeAccount, TAccountPoolMint, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountTokenProgram, TAccountStakeProgram > { // Program address. const programAddress = config?.programAddress ?? SPL_STAKE_POOL_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { stakePool: { value: input.stakePool ?? null, isWritable: true }, validatorList: { value: input.validatorList ?? null, isWritable: true }, depositAuthority: { value: input.depositAuthority ?? null, isWritable: false, }, withdrawAuthority: { value: input.withdrawAuthority ?? null, isWritable: false, }, stakeToMerge: { value: input.stakeToMerge ?? null, isWritable: true }, validatorStakeAccount: { value: input.validatorStakeAccount ?? null, isWritable: true, }, reserveStake: { value: input.reserveStake ?? null, isWritable: true }, userPoolTokenAccount: { value: input.userPoolTokenAccount ?? null, isWritable: true, }, feeAccount: { value: input.feeAccount ?? null, isWritable: true }, referralFeeAccount: { value: input.referralFeeAccount ?? null, isWritable: true, }, poolMint: { value: input.poolMint ?? null, isWritable: true }, clockSysvar: { value: input.clockSysvar ?? null, isWritable: false }, stakeHistorySysvar: { value: input.stakeHistorySysvar ?? null, isWritable: false, }, tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, stakeProgram: { value: input.stakeProgram ?? null, isWritable: false }, }; const accounts = originalAccounts as Record< keyof typeof originalAccounts, ResolvedInstructionAccount >; // Resolve default values. if (!accounts.clockSysvar.value) { accounts.clockSysvar.value = "SysvarC1ock11111111111111111111111111111111" as Address<"SysvarC1ock11111111111111111111111111111111">; } if (!accounts.stakeHistorySysvar.value) { accounts.stakeHistorySysvar.value = "SysvarStakeHistory1111111111111111111111111" as Address<"SysvarStakeHistory1111111111111111111111111">; } if (!accounts.tokenProgram.value) { accounts.tokenProgram.value = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as Address<"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA">; } if (!accounts.stakeProgram.value) { accounts.stakeProgram.value = "Stake11111111111111111111111111111111111111" as Address<"Stake11111111111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ accounts: [ getAccountMeta("stakePool", accounts.stakePool), getAccountMeta("validatorList", accounts.validatorList), getAccountMeta("depositAuthority", accounts.depositAuthority), getAccountMeta("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("stakeToMerge", accounts.stakeToMerge), getAccountMeta("validatorStakeAccount", accounts.validatorStakeAccount), getAccountMeta("reserveStake", accounts.reserveStake), getAccountMeta("userPoolTokenAccount", accounts.userPoolTokenAccount), getAccountMeta("feeAccount", accounts.feeAccount), getAccountMeta("referralFeeAccount", accounts.referralFeeAccount), getAccountMeta("poolMint", accounts.poolMint), getAccountMeta("clockSysvar", accounts.clockSysvar), getAccountMeta("stakeHistorySysvar", accounts.stakeHistorySysvar), getAccountMeta("tokenProgram", accounts.tokenProgram), getAccountMeta("stakeProgram", accounts.stakeProgram), ], data: getDepositStakeInstructionDataEncoder().encode({}), programAddress, } as DepositStakeInstruction< TProgramAddress, TAccountStakePool, TAccountValidatorList, (typeof input)["depositAuthority"] extends TransactionSigner ? ReadonlySignerAccount & AccountSignerMeta : TAccountDepositAuthority, TAccountWithdrawAuthority, TAccountStakeToMerge, TAccountValidatorStakeAccount, TAccountReserveStake, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountReferralFeeAccount, TAccountPoolMint, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountTokenProgram, TAccountStakeProgram >); } export type ParsedDepositStakeInstruction< TProgram extends string = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], > = { programAddress: Address; accounts: { stakePool: TAccountMetas[0]; validatorList: TAccountMetas[1]; depositAuthority: TAccountMetas[2]; withdrawAuthority: TAccountMetas[3]; stakeToMerge: TAccountMetas[4]; validatorStakeAccount: TAccountMetas[5]; reserveStake: TAccountMetas[6]; userPoolTokenAccount: TAccountMetas[7]; feeAccount: TAccountMetas[8]; referralFeeAccount: TAccountMetas[9]; poolMint: TAccountMetas[10]; clockSysvar: TAccountMetas[11]; stakeHistorySysvar: TAccountMetas[12]; tokenProgram: TAccountMetas[13]; stakeProgram: TAccountMetas[14]; }; data: DepositStakeInstructionData; }; export function parseDepositStakeInstruction< TProgram extends string, TAccountMetas extends readonly AccountMeta[], >( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedDepositStakeInstruction { if (instruction.accounts.length < 15) { throw new SolanaError( SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { actualAccountMetas: instruction.accounts.length, expectedAccountMetas: 15, }, ); } let accountIndex = 0; const getNextAccount = () => { const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; accountIndex += 1; return accountMeta; }; return { programAddress: instruction.programAddress, accounts: { stakePool: getNextAccount(), validatorList: getNextAccount(), depositAuthority: getNextAccount(), withdrawAuthority: getNextAccount(), stakeToMerge: getNextAccount(), validatorStakeAccount: getNextAccount(), reserveStake: getNextAccount(), userPoolTokenAccount: getNextAccount(), feeAccount: getNextAccount(), referralFeeAccount: getNextAccount(), poolMint: getNextAccount(), clockSysvar: getNextAccount(), stakeHistorySysvar: getNextAccount(), tokenProgram: getNextAccount(), stakeProgram: getNextAccount(), }, data: getDepositStakeInstructionDataDecoder().decode(instruction.data), }; }