/** * 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 REMOVE_VALIDATOR_FROM_POOL_DISCRIMINATOR = 2; export function getRemoveValidatorFromPoolDiscriminatorBytes(): ReadonlyUint8Array { return getU8Encoder().encode(REMOVE_VALIDATOR_FROM_POOL_DISCRIMINATOR); } export type RemoveValidatorFromPoolInstruction< TProgram extends string = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, TAccountStakePool extends string | AccountMeta = string, TAccountStaker extends string | AccountMeta = string, TAccountWithdrawAuthority extends string | AccountMeta = string, TAccountValidatorStakeList extends string | AccountMeta = string, TAccountStakeAccount extends string | AccountMeta = string, TAccountTransientStakeAccount extends string | AccountMeta = string, TAccountClockSysvar extends string | AccountMeta = "SysvarC1ock11111111111111111111111111111111", TAccountStakeProgram extends string | AccountMeta = "Stake11111111111111111111111111111111111111", TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ TAccountStakePool extends string ? WritableAccount : TAccountStakePool, TAccountStaker extends string ? ReadonlySignerAccount & AccountSignerMeta : TAccountStaker, TAccountWithdrawAuthority extends string ? ReadonlyAccount : TAccountWithdrawAuthority, TAccountValidatorStakeList extends string ? WritableAccount : TAccountValidatorStakeList, TAccountStakeAccount extends string ? WritableAccount : TAccountStakeAccount, TAccountTransientStakeAccount extends string ? WritableAccount : TAccountTransientStakeAccount, TAccountClockSysvar extends string ? ReadonlyAccount : TAccountClockSysvar, TAccountStakeProgram extends string ? ReadonlyAccount : TAccountStakeProgram, ...TRemainingAccounts, ] >; export type RemoveValidatorFromPoolInstructionData = { discriminator: number }; export type RemoveValidatorFromPoolInstructionDataArgs = {}; export function getRemoveValidatorFromPoolInstructionDataEncoder(): FixedSizeEncoder { return transformEncoder( getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ ...value, discriminator: REMOVE_VALIDATOR_FROM_POOL_DISCRIMINATOR, }), ); } export function getRemoveValidatorFromPoolInstructionDataDecoder(): FixedSizeDecoder { return getStructDecoder([["discriminator", getU8Decoder()]]); } export function getRemoveValidatorFromPoolInstructionDataCodec(): FixedSizeCodec< RemoveValidatorFromPoolInstructionDataArgs, RemoveValidatorFromPoolInstructionData > { return combineCodec( getRemoveValidatorFromPoolInstructionDataEncoder(), getRemoveValidatorFromPoolInstructionDataDecoder(), ); } export type RemoveValidatorFromPoolAsyncInput< TAccountStakePool extends string = string, TAccountStaker extends string = string, TAccountWithdrawAuthority extends string = string, TAccountValidatorStakeList extends string = string, TAccountStakeAccount extends string = string, TAccountTransientStakeAccount extends string = string, TAccountClockSysvar extends string = string, TAccountStakeProgram extends string = string, > = { /** Stake pool */ stakePool: Address; /** Staker */ staker: TransactionSigner; /** Stake pool withdraw authority */ withdrawAuthority?: Address; /** Validator stake list storage account */ validatorStakeList: Address; /** Stake account to remove from the pool */ stakeAccount: Address; /** Transient stake account, to deactivate if necessary */ transientStakeAccount: Address; /** Sysvar clock */ clockSysvar?: Address; /** Stake program id */ stakeProgram?: Address; }; /** * (Staker only) Removes validator from the pool, deactivating its stake * Only succeeds if the validator stake account has the minimum of * `max(crate::MINIMUM_ACTIVE_STAKE, * solana_program::stake::tools::get_minimum_delegation())`. plus the * rent-exempt amount. * 0. `[w]` Stake pool * 1. `[s]` Staker * 2. `[]` Stake pool withdraw authority * 3. `[w]` Validator stake list storage account * 4. `[w]` Stake account to remove from the pool * 5. `[w]` Transient stake account, to deactivate if necessary * 6. `[]` Sysvar clock * 7. `[]` Stake program id, */ export async function getRemoveValidatorFromPoolInstructionAsync< TAccountStakePool extends string, TAccountStaker extends string, TAccountWithdrawAuthority extends string, TAccountValidatorStakeList extends string, TAccountStakeAccount extends string, TAccountTransientStakeAccount extends string, TAccountClockSysvar extends string, TAccountStakeProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: RemoveValidatorFromPoolAsyncInput< TAccountStakePool, TAccountStaker, TAccountWithdrawAuthority, TAccountValidatorStakeList, TAccountStakeAccount, TAccountTransientStakeAccount, TAccountClockSysvar, TAccountStakeProgram >, config?: { programAddress?: TProgramAddress }, ): Promise< RemoveValidatorFromPoolInstruction< TProgramAddress, TAccountStakePool, TAccountStaker, TAccountWithdrawAuthority, TAccountValidatorStakeList, TAccountStakeAccount, TAccountTransientStakeAccount, TAccountClockSysvar, TAccountStakeProgram > > { // Program address. const programAddress = config?.programAddress ?? SPL_STAKE_POOL_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { stakePool: { value: input.stakePool ?? null, isWritable: true }, staker: { value: input.staker ?? null, isWritable: false }, withdrawAuthority: { value: input.withdrawAuthority ?? null, isWritable: false, }, validatorStakeList: { value: input.validatorStakeList ?? null, isWritable: true, }, stakeAccount: { value: input.stakeAccount ?? null, isWritable: true }, transientStakeAccount: { value: input.transientStakeAccount ?? null, isWritable: true, }, clockSysvar: { value: input.clockSysvar ?? 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.stakeProgram.value) { accounts.stakeProgram.value = "Stake11111111111111111111111111111111111111" as Address<"Stake11111111111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ accounts: [ getAccountMeta("stakePool", accounts.stakePool), getAccountMeta("staker", accounts.staker), getAccountMeta("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("validatorStakeList", accounts.validatorStakeList), getAccountMeta("stakeAccount", accounts.stakeAccount), getAccountMeta("transientStakeAccount", accounts.transientStakeAccount), getAccountMeta("clockSysvar", accounts.clockSysvar), getAccountMeta("stakeProgram", accounts.stakeProgram), ], data: getRemoveValidatorFromPoolInstructionDataEncoder().encode({}), programAddress, } as RemoveValidatorFromPoolInstruction< TProgramAddress, TAccountStakePool, TAccountStaker, TAccountWithdrawAuthority, TAccountValidatorStakeList, TAccountStakeAccount, TAccountTransientStakeAccount, TAccountClockSysvar, TAccountStakeProgram >); } export type RemoveValidatorFromPoolInput< TAccountStakePool extends string = string, TAccountStaker extends string = string, TAccountWithdrawAuthority extends string = string, TAccountValidatorStakeList extends string = string, TAccountStakeAccount extends string = string, TAccountTransientStakeAccount extends string = string, TAccountClockSysvar extends string = string, TAccountStakeProgram extends string = string, > = { /** Stake pool */ stakePool: Address; /** Staker */ staker: TransactionSigner; /** Stake pool withdraw authority */ withdrawAuthority: Address; /** Validator stake list storage account */ validatorStakeList: Address; /** Stake account to remove from the pool */ stakeAccount: Address; /** Transient stake account, to deactivate if necessary */ transientStakeAccount: Address; /** Sysvar clock */ clockSysvar?: Address; /** Stake program id */ stakeProgram?: Address; }; /** * (Staker only) Removes validator from the pool, deactivating its stake * Only succeeds if the validator stake account has the minimum of * `max(crate::MINIMUM_ACTIVE_STAKE, * solana_program::stake::tools::get_minimum_delegation())`. plus the * rent-exempt amount. * 0. `[w]` Stake pool * 1. `[s]` Staker * 2. `[]` Stake pool withdraw authority * 3. `[w]` Validator stake list storage account * 4. `[w]` Stake account to remove from the pool * 5. `[w]` Transient stake account, to deactivate if necessary * 6. `[]` Sysvar clock * 7. `[]` Stake program id, */ export function getRemoveValidatorFromPoolInstruction< TAccountStakePool extends string, TAccountStaker extends string, TAccountWithdrawAuthority extends string, TAccountValidatorStakeList extends string, TAccountStakeAccount extends string, TAccountTransientStakeAccount extends string, TAccountClockSysvar extends string, TAccountStakeProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: RemoveValidatorFromPoolInput< TAccountStakePool, TAccountStaker, TAccountWithdrawAuthority, TAccountValidatorStakeList, TAccountStakeAccount, TAccountTransientStakeAccount, TAccountClockSysvar, TAccountStakeProgram >, config?: { programAddress?: TProgramAddress }, ): RemoveValidatorFromPoolInstruction< TProgramAddress, TAccountStakePool, TAccountStaker, TAccountWithdrawAuthority, TAccountValidatorStakeList, TAccountStakeAccount, TAccountTransientStakeAccount, TAccountClockSysvar, TAccountStakeProgram > { // Program address. const programAddress = config?.programAddress ?? SPL_STAKE_POOL_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { stakePool: { value: input.stakePool ?? null, isWritable: true }, staker: { value: input.staker ?? null, isWritable: false }, withdrawAuthority: { value: input.withdrawAuthority ?? null, isWritable: false, }, validatorStakeList: { value: input.validatorStakeList ?? null, isWritable: true, }, stakeAccount: { value: input.stakeAccount ?? null, isWritable: true }, transientStakeAccount: { value: input.transientStakeAccount ?? null, isWritable: true, }, clockSysvar: { value: input.clockSysvar ?? 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.stakeProgram.value) { accounts.stakeProgram.value = "Stake11111111111111111111111111111111111111" as Address<"Stake11111111111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ accounts: [ getAccountMeta("stakePool", accounts.stakePool), getAccountMeta("staker", accounts.staker), getAccountMeta("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("validatorStakeList", accounts.validatorStakeList), getAccountMeta("stakeAccount", accounts.stakeAccount), getAccountMeta("transientStakeAccount", accounts.transientStakeAccount), getAccountMeta("clockSysvar", accounts.clockSysvar), getAccountMeta("stakeProgram", accounts.stakeProgram), ], data: getRemoveValidatorFromPoolInstructionDataEncoder().encode({}), programAddress, } as RemoveValidatorFromPoolInstruction< TProgramAddress, TAccountStakePool, TAccountStaker, TAccountWithdrawAuthority, TAccountValidatorStakeList, TAccountStakeAccount, TAccountTransientStakeAccount, TAccountClockSysvar, TAccountStakeProgram >); } export type ParsedRemoveValidatorFromPoolInstruction< TProgram extends string = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], > = { programAddress: Address; accounts: { /** Stake pool */ stakePool: TAccountMetas[0]; /** Staker */ staker: TAccountMetas[1]; /** Stake pool withdraw authority */ withdrawAuthority: TAccountMetas[2]; /** Validator stake list storage account */ validatorStakeList: TAccountMetas[3]; /** Stake account to remove from the pool */ stakeAccount: TAccountMetas[4]; /** Transient stake account, to deactivate if necessary */ transientStakeAccount: TAccountMetas[5]; /** Sysvar clock */ clockSysvar: TAccountMetas[6]; /** Stake program id */ stakeProgram: TAccountMetas[7]; }; data: RemoveValidatorFromPoolInstructionData; }; export function parseRemoveValidatorFromPoolInstruction< TProgram extends string, TAccountMetas extends readonly AccountMeta[], >( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedRemoveValidatorFromPoolInstruction { if (instruction.accounts.length < 8) { throw new SolanaError( SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { actualAccountMetas: instruction.accounts.length, expectedAccountMetas: 8, }, ); } let accountIndex = 0; const getNextAccount = () => { const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; accountIndex += 1; return accountMeta; }; return { programAddress: instruction.programAddress, accounts: { stakePool: getNextAccount(), staker: getNextAccount(), withdrawAuthority: getNextAccount(), validatorStakeList: getNextAccount(), stakeAccount: getNextAccount(), transientStakeAccount: getNextAccount(), clockSysvar: getNextAccount(), stakeProgram: getNextAccount(), }, data: getRemoveValidatorFromPoolInstructionDataDecoder().decode( instruction.data, ), }; }