/** * 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, type WritableSignerAccount, } 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 CREATE_TOKEN_METADATA_DISCRIMINATOR = 17; export function getCreateTokenMetadataDiscriminatorBytes(): ReadonlyUint8Array { return getU8Encoder().encode(CREATE_TOKEN_METADATA_DISCRIMINATOR); } export type CreateTokenMetadataInstruction< TProgram extends string = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, TAccountStakePool extends string | AccountMeta = string, TAccountManager extends string | AccountMeta = string, TAccountWithdrawAuthority extends string | AccountMeta = string, TAccountPoolMint extends string | AccountMeta = string, TAccountPayer extends string | AccountMeta = string, TAccountMetadataAccount extends string | AccountMeta = string, TAccountMetadataProgram extends string | AccountMeta = "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", TAccountSystemProgram extends string | AccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ TAccountStakePool extends string ? ReadonlyAccount : TAccountStakePool, TAccountManager extends string ? ReadonlySignerAccount & AccountSignerMeta : TAccountManager, TAccountWithdrawAuthority extends string ? ReadonlyAccount : TAccountWithdrawAuthority, TAccountPoolMint extends string ? ReadonlyAccount : TAccountPoolMint, TAccountPayer extends string ? WritableSignerAccount & AccountSignerMeta : TAccountPayer, TAccountMetadataAccount extends string ? WritableAccount : TAccountMetadataAccount, TAccountMetadataProgram extends string ? ReadonlyAccount : TAccountMetadataProgram, TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, ...TRemainingAccounts, ] >; export type CreateTokenMetadataInstructionData = { discriminator: number; name: string; symbol: string; uri: string; }; export type CreateTokenMetadataInstructionDataArgs = { name: string; symbol: string; uri: string; }; export function getCreateTokenMetadataInstructionDataEncoder(): Encoder { return transformEncoder( getStructEncoder([ ["discriminator", getU8Encoder()], ["name", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], ["symbol", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], ["uri", addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder())], ]), (value) => ({ ...value, discriminator: CREATE_TOKEN_METADATA_DISCRIMINATOR, }), ); } export function getCreateTokenMetadataInstructionDataDecoder(): Decoder { return getStructDecoder([ ["discriminator", getU8Decoder()], ["name", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], ["symbol", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], ["uri", addDecoderSizePrefix(getUtf8Decoder(), getU32Decoder())], ]); } export function getCreateTokenMetadataInstructionDataCodec(): Codec< CreateTokenMetadataInstructionDataArgs, CreateTokenMetadataInstructionData > { return combineCodec( getCreateTokenMetadataInstructionDataEncoder(), getCreateTokenMetadataInstructionDataDecoder(), ); } export type CreateTokenMetadataAsyncInput< TAccountStakePool extends string = string, TAccountManager extends string = string, TAccountWithdrawAuthority extends string = string, TAccountPoolMint extends string = string, TAccountPayer extends string = string, TAccountMetadataAccount extends string = string, TAccountMetadataProgram extends string = string, TAccountSystemProgram extends string = string, > = { stakePool: Address; manager: TransactionSigner; withdrawAuthority?: Address; poolMint: Address; payer: TransactionSigner; metadataAccount: Address; metadataProgram?: Address; systemProgram?: Address; name: CreateTokenMetadataInstructionDataArgs["name"]; symbol: CreateTokenMetadataInstructionDataArgs["symbol"]; uri: CreateTokenMetadataInstructionDataArgs["uri"]; }; /** * Create token metadata for the stake-pool token in the * metaplex-token program * 0. `[]` Stake pool * 1. `[s]` Manager * 2. `[]` Stake pool withdraw authority * 3. `[]` Pool token mint account * 4. `[s, w]` Payer for creation of token metadata account * 5. `[w]` Token metadata account * 6. `[]` Metadata program id * 7. `[]` System program id */ export async function getCreateTokenMetadataInstructionAsync< TAccountStakePool extends string, TAccountManager extends string, TAccountWithdrawAuthority extends string, TAccountPoolMint extends string, TAccountPayer extends string, TAccountMetadataAccount extends string, TAccountMetadataProgram extends string, TAccountSystemProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: CreateTokenMetadataAsyncInput< TAccountStakePool, TAccountManager, TAccountWithdrawAuthority, TAccountPoolMint, TAccountPayer, TAccountMetadataAccount, TAccountMetadataProgram, TAccountSystemProgram >, config?: { programAddress?: TProgramAddress }, ): Promise< CreateTokenMetadataInstruction< TProgramAddress, TAccountStakePool, TAccountManager, TAccountWithdrawAuthority, TAccountPoolMint, TAccountPayer, TAccountMetadataAccount, TAccountMetadataProgram, TAccountSystemProgram > > { // 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, }, poolMint: { value: input.poolMint ?? null, isWritable: false }, payer: { value: input.payer ?? null, isWritable: true }, metadataAccount: { value: input.metadataAccount ?? null, isWritable: true }, metadataProgram: { value: input.metadataProgram ?? null, isWritable: false, }, systemProgram: { value: input.systemProgram ?? 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">; } if (!accounts.systemProgram.value) { accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ accounts: [ getAccountMeta("stakePool", accounts.stakePool), getAccountMeta("manager", accounts.manager), getAccountMeta("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("poolMint", accounts.poolMint), getAccountMeta("payer", accounts.payer), getAccountMeta("metadataAccount", accounts.metadataAccount), getAccountMeta("metadataProgram", accounts.metadataProgram), getAccountMeta("systemProgram", accounts.systemProgram), ], data: getCreateTokenMetadataInstructionDataEncoder().encode( args as CreateTokenMetadataInstructionDataArgs, ), programAddress, } as CreateTokenMetadataInstruction< TProgramAddress, TAccountStakePool, TAccountManager, TAccountWithdrawAuthority, TAccountPoolMint, TAccountPayer, TAccountMetadataAccount, TAccountMetadataProgram, TAccountSystemProgram >); } export type CreateTokenMetadataInput< TAccountStakePool extends string = string, TAccountManager extends string = string, TAccountWithdrawAuthority extends string = string, TAccountPoolMint extends string = string, TAccountPayer extends string = string, TAccountMetadataAccount extends string = string, TAccountMetadataProgram extends string = string, TAccountSystemProgram extends string = string, > = { stakePool: Address; manager: TransactionSigner; withdrawAuthority: Address; poolMint: Address; payer: TransactionSigner; metadataAccount: Address; metadataProgram?: Address; systemProgram?: Address; name: CreateTokenMetadataInstructionDataArgs["name"]; symbol: CreateTokenMetadataInstructionDataArgs["symbol"]; uri: CreateTokenMetadataInstructionDataArgs["uri"]; }; /** * Create token metadata for the stake-pool token in the * metaplex-token program * 0. `[]` Stake pool * 1. `[s]` Manager * 2. `[]` Stake pool withdraw authority * 3. `[]` Pool token mint account * 4. `[s, w]` Payer for creation of token metadata account * 5. `[w]` Token metadata account * 6. `[]` Metadata program id * 7. `[]` System program id */ export function getCreateTokenMetadataInstruction< TAccountStakePool extends string, TAccountManager extends string, TAccountWithdrawAuthority extends string, TAccountPoolMint extends string, TAccountPayer extends string, TAccountMetadataAccount extends string, TAccountMetadataProgram extends string, TAccountSystemProgram extends string, TProgramAddress extends Address = typeof SPL_STAKE_POOL_PROGRAM_ADDRESS, >( input: CreateTokenMetadataInput< TAccountStakePool, TAccountManager, TAccountWithdrawAuthority, TAccountPoolMint, TAccountPayer, TAccountMetadataAccount, TAccountMetadataProgram, TAccountSystemProgram >, config?: { programAddress?: TProgramAddress }, ): CreateTokenMetadataInstruction< TProgramAddress, TAccountStakePool, TAccountManager, TAccountWithdrawAuthority, TAccountPoolMint, TAccountPayer, TAccountMetadataAccount, TAccountMetadataProgram, TAccountSystemProgram > { // 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, }, poolMint: { value: input.poolMint ?? null, isWritable: false }, payer: { value: input.payer ?? null, isWritable: true }, metadataAccount: { value: input.metadataAccount ?? null, isWritable: true }, metadataProgram: { value: input.metadataProgram ?? null, isWritable: false, }, systemProgram: { value: input.systemProgram ?? 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">; } if (!accounts.systemProgram.value) { accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); return Object.freeze({ accounts: [ getAccountMeta("stakePool", accounts.stakePool), getAccountMeta("manager", accounts.manager), getAccountMeta("withdrawAuthority", accounts.withdrawAuthority), getAccountMeta("poolMint", accounts.poolMint), getAccountMeta("payer", accounts.payer), getAccountMeta("metadataAccount", accounts.metadataAccount), getAccountMeta("metadataProgram", accounts.metadataProgram), getAccountMeta("systemProgram", accounts.systemProgram), ], data: getCreateTokenMetadataInstructionDataEncoder().encode( args as CreateTokenMetadataInstructionDataArgs, ), programAddress, } as CreateTokenMetadataInstruction< TProgramAddress, TAccountStakePool, TAccountManager, TAccountWithdrawAuthority, TAccountPoolMint, TAccountPayer, TAccountMetadataAccount, TAccountMetadataProgram, TAccountSystemProgram >); } export type ParsedCreateTokenMetadataInstruction< 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]; poolMint: TAccountMetas[3]; payer: TAccountMetas[4]; metadataAccount: TAccountMetas[5]; metadataProgram: TAccountMetas[6]; systemProgram: TAccountMetas[7]; }; data: CreateTokenMetadataInstructionData; }; export function parseCreateTokenMetadataInstruction< TProgram extends string, TAccountMetas extends readonly AccountMeta[], >( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedCreateTokenMetadataInstruction { 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(), manager: getNextAccount(), withdrawAuthority: getNextAccount(), poolMint: getNextAccount(), payer: getNextAccount(), metadataAccount: getNextAccount(), metadataProgram: getNextAccount(), systemProgram: getNextAccount(), }, data: getCreateTokenMetadataInstructionDataDecoder().decode( instruction.data, ), }; }