/** * 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, type ResolvedInstructionAccount } from '@solana/program-client-core'; import { PAYMENT_CHANNELS_PROGRAM_ADDRESS } from '../programs/index.js'; export const WITHDRAW_PAYER_DISCRIMINATOR = 8; export function getWithdrawPayerDiscriminatorBytes(): ReadonlyUint8Array { return getU8Encoder().encode(WITHDRAW_PAYER_DISCRIMINATOR); } export type WithdrawPayerInstruction< TProgram extends string = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, TAccountPayer extends string | AccountMeta = string, TAccountChannel extends string | AccountMeta = string, TAccountChannelTokenAccount extends string | AccountMeta = string, TAccountPayerTokenAccount extends string | AccountMeta = string, TAccountMint extends string | AccountMeta = string, TAccountTokenProgram extends string | AccountMeta = string, TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ TAccountPayer extends string ? ReadonlySignerAccount & AccountSignerMeta : TAccountPayer, TAccountChannel extends string ? WritableAccount : TAccountChannel, TAccountChannelTokenAccount extends string ? WritableAccount : TAccountChannelTokenAccount, TAccountPayerTokenAccount extends string ? WritableAccount : TAccountPayerTokenAccount, TAccountMint extends string ? ReadonlyAccount : TAccountMint, TAccountTokenProgram extends string ? ReadonlyAccount : TAccountTokenProgram, ...TRemainingAccounts, ] >; export type WithdrawPayerInstructionData = { discriminator: number }; export type WithdrawPayerInstructionDataArgs = {}; export function getWithdrawPayerInstructionDataEncoder(): FixedSizeEncoder { return transformEncoder(getStructEncoder([['discriminator', getU8Encoder()]]), value => ({ ...value, discriminator: WITHDRAW_PAYER_DISCRIMINATOR, })); } export function getWithdrawPayerInstructionDataDecoder(): FixedSizeDecoder { return getStructDecoder([['discriminator', getU8Decoder()]]); } export function getWithdrawPayerInstructionDataCodec(): FixedSizeCodec< WithdrawPayerInstructionDataArgs, WithdrawPayerInstructionData > { return combineCodec(getWithdrawPayerInstructionDataEncoder(), getWithdrawPayerInstructionDataDecoder()); } export type WithdrawPayerInput< TAccountPayer extends string = string, TAccountChannel extends string = string, TAccountChannelTokenAccount extends string = string, TAccountPayerTokenAccount extends string = string, TAccountMint extends string = string, TAccountTokenProgram extends string = string, > = { payer: TransactionSigner; channel: Address; channelTokenAccount: Address; payerTokenAccount: Address; mint: Address; tokenProgram: Address; }; export function getWithdrawPayerInstruction< TAccountPayer extends string, TAccountChannel extends string, TAccountChannelTokenAccount extends string, TAccountPayerTokenAccount extends string, TAccountMint extends string, TAccountTokenProgram extends string, TProgramAddress extends Address = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, >( input: WithdrawPayerInput< TAccountPayer, TAccountChannel, TAccountChannelTokenAccount, TAccountPayerTokenAccount, TAccountMint, TAccountTokenProgram >, config?: { programAddress?: TProgramAddress }, ): WithdrawPayerInstruction< TProgramAddress, TAccountPayer, TAccountChannel, TAccountChannelTokenAccount, TAccountPayerTokenAccount, TAccountMint, TAccountTokenProgram > { // Program address. const programAddress = config?.programAddress ?? PAYMENT_CHANNELS_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { payer: { value: input.payer ?? null, isWritable: false }, channel: { value: input.channel ?? null, isWritable: true }, channelTokenAccount: { value: input.channelTokenAccount ?? null, isWritable: true, }, payerTokenAccount: { value: input.payerTokenAccount ?? null, isWritable: true, }, mint: { value: input.mint ?? null, isWritable: false }, tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, }; const accounts = originalAccounts as Record; const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); return Object.freeze({ accounts: [ getAccountMeta('payer', accounts.payer), getAccountMeta('channel', accounts.channel), getAccountMeta('channelTokenAccount', accounts.channelTokenAccount), getAccountMeta('payerTokenAccount', accounts.payerTokenAccount), getAccountMeta('mint', accounts.mint), getAccountMeta('tokenProgram', accounts.tokenProgram), ], data: getWithdrawPayerInstructionDataEncoder().encode({}), programAddress, } as WithdrawPayerInstruction< TProgramAddress, TAccountPayer, TAccountChannel, TAccountChannelTokenAccount, TAccountPayerTokenAccount, TAccountMint, TAccountTokenProgram >); } export type ParsedWithdrawPayerInstruction< TProgram extends string = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], > = { programAddress: Address; accounts: { payer: TAccountMetas[0]; channel: TAccountMetas[1]; channelTokenAccount: TAccountMetas[2]; payerTokenAccount: TAccountMetas[3]; mint: TAccountMetas[4]; tokenProgram: TAccountMetas[5]; }; data: WithdrawPayerInstructionData; }; export function parseWithdrawPayerInstruction( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedWithdrawPayerInstruction { if (instruction.accounts.length < 6) { throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { actualAccountMetas: instruction.accounts.length, expectedAccountMetas: 6, }); } let accountIndex = 0; const getNextAccount = () => { const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; accountIndex += 1; return accountMeta; }; return { programAddress: instruction.programAddress, accounts: { payer: getNextAccount(), channel: getNextAccount(), channelTokenAccount: getNextAccount(), payerTokenAccount: getNextAccount(), mint: getNextAccount(), tokenProgram: getNextAccount(), }, data: getWithdrawPayerInstructionDataDecoder().decode(instruction.data), }; }