/** * 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, getU64Decoder, getU64Encoder, 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_WITH_SLIPPAGE_DISCRIMINATOR = 23; export function getDepositStakeWithSlippageDiscriminatorBytes(): ReadonlyUint8Array { return getU8Encoder().encode(DEPOSIT_STAKE_WITH_SLIPPAGE_DISCRIMINATOR); } export type DepositStakeWithSlippageInstruction< 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 DepositStakeWithSlippageInstructionData = { discriminator: number; minimumPoolTokensOut: bigint; }; export type DepositStakeWithSlippageInstructionDataArgs = { minimumPoolTokensOut: number | bigint; }; export function getDepositStakeWithSlippageInstructionDataEncoder(): FixedSizeEncoder { return transformEncoder( getStructEncoder([ ["discriminator", getU8Encoder()], ["minimumPoolTokensOut", getU64Encoder()], ]), (value) => ({ ...value, discriminator: DEPOSIT_STAKE_WITH_SLIPPAGE_DISCRIMINATOR, }), ); } export function getDepositStakeWithSlippageInstructionDataDecoder(): FixedSizeDecoder { return getStructDecoder([ ["discriminator", getU8Decoder()], ["minimumPoolTokensOut", getU64Decoder()], ]); } export function getDepositStakeWithSlippageInstructionDataCodec(): FixedSizeCodec< DepositStakeWithSlippageInstructionDataArgs, DepositStakeWithSlippageInstructionData > { return combineCodec( getDepositStakeWithSlippageInstructionDataEncoder(), getDepositStakeWithSlippageInstructionDataDecoder(), ); } export type DepositStakeWithSlippageAsyncInput< 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; minimumPoolTokensOut: DepositStakeWithSlippageInstructionDataArgs["minimumPoolTokensOut"]; }; /** * Deposit some stake into the pool, with a specified slippage * constraint. The output is a "pool" token representing ownership * into the pool. Inputs are converted at 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 getDepositStakeWithSlippageInstructionAsync< 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: DepositStakeWithSlippageAsyncInput< TAccountStakePool, TAccountValidatorList, TAccountDepositAuthority, TAccountWithdrawAuthority, TAccountStakeToMerge, TAccountValidatorStakeAccount, TAccountReserveStake, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountReferralFeeAccount, TAccountPoolMint, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountTokenProgram, TAccountStakeProgram >, config?: { programAddress?: TProgramAddress }, ): Promise< DepositStakeWithSlippageInstruction< 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 >; // Original args. const args = { ...input }; // 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: getDepositStakeWithSlippageInstructionDataEncoder().encode( args as DepositStakeWithSlippageInstructionDataArgs, ), programAddress, } as DepositStakeWithSlippageInstruction< 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 DepositStakeWithSlippageInput< 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; minimumPoolTokensOut: DepositStakeWithSlippageInstructionDataArgs["minimumPoolTokensOut"]; }; /** * Deposit some stake into the pool, with a specified slippage * constraint. The output is a "pool" token representing ownership * into the pool. Inputs are converted at 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 getDepositStakeWithSlippageInstruction< 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: DepositStakeWithSlippageInput< TAccountStakePool, TAccountValidatorList, TAccountDepositAuthority, TAccountWithdrawAuthority, TAccountStakeToMerge, TAccountValidatorStakeAccount, TAccountReserveStake, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountReferralFeeAccount, TAccountPoolMint, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountTokenProgram, TAccountStakeProgram >, config?: { programAddress?: TProgramAddress }, ): DepositStakeWithSlippageInstruction< 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 >; // Original args. const args = { ...input }; // 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: getDepositStakeWithSlippageInstructionDataEncoder().encode( args as DepositStakeWithSlippageInstructionDataArgs, ), programAddress, } as DepositStakeWithSlippageInstruction< 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 ParsedDepositStakeWithSlippageInstruction< 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: DepositStakeWithSlippageInstructionData; }; export function parseDepositStakeWithSlippageInstruction< TProgram extends string, TAccountMetas extends readonly AccountMeta[], >( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedDepositStakeWithSlippageInstruction { 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: getDepositStakeWithSlippageInstructionDataDecoder().decode( instruction.data, ), }; }