/** * 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 ReadonlyUint8Array, type TransactionSigner, type WritableAccount, type WritableSignerAccount, } from '@solana/kit'; import { getAccountMetaFactory, type ResolvedInstructionAccount } from '@solana/program-client-core'; import { PAYMENT_CHANNELS_PROGRAM_ADDRESS } from '../programs/index.js'; import { getTopUpArgsDecoder, getTopUpArgsEncoder, type TopUpArgs, type TopUpArgsArgs } from '../types/index.js'; export const TOP_UP_DISCRIMINATOR = 3; export function getTopUpDiscriminatorBytes(): ReadonlyUint8Array { return getU8Encoder().encode(TOP_UP_DISCRIMINATOR); } export type TopUpInstruction< TProgram extends string = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, TAccountPayer extends string | AccountMeta = string, TAccountChannel extends string | AccountMeta = string, TAccountPayerTokenAccount extends string | AccountMeta = string, TAccountChannelTokenAccount extends string | AccountMeta = string, TAccountMint extends string | AccountMeta = string, TAccountTokenProgram extends string | AccountMeta = string, TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ TAccountPayer extends string ? WritableSignerAccount & AccountSignerMeta : TAccountPayer, TAccountChannel extends string ? WritableAccount : TAccountChannel, TAccountPayerTokenAccount extends string ? WritableAccount : TAccountPayerTokenAccount, TAccountChannelTokenAccount extends string ? WritableAccount : TAccountChannelTokenAccount, TAccountMint extends string ? ReadonlyAccount : TAccountMint, TAccountTokenProgram extends string ? ReadonlyAccount : TAccountTokenProgram, ...TRemainingAccounts, ] >; export type TopUpInstructionData = { discriminator: number; topUpArgs: TopUpArgs; }; export type TopUpInstructionDataArgs = { topUpArgs: TopUpArgsArgs }; export function getTopUpInstructionDataEncoder(): FixedSizeEncoder { return transformEncoder( getStructEncoder([ ['discriminator', getU8Encoder()], ['topUpArgs', getTopUpArgsEncoder()], ]), value => ({ ...value, discriminator: TOP_UP_DISCRIMINATOR }), ); } export function getTopUpInstructionDataDecoder(): FixedSizeDecoder { return getStructDecoder([ ['discriminator', getU8Decoder()], ['topUpArgs', getTopUpArgsDecoder()], ]); } export function getTopUpInstructionDataCodec(): FixedSizeCodec { return combineCodec(getTopUpInstructionDataEncoder(), getTopUpInstructionDataDecoder()); } export type TopUpInput< TAccountPayer extends string = string, TAccountChannel extends string = string, TAccountPayerTokenAccount extends string = string, TAccountChannelTokenAccount extends string = string, TAccountMint extends string = string, TAccountTokenProgram extends string = string, > = { payer: TransactionSigner; channel: Address; payerTokenAccount: Address; channelTokenAccount: Address; mint: Address; tokenProgram: Address; topUpArgs: TopUpInstructionDataArgs['topUpArgs']; }; export function getTopUpInstruction< TAccountPayer extends string, TAccountChannel extends string, TAccountPayerTokenAccount extends string, TAccountChannelTokenAccount extends string, TAccountMint extends string, TAccountTokenProgram extends string, TProgramAddress extends Address = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, >( input: TopUpInput< TAccountPayer, TAccountChannel, TAccountPayerTokenAccount, TAccountChannelTokenAccount, TAccountMint, TAccountTokenProgram >, config?: { programAddress?: TProgramAddress }, ): TopUpInstruction< TProgramAddress, TAccountPayer, TAccountChannel, TAccountPayerTokenAccount, TAccountChannelTokenAccount, TAccountMint, TAccountTokenProgram > { // Program address. const programAddress = config?.programAddress ?? PAYMENT_CHANNELS_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { payer: { value: input.payer ?? null, isWritable: true }, channel: { value: input.channel ?? null, isWritable: true }, payerTokenAccount: { value: input.payerTokenAccount ?? null, isWritable: true, }, channelTokenAccount: { value: input.channelTokenAccount ?? null, isWritable: true, }, mint: { value: input.mint ?? null, isWritable: false }, tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, }; const accounts = originalAccounts as Record; // Original args. const args = { ...input }; const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); return Object.freeze({ accounts: [ getAccountMeta('payer', accounts.payer), getAccountMeta('channel', accounts.channel), getAccountMeta('payerTokenAccount', accounts.payerTokenAccount), getAccountMeta('channelTokenAccount', accounts.channelTokenAccount), getAccountMeta('mint', accounts.mint), getAccountMeta('tokenProgram', accounts.tokenProgram), ], data: getTopUpInstructionDataEncoder().encode(args as TopUpInstructionDataArgs), programAddress, } as TopUpInstruction< TProgramAddress, TAccountPayer, TAccountChannel, TAccountPayerTokenAccount, TAccountChannelTokenAccount, TAccountMint, TAccountTokenProgram >); } export type ParsedTopUpInstruction< TProgram extends string = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], > = { programAddress: Address; accounts: { payer: TAccountMetas[0]; channel: TAccountMetas[1]; payerTokenAccount: TAccountMetas[2]; channelTokenAccount: TAccountMetas[3]; mint: TAccountMetas[4]; tokenProgram: TAccountMetas[5]; }; data: TopUpInstructionData; }; export function parseTopUpInstruction( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedTopUpInstruction { 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(), payerTokenAccount: getNextAccount(), channelTokenAccount: getNextAccount(), mint: getNextAccount(), tokenProgram: getNextAccount(), }, data: getTopUpInstructionDataDecoder().decode(instruction.data), }; }