/** * 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 WITHDRAW_STAKE_WITH_SLIPPAGE_DISCRIMINATOR = 24; export function getWithdrawStakeWithSlippageDiscriminatorBytes(): ReadonlyUint8Array { return getU8Encoder().encode(WITHDRAW_STAKE_WITH_SLIPPAGE_DISCRIMINATOR); } export type WithdrawStakeWithSlippageInstruction< TProgram extends string = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, TAccountStakePool extends string | AccountMeta = string, TAccountValidatorList extends string | AccountMeta = string, TAccountWithdrawAuthority extends string | AccountMeta = string, TAccountSourceStakeAccount extends string | AccountMeta = string, TAccountDestinationStakeAccount extends string | AccountMeta = string, TAccountNewWithdrawAuthority extends string | AccountMeta = string, TAccountUserTransferAuthority extends string | AccountMeta = string, TAccountUserPoolTokenAccount extends string | AccountMeta = string, TAccountFeeAccount extends string | AccountMeta = string, TAccountPoolMint extends string | AccountMeta = string, TAccountClockSysvar extends string | AccountMeta = "SysvarC1ock11111111111111111111111111111111", 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, TAccountWithdrawAuthority extends string ? ReadonlyAccount : TAccountWithdrawAuthority, TAccountSourceStakeAccount extends string ? WritableAccount : TAccountSourceStakeAccount, TAccountDestinationStakeAccount extends string ? WritableAccount : TAccountDestinationStakeAccount, TAccountNewWithdrawAuthority extends string ? ReadonlyAccount : TAccountNewWithdrawAuthority, TAccountUserTransferAuthority extends string ? ReadonlySignerAccount & AccountSignerMeta : TAccountUserTransferAuthority, TAccountUserPoolTokenAccount extends string ? WritableAccount : TAccountUserPoolTokenAccount, TAccountFeeAccount extends string ? WritableAccount : TAccountFeeAccount, TAccountPoolMint extends string ? WritableAccount : TAccountPoolMint, TAccountClockSysvar extends string ? ReadonlyAccount : TAccountClockSysvar, TAccountTokenProgram extends string ? ReadonlyAccount : TAccountTokenProgram, TAccountStakeProgram extends string ? ReadonlyAccount : TAccountStakeProgram, ...TRemainingAccounts, ] >; export type WithdrawStakeWithSlippageInstructionData = { discriminator: number; poolTokensIn: bigint; minimumLamportsOut: bigint; }; export type WithdrawStakeWithSlippageInstructionDataArgs = { poolTokensIn: number | bigint; minimumLamportsOut: number | bigint; }; export function getWithdrawStakeWithSlippageInstructionDataEncoder(): FixedSizeEncoder { return transformEncoder( getStructEncoder([ ["discriminator", getU8Encoder()], ["poolTokensIn", getU64Encoder()], ["minimumLamportsOut", getU64Encoder()], ]), (value) => ({ ...value, discriminator: WITHDRAW_STAKE_WITH_SLIPPAGE_DISCRIMINATOR, }), ); } export function getWithdrawStakeWithSlippageInstructionDataDecoder(): FixedSizeDecoder { return getStructDecoder([ ["discriminator", getU8Decoder()], ["poolTokensIn", getU64Decoder()], ["minimumLamportsOut", getU64Decoder()], ]); } export function getWithdrawStakeWithSlippageInstructionDataCodec(): FixedSizeCodec< WithdrawStakeWithSlippageInstructionDataArgs, WithdrawStakeWithSlippageInstructionData > { return combineCodec( getWithdrawStakeWithSlippageInstructionDataEncoder(), getWithdrawStakeWithSlippageInstructionDataDecoder(), ); } export type WithdrawStakeWithSlippageAsyncInput< TAccountStakePool extends string = string, TAccountValidatorList extends string = string, TAccountWithdrawAuthority extends string = string, TAccountSourceStakeAccount extends string = string, TAccountDestinationStakeAccount extends string = string, TAccountNewWithdrawAuthority extends string = string, TAccountUserTransferAuthority extends string = string, TAccountUserPoolTokenAccount extends string = string, TAccountFeeAccount extends string = string, TAccountPoolMint extends string = string, TAccountClockSysvar extends string = string, TAccountTokenProgram extends string = string, TAccountStakeProgram extends string = string, > = { stakePool: Address; validatorList: Address; withdrawAuthority?: Address; sourceStakeAccount: Address; destinationStakeAccount: Address; newWithdrawAuthority: Address; userTransferAuthority: TransactionSigner; userPoolTokenAccount: Address; feeAccount: Address; poolMint: Address; clockSysvar?: Address; tokenProgram?: Address; stakeProgram?: Address; poolTokensIn: WithdrawStakeWithSlippageInstructionDataArgs["poolTokensIn"]; minimumLamportsOut: WithdrawStakeWithSlippageInstructionDataArgs["minimumLamportsOut"]; }; /** * Withdraw the token from the pool at the current ratio, specifying a * minimum expected output lamport amount. * Succeeds if the stake account has enough SOL to cover the desired * amount of pool tokens, and if the withdrawal keeps the total * staked amount above the minimum of rent-exempt amount plus `max( * crate::MINIMUM_ACTIVE_STAKE, * solana_program::stake::tools::get_minimum_delegation() * )`. * 0. `[w]` Stake pool * 1. `[w]` Validator stake list storage account * 2. `[]` Stake pool withdraw authority * 3. `[w]` Validator or reserve stake account to split * 4. `[w]` Uninitialized stake account to receive withdrawal * 5. `[]` User account to set as a new withdraw authority * 6. `[s]` User transfer authority, for pool token account * 7. `[w]` User account with pool tokens to burn from * 8. `[w]` Account to receive pool fee tokens * 9. `[w]` Pool token mint account * 10. `[]` Sysvar clock account (required) * 11. `[]` Pool token program id * 12. `[]` Stake program id, * User data: amount of pool tokens to withdraw */ export async function getWithdrawStakeWithSlippageInstructionAsync< TAccountStakePool extends string, TAccountValidatorList extends string, TAccountWithdrawAuthority extends string, TAccountSourceStakeAccount extends string, TAccountDestinationStakeAccount extends string, TAccountNewWithdrawAuthority extends string, TAccountUserTransferAuthority extends string, TAccountUserPoolTokenAccount extends string, TAccountFeeAccount extends string, TAccountPoolMint extends string, TAccountClockSysvar extends string, TAccountTokenProgram extends string, TAccountStakeProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: WithdrawStakeWithSlippageAsyncInput< TAccountStakePool, TAccountValidatorList, TAccountWithdrawAuthority, TAccountSourceStakeAccount, TAccountDestinationStakeAccount, TAccountNewWithdrawAuthority, TAccountUserTransferAuthority, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountPoolMint, TAccountClockSysvar, TAccountTokenProgram, TAccountStakeProgram >, config?: { programAddress?: TProgramAddress }, ): Promise< WithdrawStakeWithSlippageInstruction< TProgramAddress, TAccountStakePool, TAccountValidatorList, TAccountWithdrawAuthority, TAccountSourceStakeAccount, TAccountDestinationStakeAccount, TAccountNewWithdrawAuthority, TAccountUserTransferAuthority, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountPoolMint, TAccountClockSysvar, 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 }, withdrawAuthority: { value: input.withdrawAuthority ?? null, isWritable: false, }, sourceStakeAccount: { value: input.sourceStakeAccount ?? null, isWritable: true, }, destinationStakeAccount: { value: input.destinationStakeAccount ?? null, isWritable: true, }, newWithdrawAuthority: { value: input.newWithdrawAuthority ?? null, isWritable: false, }, userTransferAuthority: { value: input.userTransferAuthority ?? null, isWritable: false, }, userPoolTokenAccount: { value: input.userPoolTokenAccount ?? null, isWritable: true, }, feeAccount: { value: input.feeAccount ?? null, isWritable: true }, poolMint: { value: input.poolMint ?? null, isWritable: true }, clockSysvar: { value: input.clockSysvar ?? 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.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("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("sourceStakeAccount", accounts.sourceStakeAccount), getAccountMeta( "destinationStakeAccount", accounts.destinationStakeAccount, ), getAccountMeta("newWithdrawAuthority", accounts.newWithdrawAuthority), getAccountMeta("userTransferAuthority", accounts.userTransferAuthority), getAccountMeta("userPoolTokenAccount", accounts.userPoolTokenAccount), getAccountMeta("feeAccount", accounts.feeAccount), getAccountMeta("poolMint", accounts.poolMint), getAccountMeta("clockSysvar", accounts.clockSysvar), getAccountMeta("tokenProgram", accounts.tokenProgram), getAccountMeta("stakeProgram", accounts.stakeProgram), ], data: getWithdrawStakeWithSlippageInstructionDataEncoder().encode( args as WithdrawStakeWithSlippageInstructionDataArgs, ), programAddress, } as WithdrawStakeWithSlippageInstruction< TProgramAddress, TAccountStakePool, TAccountValidatorList, TAccountWithdrawAuthority, TAccountSourceStakeAccount, TAccountDestinationStakeAccount, TAccountNewWithdrawAuthority, TAccountUserTransferAuthority, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountPoolMint, TAccountClockSysvar, TAccountTokenProgram, TAccountStakeProgram >); } export type WithdrawStakeWithSlippageInput< TAccountStakePool extends string = string, TAccountValidatorList extends string = string, TAccountWithdrawAuthority extends string = string, TAccountSourceStakeAccount extends string = string, TAccountDestinationStakeAccount extends string = string, TAccountNewWithdrawAuthority extends string = string, TAccountUserTransferAuthority extends string = string, TAccountUserPoolTokenAccount extends string = string, TAccountFeeAccount extends string = string, TAccountPoolMint extends string = string, TAccountClockSysvar extends string = string, TAccountTokenProgram extends string = string, TAccountStakeProgram extends string = string, > = { stakePool: Address; validatorList: Address; withdrawAuthority: Address; sourceStakeAccount: Address; destinationStakeAccount: Address; newWithdrawAuthority: Address; userTransferAuthority: TransactionSigner; userPoolTokenAccount: Address; feeAccount: Address; poolMint: Address; clockSysvar?: Address; tokenProgram?: Address; stakeProgram?: Address; poolTokensIn: WithdrawStakeWithSlippageInstructionDataArgs["poolTokensIn"]; minimumLamportsOut: WithdrawStakeWithSlippageInstructionDataArgs["minimumLamportsOut"]; }; /** * Withdraw the token from the pool at the current ratio, specifying a * minimum expected output lamport amount. * Succeeds if the stake account has enough SOL to cover the desired * amount of pool tokens, and if the withdrawal keeps the total * staked amount above the minimum of rent-exempt amount plus `max( * crate::MINIMUM_ACTIVE_STAKE, * solana_program::stake::tools::get_minimum_delegation() * )`. * 0. `[w]` Stake pool * 1. `[w]` Validator stake list storage account * 2. `[]` Stake pool withdraw authority * 3. `[w]` Validator or reserve stake account to split * 4. `[w]` Uninitialized stake account to receive withdrawal * 5. `[]` User account to set as a new withdraw authority * 6. `[s]` User transfer authority, for pool token account * 7. `[w]` User account with pool tokens to burn from * 8. `[w]` Account to receive pool fee tokens * 9. `[w]` Pool token mint account * 10. `[]` Sysvar clock account (required) * 11. `[]` Pool token program id * 12. `[]` Stake program id, * User data: amount of pool tokens to withdraw */ export function getWithdrawStakeWithSlippageInstruction< TAccountStakePool extends string, TAccountValidatorList extends string, TAccountWithdrawAuthority extends string, TAccountSourceStakeAccount extends string, TAccountDestinationStakeAccount extends string, TAccountNewWithdrawAuthority extends string, TAccountUserTransferAuthority extends string, TAccountUserPoolTokenAccount extends string, TAccountFeeAccount extends string, TAccountPoolMint extends string, TAccountClockSysvar extends string, TAccountTokenProgram extends string, TAccountStakeProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: WithdrawStakeWithSlippageInput< TAccountStakePool, TAccountValidatorList, TAccountWithdrawAuthority, TAccountSourceStakeAccount, TAccountDestinationStakeAccount, TAccountNewWithdrawAuthority, TAccountUserTransferAuthority, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountPoolMint, TAccountClockSysvar, TAccountTokenProgram, TAccountStakeProgram >, config?: { programAddress?: TProgramAddress }, ): WithdrawStakeWithSlippageInstruction< TProgramAddress, TAccountStakePool, TAccountValidatorList, TAccountWithdrawAuthority, TAccountSourceStakeAccount, TAccountDestinationStakeAccount, TAccountNewWithdrawAuthority, TAccountUserTransferAuthority, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountPoolMint, TAccountClockSysvar, 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 }, withdrawAuthority: { value: input.withdrawAuthority ?? null, isWritable: false, }, sourceStakeAccount: { value: input.sourceStakeAccount ?? null, isWritable: true, }, destinationStakeAccount: { value: input.destinationStakeAccount ?? null, isWritable: true, }, newWithdrawAuthority: { value: input.newWithdrawAuthority ?? null, isWritable: false, }, userTransferAuthority: { value: input.userTransferAuthority ?? null, isWritable: false, }, userPoolTokenAccount: { value: input.userPoolTokenAccount ?? null, isWritable: true, }, feeAccount: { value: input.feeAccount ?? null, isWritable: true }, poolMint: { value: input.poolMint ?? null, isWritable: true }, clockSysvar: { value: input.clockSysvar ?? 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.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("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("sourceStakeAccount", accounts.sourceStakeAccount), getAccountMeta( "destinationStakeAccount", accounts.destinationStakeAccount, ), getAccountMeta("newWithdrawAuthority", accounts.newWithdrawAuthority), getAccountMeta("userTransferAuthority", accounts.userTransferAuthority), getAccountMeta("userPoolTokenAccount", accounts.userPoolTokenAccount), getAccountMeta("feeAccount", accounts.feeAccount), getAccountMeta("poolMint", accounts.poolMint), getAccountMeta("clockSysvar", accounts.clockSysvar), getAccountMeta("tokenProgram", accounts.tokenProgram), getAccountMeta("stakeProgram", accounts.stakeProgram), ], data: getWithdrawStakeWithSlippageInstructionDataEncoder().encode( args as WithdrawStakeWithSlippageInstructionDataArgs, ), programAddress, } as WithdrawStakeWithSlippageInstruction< TProgramAddress, TAccountStakePool, TAccountValidatorList, TAccountWithdrawAuthority, TAccountSourceStakeAccount, TAccountDestinationStakeAccount, TAccountNewWithdrawAuthority, TAccountUserTransferAuthority, TAccountUserPoolTokenAccount, TAccountFeeAccount, TAccountPoolMint, TAccountClockSysvar, TAccountTokenProgram, TAccountStakeProgram >); } export type ParsedWithdrawStakeWithSlippageInstruction< TProgram extends string = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], > = { programAddress: Address; accounts: { stakePool: TAccountMetas[0]; validatorList: TAccountMetas[1]; withdrawAuthority: TAccountMetas[2]; sourceStakeAccount: TAccountMetas[3]; destinationStakeAccount: TAccountMetas[4]; newWithdrawAuthority: TAccountMetas[5]; userTransferAuthority: TAccountMetas[6]; userPoolTokenAccount: TAccountMetas[7]; feeAccount: TAccountMetas[8]; poolMint: TAccountMetas[9]; clockSysvar: TAccountMetas[10]; tokenProgram: TAccountMetas[11]; stakeProgram: TAccountMetas[12]; }; data: WithdrawStakeWithSlippageInstructionData; }; export function parseWithdrawStakeWithSlippageInstruction< TProgram extends string, TAccountMetas extends readonly AccountMeta[], >( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedWithdrawStakeWithSlippageInstruction { if (instruction.accounts.length < 13) { throw new SolanaError( SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { actualAccountMetas: instruction.accounts.length, expectedAccountMetas: 13, }, ); } 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(), withdrawAuthority: getNextAccount(), sourceStakeAccount: getNextAccount(), destinationStakeAccount: getNextAccount(), newWithdrawAuthority: getNextAccount(), userTransferAuthority: getNextAccount(), userPoolTokenAccount: getNextAccount(), feeAccount: getNextAccount(), poolMint: getNextAccount(), clockSysvar: getNextAccount(), tokenProgram: getNextAccount(), stakeProgram: getNextAccount(), }, data: getWithdrawStakeWithSlippageInstructionDataDecoder().decode( instruction.data, ), }; }