/** * 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 { AccountRole, combineCodec, getStructDecoder, getStructEncoder, getU8Decoder, getU8Encoder, SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, SolanaError, transformEncoder, type AccountMeta, type Address, type Codec, type Decoder, type Encoder, type Instruction, type InstructionWithAccounts, type InstructionWithData, type ReadonlyAccount, type ReadonlyUint8Array, type WritableAccount, } from '@solana/kit'; import { getAccountMetaFactory, type ResolvedInstructionAccount } from '@solana/program-client-core'; import { findEventAuthorityPda } from '../pdas/index.js'; import { PAYMENT_CHANNELS_PROGRAM_ADDRESS } from '../programs/index.js'; import { getDistributeArgsDecoder, getDistributeArgsEncoder, type DistributeArgs, type DistributeArgsArgs, } from '../types/index.js'; export const DISTRIBUTE_DISCRIMINATOR = 7; export function getDistributeDiscriminatorBytes(): ReadonlyUint8Array { return getU8Encoder().encode(DISTRIBUTE_DISCRIMINATOR); } export type DistributeInstruction< TProgram extends string = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, TAccountChannel extends string | AccountMeta = string, TAccountPayer extends string | AccountMeta = string, TAccountRentPayer extends string | AccountMeta = string, TAccountChannelTokenAccount extends string | AccountMeta = string, TAccountPayerTokenAccount extends string | AccountMeta = string, TAccountPayeeTokenAccount extends string | AccountMeta = string, TAccountTreasuryTokenAccount extends string | AccountMeta = string, TAccountMint extends string | AccountMeta = string, TAccountTokenProgram extends string | AccountMeta = string, TAccountEventAuthority extends string | AccountMeta = string, TAccountSelfProgram extends string | AccountMeta = 'CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX', TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ TAccountChannel extends string ? WritableAccount : TAccountChannel, TAccountPayer extends string ? WritableAccount : TAccountPayer, TAccountRentPayer extends string ? WritableAccount : TAccountRentPayer, TAccountChannelTokenAccount extends string ? WritableAccount : TAccountChannelTokenAccount, TAccountPayerTokenAccount extends string ? WritableAccount : TAccountPayerTokenAccount, TAccountPayeeTokenAccount extends string ? WritableAccount : TAccountPayeeTokenAccount, TAccountTreasuryTokenAccount extends string ? WritableAccount : TAccountTreasuryTokenAccount, TAccountMint extends string ? ReadonlyAccount : TAccountMint, TAccountTokenProgram extends string ? ReadonlyAccount : TAccountTokenProgram, TAccountEventAuthority extends string ? ReadonlyAccount : TAccountEventAuthority, TAccountSelfProgram extends string ? ReadonlyAccount : TAccountSelfProgram, ...TRemainingAccounts, ] >; export type DistributeInstructionData = { discriminator: number; distributeArgs: DistributeArgs; }; export type DistributeInstructionDataArgs = { distributeArgs: DistributeArgsArgs; }; export function getDistributeInstructionDataEncoder(): Encoder { return transformEncoder( getStructEncoder([ ['discriminator', getU8Encoder()], ['distributeArgs', getDistributeArgsEncoder()], ]), value => ({ ...value, discriminator: DISTRIBUTE_DISCRIMINATOR }), ); } export function getDistributeInstructionDataDecoder(): Decoder { return getStructDecoder([ ['discriminator', getU8Decoder()], ['distributeArgs', getDistributeArgsDecoder()], ]); } export function getDistributeInstructionDataCodec(): Codec { return combineCodec(getDistributeInstructionDataEncoder(), getDistributeInstructionDataDecoder()); } export type DistributeAsyncInput< TAccountChannel extends string = string, TAccountPayer extends string = string, TAccountRentPayer extends string = string, TAccountChannelTokenAccount extends string = string, TAccountPayerTokenAccount extends string = string, TAccountPayeeTokenAccount extends string = string, TAccountTreasuryTokenAccount extends string = string, TAccountMint extends string = string, TAccountTokenProgram extends string = string, TAccountEventAuthority extends string = string, TAccountSelfProgram extends string = string, > = { channel: Address; payer: Address; rentPayer: Address; channelTokenAccount: Address; payerTokenAccount: Address; payeeTokenAccount: Address; treasuryTokenAccount: Address; mint: Address; tokenProgram: Address; eventAuthority?: Address; selfProgram?: Address; distributeArgs: DistributeInstructionDataArgs['distributeArgs']; recipientTokenAccounts: Array
; }; export async function getDistributeInstructionAsync< TAccountChannel extends string, TAccountPayer extends string, TAccountRentPayer extends string, TAccountChannelTokenAccount extends string, TAccountPayerTokenAccount extends string, TAccountPayeeTokenAccount extends string, TAccountTreasuryTokenAccount extends string, TAccountMint extends string, TAccountTokenProgram extends string, TAccountEventAuthority extends string, TAccountSelfProgram extends string, TProgramAddress extends Address = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, >( input: DistributeAsyncInput< TAccountChannel, TAccountPayer, TAccountRentPayer, TAccountChannelTokenAccount, TAccountPayerTokenAccount, TAccountPayeeTokenAccount, TAccountTreasuryTokenAccount, TAccountMint, TAccountTokenProgram, TAccountEventAuthority, TAccountSelfProgram >, config?: { programAddress?: TProgramAddress }, ): Promise< DistributeInstruction< TProgramAddress, TAccountChannel, TAccountPayer, TAccountRentPayer, TAccountChannelTokenAccount, TAccountPayerTokenAccount, TAccountPayeeTokenAccount, TAccountTreasuryTokenAccount, TAccountMint, TAccountTokenProgram, TAccountEventAuthority, TAccountSelfProgram > > { // Program address. const programAddress = config?.programAddress ?? PAYMENT_CHANNELS_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { channel: { value: input.channel ?? null, isWritable: true }, payer: { value: input.payer ?? null, isWritable: true }, rentPayer: { value: input.rentPayer ?? null, isWritable: true }, channelTokenAccount: { value: input.channelTokenAccount ?? null, isWritable: true, }, payerTokenAccount: { value: input.payerTokenAccount ?? null, isWritable: true, }, payeeTokenAccount: { value: input.payeeTokenAccount ?? null, isWritable: true, }, treasuryTokenAccount: { value: input.treasuryTokenAccount ?? null, isWritable: true, }, mint: { value: input.mint ?? null, isWritable: false }, tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, eventAuthority: { value: input.eventAuthority ?? null, isWritable: false }, selfProgram: { value: input.selfProgram ?? null, isWritable: false }, }; const accounts = originalAccounts as Record; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.eventAuthority.value) { accounts.eventAuthority.value = await findEventAuthorityPda(); } if (!accounts.selfProgram.value) { accounts.selfProgram.value = 'CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX' as Address<'CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX'>; } // Remaining accounts. const remainingAccounts: AccountMeta[] = args.recipientTokenAccounts.map(address => ({ address, role: AccountRole.WRITABLE, })); const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); return Object.freeze({ accounts: [ getAccountMeta('channel', accounts.channel), getAccountMeta('payer', accounts.payer), getAccountMeta('rentPayer', accounts.rentPayer), getAccountMeta('channelTokenAccount', accounts.channelTokenAccount), getAccountMeta('payerTokenAccount', accounts.payerTokenAccount), getAccountMeta('payeeTokenAccount', accounts.payeeTokenAccount), getAccountMeta('treasuryTokenAccount', accounts.treasuryTokenAccount), getAccountMeta('mint', accounts.mint), getAccountMeta('tokenProgram', accounts.tokenProgram), getAccountMeta('eventAuthority', accounts.eventAuthority), getAccountMeta('selfProgram', accounts.selfProgram), ...remainingAccounts, ], data: getDistributeInstructionDataEncoder().encode(args as DistributeInstructionDataArgs), programAddress, } as DistributeInstruction< TProgramAddress, TAccountChannel, TAccountPayer, TAccountRentPayer, TAccountChannelTokenAccount, TAccountPayerTokenAccount, TAccountPayeeTokenAccount, TAccountTreasuryTokenAccount, TAccountMint, TAccountTokenProgram, TAccountEventAuthority, TAccountSelfProgram >); } export type DistributeInput< TAccountChannel extends string = string, TAccountPayer extends string = string, TAccountRentPayer extends string = string, TAccountChannelTokenAccount extends string = string, TAccountPayerTokenAccount extends string = string, TAccountPayeeTokenAccount extends string = string, TAccountTreasuryTokenAccount extends string = string, TAccountMint extends string = string, TAccountTokenProgram extends string = string, TAccountEventAuthority extends string = string, TAccountSelfProgram extends string = string, > = { channel: Address; payer: Address; rentPayer: Address; channelTokenAccount: Address; payerTokenAccount: Address; payeeTokenAccount: Address; treasuryTokenAccount: Address; mint: Address; tokenProgram: Address; eventAuthority: Address; selfProgram?: Address; distributeArgs: DistributeInstructionDataArgs['distributeArgs']; recipientTokenAccounts: Array
; }; export function getDistributeInstruction< TAccountChannel extends string, TAccountPayer extends string, TAccountRentPayer extends string, TAccountChannelTokenAccount extends string, TAccountPayerTokenAccount extends string, TAccountPayeeTokenAccount extends string, TAccountTreasuryTokenAccount extends string, TAccountMint extends string, TAccountTokenProgram extends string, TAccountEventAuthority extends string, TAccountSelfProgram extends string, TProgramAddress extends Address = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, >( input: DistributeInput< TAccountChannel, TAccountPayer, TAccountRentPayer, TAccountChannelTokenAccount, TAccountPayerTokenAccount, TAccountPayeeTokenAccount, TAccountTreasuryTokenAccount, TAccountMint, TAccountTokenProgram, TAccountEventAuthority, TAccountSelfProgram >, config?: { programAddress?: TProgramAddress }, ): DistributeInstruction< TProgramAddress, TAccountChannel, TAccountPayer, TAccountRentPayer, TAccountChannelTokenAccount, TAccountPayerTokenAccount, TAccountPayeeTokenAccount, TAccountTreasuryTokenAccount, TAccountMint, TAccountTokenProgram, TAccountEventAuthority, TAccountSelfProgram > { // Program address. const programAddress = config?.programAddress ?? PAYMENT_CHANNELS_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { channel: { value: input.channel ?? null, isWritable: true }, payer: { value: input.payer ?? null, isWritable: true }, rentPayer: { value: input.rentPayer ?? null, isWritable: true }, channelTokenAccount: { value: input.channelTokenAccount ?? null, isWritable: true, }, payerTokenAccount: { value: input.payerTokenAccount ?? null, isWritable: true, }, payeeTokenAccount: { value: input.payeeTokenAccount ?? null, isWritable: true, }, treasuryTokenAccount: { value: input.treasuryTokenAccount ?? null, isWritable: true, }, mint: { value: input.mint ?? null, isWritable: false }, tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, eventAuthority: { value: input.eventAuthority ?? null, isWritable: false }, selfProgram: { value: input.selfProgram ?? null, isWritable: false }, }; const accounts = originalAccounts as Record; // Original args. const args = { ...input }; // Resolve default values. if (!accounts.selfProgram.value) { accounts.selfProgram.value = 'CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX' as Address<'CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX'>; } // Remaining accounts. const remainingAccounts: AccountMeta[] = args.recipientTokenAccounts.map(address => ({ address, role: AccountRole.WRITABLE, })); const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); return Object.freeze({ accounts: [ getAccountMeta('channel', accounts.channel), getAccountMeta('payer', accounts.payer), getAccountMeta('rentPayer', accounts.rentPayer), getAccountMeta('channelTokenAccount', accounts.channelTokenAccount), getAccountMeta('payerTokenAccount', accounts.payerTokenAccount), getAccountMeta('payeeTokenAccount', accounts.payeeTokenAccount), getAccountMeta('treasuryTokenAccount', accounts.treasuryTokenAccount), getAccountMeta('mint', accounts.mint), getAccountMeta('tokenProgram', accounts.tokenProgram), getAccountMeta('eventAuthority', accounts.eventAuthority), getAccountMeta('selfProgram', accounts.selfProgram), ...remainingAccounts, ], data: getDistributeInstructionDataEncoder().encode(args as DistributeInstructionDataArgs), programAddress, } as DistributeInstruction< TProgramAddress, TAccountChannel, TAccountPayer, TAccountRentPayer, TAccountChannelTokenAccount, TAccountPayerTokenAccount, TAccountPayeeTokenAccount, TAccountTreasuryTokenAccount, TAccountMint, TAccountTokenProgram, TAccountEventAuthority, TAccountSelfProgram >); } export type ParsedDistributeInstruction< TProgram extends string = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], > = { programAddress: Address; accounts: { channel: TAccountMetas[0]; payer: TAccountMetas[1]; rentPayer: TAccountMetas[2]; channelTokenAccount: TAccountMetas[3]; payerTokenAccount: TAccountMetas[4]; payeeTokenAccount: TAccountMetas[5]; treasuryTokenAccount: TAccountMetas[6]; mint: TAccountMetas[7]; tokenProgram: TAccountMetas[8]; eventAuthority: TAccountMetas[9]; selfProgram: TAccountMetas[10]; }; data: DistributeInstructionData; }; export function parseDistributeInstruction( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedDistributeInstruction { if (instruction.accounts.length < 11) { throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { actualAccountMetas: instruction.accounts.length, expectedAccountMetas: 11, }); } let accountIndex = 0; const getNextAccount = () => { const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; accountIndex += 1; return accountMeta; }; return { programAddress: instruction.programAddress, accounts: { channel: getNextAccount(), payer: getNextAccount(), rentPayer: getNextAccount(), channelTokenAccount: getNextAccount(), payerTokenAccount: getNextAccount(), payeeTokenAccount: getNextAccount(), treasuryTokenAccount: getNextAccount(), mint: getNextAccount(), tokenProgram: getNextAccount(), eventAuthority: getNextAccount(), selfProgram: getNextAccount(), }, data: getDistributeInstructionDataDecoder().decode(instruction.data), }; }