/** * 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 { addDecoderSizePrefix, addEncoderSizePrefix, combineCodec, getStructDecoder, getStructEncoder, getU32Decoder, getU32Encoder, getU8Decoder, getU8Encoder, getUtf8Decoder, getUtf8Encoder, SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, SolanaError, transformEncoder, type AccountMeta, type AccountSignerMeta, type Address, type Codec, type Decoder, type Encoder, 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 UPDATE_TOKEN_METADATA_DISCRIMINATOR = 18; export function getUpdateTokenMetadataDiscriminatorBytes(): ReadonlyUint8Array { return getU8Encoder().encode(UPDATE_TOKEN_METADATA_DISCRIMINATOR); } export type UpdateTokenMetadataInstruction< TProgram extends string = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, TAccountStakePool extends string | AccountMeta = string, TAccountManager extends string | AccountMeta = string, TAccountWithdrawAuthority extends string | AccountMeta = string, TAccountMetadataAccount extends string | AccountMeta = string, TAccountMetadataProgram extends string | AccountMeta = "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ TAccountStakePool extends string ? ReadonlyAccount : TAccountStakePool, TAccountManager extends string ? ReadonlySignerAccount & AccountSignerMeta : TAccountManager, TAccountWithdrawAuthority extends string ? ReadonlyAccount : TAccountWithdrawAuthority, TAccountMetadataAccount extends string ? WritableAccount : TAccountMetadataAccount, TAccountMetadataProgram extends string ? ReadonlyAccount : TAccountMetadataProgram, ...TRemainingAccounts, ] >; export type UpdateTokenMetadataInstructionData = { discriminator: number; name: string; symbol: string; uri: string; }; export type UpdateTokenMetadataInstructionDataArgs = { name: string; symbol: string; uri: string; }; export function getUpdateTokenMetadataInstructionDataEncoder(): Encoder { return transformEncoder( getStructEncoder([ ["discriminator", getU8Encoder()], ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], ["symbol", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], ["uri", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], ]), (value) => ({ ...value, discriminator: UPDATE_TOKEN_METADATA_DISCRIMINATOR, }), ); } export function getUpdateTokenMetadataInstructionDataDecoder(): Decoder { return getStructDecoder([ ["discriminator", getU8Decoder()], ["name", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], ["symbol", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], ["uri", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], ]); } export function getUpdateTokenMetadataInstructionDataCodec(): Codec< UpdateTokenMetadataInstructionDataArgs, UpdateTokenMetadataInstructionData > { return combineCodec( getUpdateTokenMetadataInstructionDataEncoder(), getUpdateTokenMetadataInstructionDataDecoder(), ); } export type UpdateTokenMetadataAsyncInput< TAccountStakePool extends string = string, TAccountManager extends string = string, TAccountWithdrawAuthority extends string = string, TAccountMetadataAccount extends string = string, TAccountMetadataProgram extends string = string, > = { stakePool: Address; manager: TransactionSigner; withdrawAuthority?: Address; metadataAccount: Address; metadataProgram?: Address; name: UpdateTokenMetadataInstructionDataArgs["name"]; symbol: UpdateTokenMetadataInstructionDataArgs["symbol"]; uri: UpdateTokenMetadataInstructionDataArgs["uri"]; }; /** * Update token metadata for the stake-pool token in the * metaplex-token program * 0. `[]` Stake pool * 1. `[s]` Manager * 2. `[]` Stake pool withdraw authority * 3. `[w]` Token metadata account * 4. `[]` Metadata program id */ export async function getUpdateTokenMetadataInstructionAsync< TAccountStakePool extends string, TAccountManager extends string, TAccountWithdrawAuthority extends string, TAccountMetadataAccount extends string, TAccountMetadataProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: UpdateTokenMetadataAsyncInput< TAccountStakePool, TAccountManager, TAccountWithdrawAuthority, TAccountMetadataAccount, TAccountMetadataProgram >, config?: { programAddress?: TProgramAddress }, ): Promise< UpdateTokenMetadataInstruction< TProgramAddress, TAccountStakePool, TAccountManager, TAccountWithdrawAuthority, TAccountMetadataAccount, TAccountMetadataProgram > > { // Program address. const programAddress = config?.programAddress ?? SPL_STAKE_POOL_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { stakePool: { value: input.stakePool ?? null, isWritable: false }, manager: { value: input.manager ?? null, isWritable: false }, withdrawAuthority: { value: input.withdrawAuthority ?? null, isWritable: false, }, metadataAccount: { value: input.metadataAccount ?? null, isWritable: true }, metadataProgram: { value: input.metadataProgram ?? 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.metadataProgram.value) { accounts.metadataProgram.value = "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" as Address<"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ accounts: [ getAccountMeta("stakePool", accounts.stakePool), getAccountMeta("manager", accounts.manager), getAccountMeta("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("metadataAccount", accounts.metadataAccount), getAccountMeta("metadataProgram", accounts.metadataProgram), ], data: getUpdateTokenMetadataInstructionDataEncoder().encode( args as UpdateTokenMetadataInstructionDataArgs, ), programAddress, } as UpdateTokenMetadataInstruction< TProgramAddress, TAccountStakePool, TAccountManager, TAccountWithdrawAuthority, TAccountMetadataAccount, TAccountMetadataProgram >); } export type UpdateTokenMetadataInput< TAccountStakePool extends string = string, TAccountManager extends string = string, TAccountWithdrawAuthority extends string = string, TAccountMetadataAccount extends string = string, TAccountMetadataProgram extends string = string, > = { stakePool: Address; manager: TransactionSigner; withdrawAuthority: Address; metadataAccount: Address; metadataProgram?: Address; name: UpdateTokenMetadataInstructionDataArgs["name"]; symbol: UpdateTokenMetadataInstructionDataArgs["symbol"]; uri: UpdateTokenMetadataInstructionDataArgs["uri"]; }; /** * Update token metadata for the stake-pool token in the * metaplex-token program * 0. `[]` Stake pool * 1. `[s]` Manager * 2. `[]` Stake pool withdraw authority * 3. `[w]` Token metadata account * 4. `[]` Metadata program id */ export function getUpdateTokenMetadataInstruction< TAccountStakePool extends string, TAccountManager extends string, TAccountWithdrawAuthority extends string, TAccountMetadataAccount extends string, TAccountMetadataProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: UpdateTokenMetadataInput< TAccountStakePool, TAccountManager, TAccountWithdrawAuthority, TAccountMetadataAccount, TAccountMetadataProgram >, config?: { programAddress?: TProgramAddress }, ): UpdateTokenMetadataInstruction< TProgramAddress, TAccountStakePool, TAccountManager, TAccountWithdrawAuthority, TAccountMetadataAccount, TAccountMetadataProgram > { // Program address. const programAddress = config?.programAddress ?? SPL_STAKE_POOL_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { stakePool: { value: input.stakePool ?? null, isWritable: false }, manager: { value: input.manager ?? null, isWritable: false }, withdrawAuthority: { value: input.withdrawAuthority ?? null, isWritable: false, }, metadataAccount: { value: input.metadataAccount ?? null, isWritable: true }, metadataProgram: { value: input.metadataProgram ?? null, isWritable: false, }, }; const accounts = originalAccounts as Record< keyof typeof originalAccounts, ResolvedInstructionAccount >; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.metadataProgram.value) { accounts.metadataProgram.value = "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" as Address<"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ accounts: [ getAccountMeta("stakePool", accounts.stakePool), getAccountMeta("manager", accounts.manager), getAccountMeta("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("metadataAccount", accounts.metadataAccount), getAccountMeta("metadataProgram", accounts.metadataProgram), ], data: getUpdateTokenMetadataInstructionDataEncoder().encode( args as UpdateTokenMetadataInstructionDataArgs, ), programAddress, } as UpdateTokenMetadataInstruction< TProgramAddress, TAccountStakePool, TAccountManager, TAccountWithdrawAuthority, TAccountMetadataAccount, TAccountMetadataProgram >); } export type ParsedUpdateTokenMetadataInstruction< TProgram extends string = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], > = { programAddress: Address; accounts: { stakePool: TAccountMetas[0]; manager: TAccountMetas[1]; withdrawAuthority: TAccountMetas[2]; metadataAccount: TAccountMetas[3]; metadataProgram: TAccountMetas[4]; }; data: UpdateTokenMetadataInstructionData; }; export function parseUpdateTokenMetadataInstruction< TProgram extends string, TAccountMetas extends readonly AccountMeta[], >( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedUpdateTokenMetadataInstruction { if (instruction.accounts.length < 5) { throw new SolanaError( SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { actualAccountMetas: instruction.accounts.length, expectedAccountMetas: 5, }, ); } let accountIndex = 0; const getNextAccount = () => { const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; accountIndex += 1; return accountMeta; }; return { programAddress: instruction.programAddress, accounts: { stakePool: getNextAccount(), manager: getNextAccount(), withdrawAuthority: getNextAccount(), metadataAccount: getNextAccount(), metadataProgram: getNextAccount(), }, data: getUpdateTokenMetadataInstructionDataDecoder().decode( instruction.data, ), }; }