/** * 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 DECREASE_VALIDATOR_STAKE_DISCRIMINATOR = 3; export function getDecreaseValidatorStakeDiscriminatorBytes(): ReadonlyUint8Array { return getU8Encoder().encode(DECREASE_VALIDATOR_STAKE_DISCRIMINATOR); } export type DecreaseValidatorStakeInstruction< TProgram extends string = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, TAccountStakePool extends string | AccountMeta = string, TAccountStaker extends string | AccountMeta = string, TAccountWithdrawAuthority extends string | AccountMeta = string, TAccountValidatorList extends string | AccountMeta = string, TAccountStakeAccount extends string | AccountMeta = string, TAccountTransientStakeAccount extends string | AccountMeta = string, TAccountClockSysvar extends string | AccountMeta = "SysvarC1ock11111111111111111111111111111111", TAccountRentSysvar extends string | AccountMeta = "SysvarRent111111111111111111111111111111111", TAccountSystemProgram extends string | AccountMeta = "11111111111111111111111111111111", TAccountStakeProgram extends string | AccountMeta = "Stake11111111111111111111111111111111111111", TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ TAccountStakePool extends string ? ReadonlyAccount : TAccountStakePool, TAccountStaker extends string ? ReadonlySignerAccount & AccountSignerMeta : TAccountStaker, TAccountWithdrawAuthority extends string ? ReadonlyAccount : TAccountWithdrawAuthority, TAccountValidatorList extends string ? WritableAccount : TAccountValidatorList, TAccountStakeAccount extends string ? WritableAccount : TAccountStakeAccount, TAccountTransientStakeAccount extends string ? WritableAccount : TAccountTransientStakeAccount, TAccountClockSysvar extends string ? ReadonlyAccount : TAccountClockSysvar, TAccountRentSysvar extends string ? ReadonlyAccount : TAccountRentSysvar, TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, TAccountStakeProgram extends string ? ReadonlyAccount : TAccountStakeProgram, ...TRemainingAccounts, ] >; export type DecreaseValidatorStakeInstructionData = { discriminator: number; lamports: bigint; transientStakeSeed: bigint; }; export type DecreaseValidatorStakeInstructionDataArgs = { lamports: number | bigint; transientStakeSeed: number | bigint; }; export function getDecreaseValidatorStakeInstructionDataEncoder(): FixedSizeEncoder { return transformEncoder( getStructEncoder([ ["discriminator", getU8Encoder()], ["lamports", getU64Encoder()], ["transientStakeSeed", getU64Encoder()], ]), (value) => ({ ...value, discriminator: DECREASE_VALIDATOR_STAKE_DISCRIMINATOR, }), ); } export function getDecreaseValidatorStakeInstructionDataDecoder(): FixedSizeDecoder { return getStructDecoder([ ["discriminator", getU8Decoder()], ["lamports", getU64Decoder()], ["transientStakeSeed", getU64Decoder()], ]); } export function getDecreaseValidatorStakeInstructionDataCodec(): FixedSizeCodec< DecreaseValidatorStakeInstructionDataArgs, DecreaseValidatorStakeInstructionData > { return combineCodec( getDecreaseValidatorStakeInstructionDataEncoder(), getDecreaseValidatorStakeInstructionDataDecoder(), ); } export type DecreaseValidatorStakeAsyncInput< TAccountStakePool extends string = string, TAccountStaker extends string = string, TAccountWithdrawAuthority extends string = string, TAccountValidatorList extends string = string, TAccountStakeAccount extends string = string, TAccountTransientStakeAccount extends string = string, TAccountClockSysvar extends string = string, TAccountRentSysvar extends string = string, TAccountSystemProgram extends string = string, TAccountStakeProgram extends string = string, > = { stakePool: Address; staker: TransactionSigner; withdrawAuthority?: Address; validatorList: Address; stakeAccount: Address; transientStakeAccount: Address; clockSysvar?: Address; rentSysvar?: Address; systemProgram?: Address; stakeProgram?: Address; lamports: DecreaseValidatorStakeInstructionDataArgs["lamports"]; transientStakeSeed: DecreaseValidatorStakeInstructionDataArgs["transientStakeSeed"]; }; /** * NOTE: This instruction has been deprecated since version 0.7.0. Please * use `DecreaseValidatorStakeWithReserve` instead. * (Staker only) Decrease active stake on a validator, eventually moving it * to the reserve * Internally, this instruction splits a validator stake account into its * corresponding transient stake account and deactivates it. * In order to rebalance the pool without taking custody, the staker needs * a way of reducing the stake on a stake account. This instruction splits * some amount of stake, up to the total activated stake, from the * canonical validator stake account, into its "transient" stake * account. * The instruction only succeeds if the transient stake account does not * exist. The amount of lamports to move must be at least rent-exemption * plus `max(crate::MINIMUM_ACTIVE_STAKE, * solana_program::stake::tools::get_minimum_delegation())`. * 0. `[]` Stake pool * 1. `[s]` Stake pool staker * 2. `[]` Stake pool withdraw authority * 3. `[w]` Validator list * 4. `[w]` Canonical stake account to split from * 5. `[w]` Transient stake account to receive split * 6. `[]` Clock sysvar * 7. `[]` Rent sysvar * 8. `[]` System program * 9. `[]` Stake program */ export async function getDecreaseValidatorStakeInstructionAsync< TAccountStakePool extends string, TAccountStaker extends string, TAccountWithdrawAuthority extends string, TAccountValidatorList extends string, TAccountStakeAccount extends string, TAccountTransientStakeAccount extends string, TAccountClockSysvar extends string, TAccountRentSysvar extends string, TAccountSystemProgram extends string, TAccountStakeProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: DecreaseValidatorStakeAsyncInput< TAccountStakePool, TAccountStaker, TAccountWithdrawAuthority, TAccountValidatorList, TAccountStakeAccount, TAccountTransientStakeAccount, TAccountClockSysvar, TAccountRentSysvar, TAccountSystemProgram, TAccountStakeProgram >, config?: { programAddress?: TProgramAddress }, ): Promise< DecreaseValidatorStakeInstruction< TProgramAddress, TAccountStakePool, TAccountStaker, TAccountWithdrawAuthority, TAccountValidatorList, TAccountStakeAccount, TAccountTransientStakeAccount, TAccountClockSysvar, TAccountRentSysvar, TAccountSystemProgram, TAccountStakeProgram > > { // Program address. const programAddress = config?.programAddress ?? SPL_STAKE_POOL_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { stakePool: { value: input.stakePool ?? null, isWritable: false }, staker: { value: input.staker ?? null, isWritable: false }, withdrawAuthority: { value: input.withdrawAuthority ?? null, isWritable: false, }, validatorList: { value: input.validatorList ?? null, isWritable: true }, stakeAccount: { value: input.stakeAccount ?? null, isWritable: true }, transientStakeAccount: { value: input.transientStakeAccount ?? null, isWritable: true, }, clockSysvar: { value: input.clockSysvar ?? null, isWritable: false }, rentSysvar: { value: input.rentSysvar ?? 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.clockSysvar.value) { accounts.clockSysvar.value = "SysvarC1ock11111111111111111111111111111111" as Address<"SysvarC1ock11111111111111111111111111111111">; } if (!accounts.rentSysvar.value) { accounts.rentSysvar.value = "SysvarRent111111111111111111111111111111111" as Address<"SysvarRent111111111111111111111111111111111">; } 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("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("validatorList", accounts.validatorList), getAccountMeta("stakeAccount", accounts.stakeAccount), getAccountMeta("transientStakeAccount", accounts.transientStakeAccount), getAccountMeta("clockSysvar", accounts.clockSysvar), getAccountMeta("rentSysvar", accounts.rentSysvar), getAccountMeta("systemProgram", accounts.systemProgram), getAccountMeta("stakeProgram", accounts.stakeProgram), ], data: getDecreaseValidatorStakeInstructionDataEncoder().encode( args as DecreaseValidatorStakeInstructionDataArgs, ), programAddress, } as DecreaseValidatorStakeInstruction< TProgramAddress, TAccountStakePool, TAccountStaker, TAccountWithdrawAuthority, TAccountValidatorList, TAccountStakeAccount, TAccountTransientStakeAccount, TAccountClockSysvar, TAccountRentSysvar, TAccountSystemProgram, TAccountStakeProgram >); } export type DecreaseValidatorStakeInput< TAccountStakePool extends string = string, TAccountStaker extends string = string, TAccountWithdrawAuthority extends string = string, TAccountValidatorList extends string = string, TAccountStakeAccount extends string = string, TAccountTransientStakeAccount extends string = string, TAccountClockSysvar extends string = string, TAccountRentSysvar extends string = string, TAccountSystemProgram extends string = string, TAccountStakeProgram extends string = string, > = { stakePool: Address; staker: TransactionSigner; withdrawAuthority: Address; validatorList: Address; stakeAccount: Address; transientStakeAccount: Address; clockSysvar?: Address; rentSysvar?: Address; systemProgram?: Address; stakeProgram?: Address; lamports: DecreaseValidatorStakeInstructionDataArgs["lamports"]; transientStakeSeed: DecreaseValidatorStakeInstructionDataArgs["transientStakeSeed"]; }; /** * NOTE: This instruction has been deprecated since version 0.7.0. Please * use `DecreaseValidatorStakeWithReserve` instead. * (Staker only) Decrease active stake on a validator, eventually moving it * to the reserve * Internally, this instruction splits a validator stake account into its * corresponding transient stake account and deactivates it. * In order to rebalance the pool without taking custody, the staker needs * a way of reducing the stake on a stake account. This instruction splits * some amount of stake, up to the total activated stake, from the * canonical validator stake account, into its "transient" stake * account. * The instruction only succeeds if the transient stake account does not * exist. The amount of lamports to move must be at least rent-exemption * plus `max(crate::MINIMUM_ACTIVE_STAKE, * solana_program::stake::tools::get_minimum_delegation())`. * 0. `[]` Stake pool * 1. `[s]` Stake pool staker * 2. `[]` Stake pool withdraw authority * 3. `[w]` Validator list * 4. `[w]` Canonical stake account to split from * 5. `[w]` Transient stake account to receive split * 6. `[]` Clock sysvar * 7. `[]` Rent sysvar * 8. `[]` System program * 9. `[]` Stake program */ export function getDecreaseValidatorStakeInstruction< TAccountStakePool extends string, TAccountStaker extends string, TAccountWithdrawAuthority extends string, TAccountValidatorList extends string, TAccountStakeAccount extends string, TAccountTransientStakeAccount extends string, TAccountClockSysvar extends string, TAccountRentSysvar extends string, TAccountSystemProgram extends string, TAccountStakeProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: DecreaseValidatorStakeInput< TAccountStakePool, TAccountStaker, TAccountWithdrawAuthority, TAccountValidatorList, TAccountStakeAccount, TAccountTransientStakeAccount, TAccountClockSysvar, TAccountRentSysvar, TAccountSystemProgram, TAccountStakeProgram >, config?: { programAddress?: TProgramAddress }, ): DecreaseValidatorStakeInstruction< TProgramAddress, TAccountStakePool, TAccountStaker, TAccountWithdrawAuthority, TAccountValidatorList, TAccountStakeAccount, TAccountTransientStakeAccount, TAccountClockSysvar, TAccountRentSysvar, TAccountSystemProgram, TAccountStakeProgram > { // Program address. const programAddress = config?.programAddress ?? SPL_STAKE_POOL_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { stakePool: { value: input.stakePool ?? null, isWritable: false }, staker: { value: input.staker ?? null, isWritable: false }, withdrawAuthority: { value: input.withdrawAuthority ?? null, isWritable: false, }, validatorList: { value: input.validatorList ?? null, isWritable: true }, stakeAccount: { value: input.stakeAccount ?? null, isWritable: true }, transientStakeAccount: { value: input.transientStakeAccount ?? null, isWritable: true, }, clockSysvar: { value: input.clockSysvar ?? null, isWritable: false }, rentSysvar: { value: input.rentSysvar ?? 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.clockSysvar.value) { accounts.clockSysvar.value = "SysvarC1ock11111111111111111111111111111111" as Address<"SysvarC1ock11111111111111111111111111111111">; } if (!accounts.rentSysvar.value) { accounts.rentSysvar.value = "SysvarRent111111111111111111111111111111111" as Address<"SysvarRent111111111111111111111111111111111">; } 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("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("validatorList", accounts.validatorList), getAccountMeta("stakeAccount", accounts.stakeAccount), getAccountMeta("transientStakeAccount", accounts.transientStakeAccount), getAccountMeta("clockSysvar", accounts.clockSysvar), getAccountMeta("rentSysvar", accounts.rentSysvar), getAccountMeta("systemProgram", accounts.systemProgram), getAccountMeta("stakeProgram", accounts.stakeProgram), ], data: getDecreaseValidatorStakeInstructionDataEncoder().encode( args as DecreaseValidatorStakeInstructionDataArgs, ), programAddress, } as DecreaseValidatorStakeInstruction< TProgramAddress, TAccountStakePool, TAccountStaker, TAccountWithdrawAuthority, TAccountValidatorList, TAccountStakeAccount, TAccountTransientStakeAccount, TAccountClockSysvar, TAccountRentSysvar, TAccountSystemProgram, TAccountStakeProgram >); } export type ParsedDecreaseValidatorStakeInstruction< TProgram extends string = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], > = { programAddress: Address; accounts: { stakePool: TAccountMetas[0]; staker: TAccountMetas[1]; withdrawAuthority: TAccountMetas[2]; validatorList: TAccountMetas[3]; stakeAccount: TAccountMetas[4]; transientStakeAccount: TAccountMetas[5]; clockSysvar: TAccountMetas[6]; rentSysvar: TAccountMetas[7]; systemProgram: TAccountMetas[8]; stakeProgram: TAccountMetas[9]; }; data: DecreaseValidatorStakeInstructionData; }; export function parseDecreaseValidatorStakeInstruction< TProgram extends string, TAccountMetas extends readonly AccountMeta[], >( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedDecreaseValidatorStakeInstruction { if (instruction.accounts.length < 10) { throw new SolanaError( SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { actualAccountMetas: instruction.accounts.length, expectedAccountMetas: 10, }, ); } 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(), validatorList: getNextAccount(), stakeAccount: getNextAccount(), transientStakeAccount: getNextAccount(), clockSysvar: getNextAccount(), rentSysvar: getNextAccount(), systemProgram: getNextAccount(), stakeProgram: getNextAccount(), }, data: getDecreaseValidatorStakeInstructionDataDecoder().decode( instruction.data, ), }; }