/** * 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, getU32Decoder, getU32Encoder, 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 ADD_VALIDATOR_TO_POOL_DISCRIMINATOR = 1; export function getAddValidatorToPoolDiscriminatorBytes(): ReadonlyUint8Array { return getU8Encoder().encode(ADD_VALIDATOR_TO_POOL_DISCRIMINATOR); } export type AddValidatorToPoolInstruction< TProgram extends string = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, TAccountStakePool extends string | AccountMeta = string, TAccountStaker extends string | AccountMeta = string, TAccountReserveStakeAccount extends string | AccountMeta = string, TAccountWithdrawAuthority extends string | AccountMeta = string, TAccountValidatorStakeList extends string | AccountMeta = string, TAccountNewStakeAccount extends string | AccountMeta = string, TAccountValidatorVoteAccount extends string | AccountMeta = string, TAccountRentSysvar extends string | AccountMeta = "SysvarRent111111111111111111111111111111111", TAccountClockSysvar extends string | AccountMeta = "SysvarC1ock11111111111111111111111111111111", TAccountStakeHistorySysvar extends string | AccountMeta = "SysvarStakeHistory1111111111111111111111111", TAccountStakeConfigSysvar extends string | AccountMeta = "StakeConfig11111111111111111111111111111111", TAccountSystemProgram extends string | AccountMeta = "11111111111111111111111111111111", TAccountStakeProgram extends string | AccountMeta = "Stake11111111111111111111111111111111111111", TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ TAccountStakePool extends string ? WritableAccount : TAccountStakePool, TAccountStaker extends string ? ReadonlySignerAccount & AccountSignerMeta : TAccountStaker, TAccountReserveStakeAccount extends string ? WritableAccount : TAccountReserveStakeAccount, TAccountWithdrawAuthority extends string ? ReadonlyAccount : TAccountWithdrawAuthority, TAccountValidatorStakeList extends string ? WritableAccount : TAccountValidatorStakeList, TAccountNewStakeAccount extends string ? WritableAccount : TAccountNewStakeAccount, TAccountValidatorVoteAccount extends string ? ReadonlyAccount : TAccountValidatorVoteAccount, TAccountRentSysvar extends string ? ReadonlyAccount : TAccountRentSysvar, TAccountClockSysvar extends string ? ReadonlyAccount : TAccountClockSysvar, TAccountStakeHistorySysvar extends string ? ReadonlyAccount : TAccountStakeHistorySysvar, TAccountStakeConfigSysvar extends string ? ReadonlyAccount : TAccountStakeConfigSysvar, TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, TAccountStakeProgram extends string ? ReadonlyAccount : TAccountStakeProgram, ...TRemainingAccounts, ] >; export type AddValidatorToPoolInstructionData = { discriminator: number; args: number; }; export type AddValidatorToPoolInstructionDataArgs = { args: number }; export function getAddValidatorToPoolInstructionDataEncoder(): FixedSizeEncoder { return transformEncoder( getStructEncoder([ ["discriminator", getU8Encoder()], ["args", getU32Encoder()], ]), (value) => ({ ...value, discriminator: ADD_VALIDATOR_TO_POOL_DISCRIMINATOR, }), ); } export function getAddValidatorToPoolInstructionDataDecoder(): FixedSizeDecoder { return getStructDecoder([ ["discriminator", getU8Decoder()], ["args", getU32Decoder()], ]); } export function getAddValidatorToPoolInstructionDataCodec(): FixedSizeCodec< AddValidatorToPoolInstructionDataArgs, AddValidatorToPoolInstructionData > { return combineCodec( getAddValidatorToPoolInstructionDataEncoder(), getAddValidatorToPoolInstructionDataDecoder(), ); } export type AddValidatorToPoolAsyncInput< TAccountStakePool extends string = string, TAccountStaker extends string = string, TAccountReserveStakeAccount extends string = string, TAccountWithdrawAuthority extends string = string, TAccountValidatorStakeList extends string = string, TAccountNewStakeAccount extends string = string, TAccountValidatorVoteAccount extends string = string, TAccountRentSysvar extends string = string, TAccountClockSysvar extends string = string, TAccountStakeHistorySysvar extends string = string, TAccountStakeConfigSysvar extends string = string, TAccountSystemProgram extends string = string, TAccountStakeProgram extends string = string, > = { /** Stake pool */ stakePool: Address; /** Staker */ staker: TransactionSigner; /** Reserve stake account */ reserveStakeAccount: Address; /** Stake pool withdraw authority */ withdrawAuthority?: Address; /** Validator stake list storage account */ validatorStakeList: Address; /** Stake account to add to the pool */ newStakeAccount: Address; /** Validator this stake account will be delegated to */ validatorVoteAccount: Address; /** Rent sysvar */ rentSysvar?: Address; /** Clock sysvar */ clockSysvar?: Address; /** Stake history sysvar */ stakeHistorySysvar?: Address; /** Stake config sysvar */ stakeConfigSysvar?: Address; /** System program */ systemProgram?: Address; /** Stake program */ stakeProgram?: Address; args: AddValidatorToPoolInstructionDataArgs["args"]; }; /** * (Staker only) Adds stake account delegated to validator to the pool's * list of managed validators. * The stake account will have the rent-exempt amount plus * `max( * crate::MINIMUM_ACTIVE_STAKE, * solana_program::stake::tools::get_minimum_delegation() * )`. * It is funded from the stake pool reserve. * 0. `[w]` Stake pool * 1. `[s]` Staker * 2. `[w]` Reserve stake account * 3. `[]` Stake pool withdraw authority * 4. `[w]` Validator stake list storage account * 5. `[w]` Stake account to add to the pool * 6. `[]` Validator this stake account will be delegated to * 7. `[]` Rent sysvar * 8. `[]` Clock sysvar * 9. '[]' Stake history sysvar * 10. '[]' Stake config sysvar * 11. `[]` System program * 12. `[]` Stake program * User data: optional non-zero `u32` seed used for generating the * validator stake address */ export async function getAddValidatorToPoolInstructionAsync< TAccountStakePool extends string, TAccountStaker extends string, TAccountReserveStakeAccount extends string, TAccountWithdrawAuthority extends string, TAccountValidatorStakeList extends string, TAccountNewStakeAccount extends string, TAccountValidatorVoteAccount extends string, TAccountRentSysvar extends string, TAccountClockSysvar extends string, TAccountStakeHistorySysvar extends string, TAccountStakeConfigSysvar extends string, TAccountSystemProgram extends string, TAccountStakeProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: AddValidatorToPoolAsyncInput< TAccountStakePool, TAccountStaker, TAccountReserveStakeAccount, TAccountWithdrawAuthority, TAccountValidatorStakeList, TAccountNewStakeAccount, TAccountValidatorVoteAccount, TAccountRentSysvar, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountStakeConfigSysvar, TAccountSystemProgram, TAccountStakeProgram >, config?: { programAddress?: TProgramAddress }, ): Promise< AddValidatorToPoolInstruction< TProgramAddress, TAccountStakePool, TAccountStaker, TAccountReserveStakeAccount, TAccountWithdrawAuthority, TAccountValidatorStakeList, TAccountNewStakeAccount, TAccountValidatorVoteAccount, TAccountRentSysvar, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountStakeConfigSysvar, TAccountSystemProgram, 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 }, reserveStakeAccount: { value: input.reserveStakeAccount ?? null, isWritable: true, }, withdrawAuthority: { value: input.withdrawAuthority ?? null, isWritable: false, }, validatorStakeList: { value: input.validatorStakeList ?? null, isWritable: true, }, newStakeAccount: { value: input.newStakeAccount ?? null, isWritable: true }, validatorVoteAccount: { value: input.validatorVoteAccount ?? null, isWritable: false, }, rentSysvar: { value: input.rentSysvar ?? null, isWritable: false }, clockSysvar: { value: input.clockSysvar ?? null, isWritable: false }, stakeHistorySysvar: { value: input.stakeHistorySysvar ?? null, isWritable: false, }, stakeConfigSysvar: { value: input.stakeConfigSysvar ?? null, isWritable: false, }, systemProgram: { value: input.systemProgram ?? 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.rentSysvar.value) { accounts.rentSysvar.value = "SysvarRent111111111111111111111111111111111" as Address<"SysvarRent111111111111111111111111111111111">; } if (!accounts.clockSysvar.value) { accounts.clockSysvar.value = "SysvarC1ock11111111111111111111111111111111" as Address<"SysvarC1ock11111111111111111111111111111111">; } if (!accounts.stakeHistorySysvar.value) { accounts.stakeHistorySysvar.value = "SysvarStakeHistory1111111111111111111111111" as Address<"SysvarStakeHistory1111111111111111111111111">; } if (!accounts.stakeConfigSysvar.value) { accounts.stakeConfigSysvar.value = "StakeConfig11111111111111111111111111111111" as Address<"StakeConfig11111111111111111111111111111111">; } if (!accounts.systemProgram.value) { accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } 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("reserveStakeAccount", accounts.reserveStakeAccount), getAccountMeta("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("validatorStakeList", accounts.validatorStakeList), getAccountMeta("newStakeAccount", accounts.newStakeAccount), getAccountMeta("validatorVoteAccount", accounts.validatorVoteAccount), getAccountMeta("rentSysvar", accounts.rentSysvar), getAccountMeta("clockSysvar", accounts.clockSysvar), getAccountMeta("stakeHistorySysvar", accounts.stakeHistorySysvar), getAccountMeta("stakeConfigSysvar", accounts.stakeConfigSysvar), getAccountMeta("systemProgram", accounts.systemProgram), getAccountMeta("stakeProgram", accounts.stakeProgram), ], data: getAddValidatorToPoolInstructionDataEncoder().encode( args as AddValidatorToPoolInstructionDataArgs, ), programAddress, } as AddValidatorToPoolInstruction< TProgramAddress, TAccountStakePool, TAccountStaker, TAccountReserveStakeAccount, TAccountWithdrawAuthority, TAccountValidatorStakeList, TAccountNewStakeAccount, TAccountValidatorVoteAccount, TAccountRentSysvar, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountStakeConfigSysvar, TAccountSystemProgram, TAccountStakeProgram >); } export type AddValidatorToPoolInput< TAccountStakePool extends string = string, TAccountStaker extends string = string, TAccountReserveStakeAccount extends string = string, TAccountWithdrawAuthority extends string = string, TAccountValidatorStakeList extends string = string, TAccountNewStakeAccount extends string = string, TAccountValidatorVoteAccount extends string = string, TAccountRentSysvar extends string = string, TAccountClockSysvar extends string = string, TAccountStakeHistorySysvar extends string = string, TAccountStakeConfigSysvar extends string = string, TAccountSystemProgram extends string = string, TAccountStakeProgram extends string = string, > = { /** Stake pool */ stakePool: Address; /** Staker */ staker: TransactionSigner; /** Reserve stake account */ reserveStakeAccount: Address; /** Stake pool withdraw authority */ withdrawAuthority: Address; /** Validator stake list storage account */ validatorStakeList: Address; /** Stake account to add to the pool */ newStakeAccount: Address; /** Validator this stake account will be delegated to */ validatorVoteAccount: Address; /** Rent sysvar */ rentSysvar?: Address; /** Clock sysvar */ clockSysvar?: Address; /** Stake history sysvar */ stakeHistorySysvar?: Address; /** Stake config sysvar */ stakeConfigSysvar?: Address; /** System program */ systemProgram?: Address; /** Stake program */ stakeProgram?: Address; args: AddValidatorToPoolInstructionDataArgs["args"]; }; /** * (Staker only) Adds stake account delegated to validator to the pool's * list of managed validators. * The stake account will have the rent-exempt amount plus * `max( * crate::MINIMUM_ACTIVE_STAKE, * solana_program::stake::tools::get_minimum_delegation() * )`. * It is funded from the stake pool reserve. * 0. `[w]` Stake pool * 1. `[s]` Staker * 2. `[w]` Reserve stake account * 3. `[]` Stake pool withdraw authority * 4. `[w]` Validator stake list storage account * 5. `[w]` Stake account to add to the pool * 6. `[]` Validator this stake account will be delegated to * 7. `[]` Rent sysvar * 8. `[]` Clock sysvar * 9. '[]' Stake history sysvar * 10. '[]' Stake config sysvar * 11. `[]` System program * 12. `[]` Stake program * User data: optional non-zero `u32` seed used for generating the * validator stake address */ export function getAddValidatorToPoolInstruction< TAccountStakePool extends string, TAccountStaker extends string, TAccountReserveStakeAccount extends string, TAccountWithdrawAuthority extends string, TAccountValidatorStakeList extends string, TAccountNewStakeAccount extends string, TAccountValidatorVoteAccount extends string, TAccountRentSysvar extends string, TAccountClockSysvar extends string, TAccountStakeHistorySysvar extends string, TAccountStakeConfigSysvar extends string, TAccountSystemProgram extends string, TAccountStakeProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: AddValidatorToPoolInput< TAccountStakePool, TAccountStaker, TAccountReserveStakeAccount, TAccountWithdrawAuthority, TAccountValidatorStakeList, TAccountNewStakeAccount, TAccountValidatorVoteAccount, TAccountRentSysvar, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountStakeConfigSysvar, TAccountSystemProgram, TAccountStakeProgram >, config?: { programAddress?: TProgramAddress }, ): AddValidatorToPoolInstruction< TProgramAddress, TAccountStakePool, TAccountStaker, TAccountReserveStakeAccount, TAccountWithdrawAuthority, TAccountValidatorStakeList, TAccountNewStakeAccount, TAccountValidatorVoteAccount, TAccountRentSysvar, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountStakeConfigSysvar, TAccountSystemProgram, 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 }, reserveStakeAccount: { value: input.reserveStakeAccount ?? null, isWritable: true, }, withdrawAuthority: { value: input.withdrawAuthority ?? null, isWritable: false, }, validatorStakeList: { value: input.validatorStakeList ?? null, isWritable: true, }, newStakeAccount: { value: input.newStakeAccount ?? null, isWritable: true }, validatorVoteAccount: { value: input.validatorVoteAccount ?? null, isWritable: false, }, rentSysvar: { value: input.rentSysvar ?? null, isWritable: false }, clockSysvar: { value: input.clockSysvar ?? null, isWritable: false }, stakeHistorySysvar: { value: input.stakeHistorySysvar ?? null, isWritable: false, }, stakeConfigSysvar: { value: input.stakeConfigSysvar ?? null, isWritable: false, }, systemProgram: { value: input.systemProgram ?? 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.rentSysvar.value) { accounts.rentSysvar.value = "SysvarRent111111111111111111111111111111111" as Address<"SysvarRent111111111111111111111111111111111">; } if (!accounts.clockSysvar.value) { accounts.clockSysvar.value = "SysvarC1ock11111111111111111111111111111111" as Address<"SysvarC1ock11111111111111111111111111111111">; } if (!accounts.stakeHistorySysvar.value) { accounts.stakeHistorySysvar.value = "SysvarStakeHistory1111111111111111111111111" as Address<"SysvarStakeHistory1111111111111111111111111">; } if (!accounts.stakeConfigSysvar.value) { accounts.stakeConfigSysvar.value = "StakeConfig11111111111111111111111111111111" as Address<"StakeConfig11111111111111111111111111111111">; } if (!accounts.systemProgram.value) { accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } 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("reserveStakeAccount", accounts.reserveStakeAccount), getAccountMeta("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("validatorStakeList", accounts.validatorStakeList), getAccountMeta("newStakeAccount", accounts.newStakeAccount), getAccountMeta("validatorVoteAccount", accounts.validatorVoteAccount), getAccountMeta("rentSysvar", accounts.rentSysvar), getAccountMeta("clockSysvar", accounts.clockSysvar), getAccountMeta("stakeHistorySysvar", accounts.stakeHistorySysvar), getAccountMeta("stakeConfigSysvar", accounts.stakeConfigSysvar), getAccountMeta("systemProgram", accounts.systemProgram), getAccountMeta("stakeProgram", accounts.stakeProgram), ], data: getAddValidatorToPoolInstructionDataEncoder().encode( args as AddValidatorToPoolInstructionDataArgs, ), programAddress, } as AddValidatorToPoolInstruction< TProgramAddress, TAccountStakePool, TAccountStaker, TAccountReserveStakeAccount, TAccountWithdrawAuthority, TAccountValidatorStakeList, TAccountNewStakeAccount, TAccountValidatorVoteAccount, TAccountRentSysvar, TAccountClockSysvar, TAccountStakeHistorySysvar, TAccountStakeConfigSysvar, TAccountSystemProgram, TAccountStakeProgram >); } export type ParsedAddValidatorToPoolInstruction< 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]; /** Reserve stake account */ reserveStakeAccount: TAccountMetas[2]; /** Stake pool withdraw authority */ withdrawAuthority: TAccountMetas[3]; /** Validator stake list storage account */ validatorStakeList: TAccountMetas[4]; /** Stake account to add to the pool */ newStakeAccount: TAccountMetas[5]; /** Validator this stake account will be delegated to */ validatorVoteAccount: TAccountMetas[6]; /** Rent sysvar */ rentSysvar: TAccountMetas[7]; /** Clock sysvar */ clockSysvar: TAccountMetas[8]; /** Stake history sysvar */ stakeHistorySysvar: TAccountMetas[9]; /** Stake config sysvar */ stakeConfigSysvar: TAccountMetas[10]; /** System program */ systemProgram: TAccountMetas[11]; /** Stake program */ stakeProgram: TAccountMetas[12]; }; data: AddValidatorToPoolInstructionData; }; export function parseAddValidatorToPoolInstruction< TProgram extends string, TAccountMetas extends readonly AccountMeta[], >( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedAddValidatorToPoolInstruction { 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(), staker: getNextAccount(), reserveStakeAccount: getNextAccount(), withdrawAuthority: getNextAccount(), validatorStakeList: getNextAccount(), newStakeAccount: getNextAccount(), validatorVoteAccount: getNextAccount(), rentSysvar: getNextAccount(), clockSysvar: getNextAccount(), stakeHistorySysvar: getNextAccount(), stakeConfigSysvar: getNextAccount(), systemProgram: getNextAccount(), stakeProgram: getNextAccount(), }, data: getAddValidatorToPoolInstructionDataDecoder().decode( instruction.data, ), }; }