/** * 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 Codec, type Decoder, type Encoder, 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 { findEventAuthorityPda } from '../pdas/index.js'; import { PAYMENT_CHANNELS_PROGRAM_ADDRESS } from '../programs/index.js'; import { getOpenArgsDecoder, getOpenArgsEncoder, type OpenArgs, type OpenArgsArgs } from '../types/index.js'; export const OPEN_DISCRIMINATOR = 1; export function getOpenDiscriminatorBytes(): ReadonlyUint8Array { return getU8Encoder().encode(OPEN_DISCRIMINATOR); } export type OpenInstruction< TProgram extends string = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, TAccountPayer extends string | AccountMeta = string, TAccountRentPayer extends string | AccountMeta = string, TAccountPayee extends string | AccountMeta = string, TAccountMint extends string | AccountMeta = string, TAccountAuthorizedSigner extends string | AccountMeta = string, TAccountChannel extends string | AccountMeta = string, TAccountPayerTokenAccount extends string | AccountMeta = string, TAccountChannelTokenAccount extends string | AccountMeta = string, TAccountTokenProgram extends string | AccountMeta = string, TAccountSystemProgram extends string | AccountMeta = '11111111111111111111111111111111', TAccountRent extends string | AccountMeta = string, TAccountAssociatedTokenProgram extends string | AccountMeta = string, TAccountEventAuthority extends string | AccountMeta = string, TAccountSelfProgram extends string | AccountMeta = 'CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX', TRemainingAccounts extends readonly AccountMeta[] = [], > = Instruction & InstructionWithData & InstructionWithAccounts< [ TAccountPayer extends string ? WritableSignerAccount & AccountSignerMeta : TAccountPayer, TAccountRentPayer extends string ? WritableSignerAccount & AccountSignerMeta : TAccountRentPayer, TAccountPayee extends string ? ReadonlyAccount : TAccountPayee, TAccountMint extends string ? ReadonlyAccount : TAccountMint, TAccountAuthorizedSigner extends string ? ReadonlyAccount : TAccountAuthorizedSigner, TAccountChannel extends string ? WritableAccount : TAccountChannel, TAccountPayerTokenAccount extends string ? WritableAccount : TAccountPayerTokenAccount, TAccountChannelTokenAccount extends string ? WritableAccount : TAccountChannelTokenAccount, TAccountTokenProgram extends string ? ReadonlyAccount : TAccountTokenProgram, TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, TAccountRent extends string ? ReadonlyAccount : TAccountRent, TAccountAssociatedTokenProgram extends string ? ReadonlyAccount : TAccountAssociatedTokenProgram, TAccountEventAuthority extends string ? ReadonlyAccount : TAccountEventAuthority, TAccountSelfProgram extends string ? ReadonlyAccount : TAccountSelfProgram, ...TRemainingAccounts, ] >; export type OpenInstructionData = { discriminator: number; openArgs: OpenArgs }; export type OpenInstructionDataArgs = { openArgs: OpenArgsArgs }; export function getOpenInstructionDataEncoder(): Encoder { return transformEncoder( getStructEncoder([ ['discriminator', getU8Encoder()], ['openArgs', getOpenArgsEncoder()], ]), value => ({ ...value, discriminator: OPEN_DISCRIMINATOR }), ); } export function getOpenInstructionDataDecoder(): Decoder { return getStructDecoder([ ['discriminator', getU8Decoder()], ['openArgs', getOpenArgsDecoder()], ]); } export function getOpenInstructionDataCodec(): Codec { return combineCodec(getOpenInstructionDataEncoder(), getOpenInstructionDataDecoder()); } export type OpenAsyncInput< TAccountPayer extends string = string, TAccountRentPayer extends string = string, TAccountPayee extends string = string, TAccountMint extends string = string, TAccountAuthorizedSigner extends string = string, TAccountChannel extends string = string, TAccountPayerTokenAccount extends string = string, TAccountChannelTokenAccount extends string = string, TAccountTokenProgram extends string = string, TAccountSystemProgram extends string = string, TAccountRent extends string = string, TAccountAssociatedTokenProgram extends string = string, TAccountEventAuthority extends string = string, TAccountSelfProgram extends string = string, > = { payer: TransactionSigner; rentPayer: TransactionSigner; payee: Address; mint: Address; authorizedSigner: Address; channel: Address; payerTokenAccount: Address; channelTokenAccount: Address; tokenProgram: Address; systemProgram?: Address; rent: Address; associatedTokenProgram: Address; eventAuthority?: Address; selfProgram?: Address; openArgs: OpenInstructionDataArgs['openArgs']; }; export async function getOpenInstructionAsync< TAccountPayer extends string, TAccountRentPayer extends string, TAccountPayee extends string, TAccountMint extends string, TAccountAuthorizedSigner extends string, TAccountChannel extends string, TAccountPayerTokenAccount extends string, TAccountChannelTokenAccount extends string, TAccountTokenProgram extends string, TAccountSystemProgram extends string, TAccountRent extends string, TAccountAssociatedTokenProgram extends string, TAccountEventAuthority extends string, TAccountSelfProgram extends string, TProgramAddress extends Address = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, >( input: OpenAsyncInput< TAccountPayer, TAccountRentPayer, TAccountPayee, TAccountMint, TAccountAuthorizedSigner, TAccountChannel, TAccountPayerTokenAccount, TAccountChannelTokenAccount, TAccountTokenProgram, TAccountSystemProgram, TAccountRent, TAccountAssociatedTokenProgram, TAccountEventAuthority, TAccountSelfProgram >, config?: { programAddress?: TProgramAddress }, ): Promise< OpenInstruction< TProgramAddress, TAccountPayer, TAccountRentPayer, TAccountPayee, TAccountMint, TAccountAuthorizedSigner, TAccountChannel, TAccountPayerTokenAccount, TAccountChannelTokenAccount, TAccountTokenProgram, TAccountSystemProgram, TAccountRent, TAccountAssociatedTokenProgram, TAccountEventAuthority, TAccountSelfProgram > > { // Program address. const programAddress = config?.programAddress ?? PAYMENT_CHANNELS_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { payer: { value: input.payer ?? null, isWritable: true }, rentPayer: { value: input.rentPayer ?? null, isWritable: true }, payee: { value: input.payee ?? null, isWritable: false }, mint: { value: input.mint ?? null, isWritable: false }, authorizedSigner: { value: input.authorizedSigner ?? null, isWritable: false, }, channel: { value: input.channel ?? null, isWritable: true }, payerTokenAccount: { value: input.payerTokenAccount ?? null, isWritable: true, }, channelTokenAccount: { value: input.channelTokenAccount ?? null, isWritable: true, }, tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, rent: { value: input.rent ?? null, isWritable: false }, associatedTokenProgram: { value: input.associatedTokenProgram ?? 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.systemProgram.value) { accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; } if (!accounts.eventAuthority.value) { accounts.eventAuthority.value = await findEventAuthorityPda(); } if (!accounts.selfProgram.value) { accounts.selfProgram.value = 'CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX' as Address<'CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX'>; } const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); return Object.freeze({ accounts: [ getAccountMeta('payer', accounts.payer), getAccountMeta('rentPayer', accounts.rentPayer), getAccountMeta('payee', accounts.payee), getAccountMeta('mint', accounts.mint), getAccountMeta('authorizedSigner', accounts.authorizedSigner), getAccountMeta('channel', accounts.channel), getAccountMeta('payerTokenAccount', accounts.payerTokenAccount), getAccountMeta('channelTokenAccount', accounts.channelTokenAccount), getAccountMeta('tokenProgram', accounts.tokenProgram), getAccountMeta('systemProgram', accounts.systemProgram), getAccountMeta('rent', accounts.rent), getAccountMeta('associatedTokenProgram', accounts.associatedTokenProgram), getAccountMeta('eventAuthority', accounts.eventAuthority), getAccountMeta('selfProgram', accounts.selfProgram), ], data: getOpenInstructionDataEncoder().encode(args as OpenInstructionDataArgs), programAddress, } as OpenInstruction< TProgramAddress, TAccountPayer, TAccountRentPayer, TAccountPayee, TAccountMint, TAccountAuthorizedSigner, TAccountChannel, TAccountPayerTokenAccount, TAccountChannelTokenAccount, TAccountTokenProgram, TAccountSystemProgram, TAccountRent, TAccountAssociatedTokenProgram, TAccountEventAuthority, TAccountSelfProgram >); } export type OpenInput< TAccountPayer extends string = string, TAccountRentPayer extends string = string, TAccountPayee extends string = string, TAccountMint extends string = string, TAccountAuthorizedSigner extends string = string, TAccountChannel extends string = string, TAccountPayerTokenAccount extends string = string, TAccountChannelTokenAccount extends string = string, TAccountTokenProgram extends string = string, TAccountSystemProgram extends string = string, TAccountRent extends string = string, TAccountAssociatedTokenProgram extends string = string, TAccountEventAuthority extends string = string, TAccountSelfProgram extends string = string, > = { payer: TransactionSigner; rentPayer: TransactionSigner; payee: Address; mint: Address; authorizedSigner: Address; channel: Address; payerTokenAccount: Address; channelTokenAccount: Address; tokenProgram: Address; systemProgram?: Address; rent: Address; associatedTokenProgram: Address; eventAuthority: Address; selfProgram?: Address; openArgs: OpenInstructionDataArgs['openArgs']; }; export function getOpenInstruction< TAccountPayer extends string, TAccountRentPayer extends string, TAccountPayee extends string, TAccountMint extends string, TAccountAuthorizedSigner extends string, TAccountChannel extends string, TAccountPayerTokenAccount extends string, TAccountChannelTokenAccount extends string, TAccountTokenProgram extends string, TAccountSystemProgram extends string, TAccountRent extends string, TAccountAssociatedTokenProgram extends string, TAccountEventAuthority extends string, TAccountSelfProgram extends string, TProgramAddress extends Address = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, >( input: OpenInput< TAccountPayer, TAccountRentPayer, TAccountPayee, TAccountMint, TAccountAuthorizedSigner, TAccountChannel, TAccountPayerTokenAccount, TAccountChannelTokenAccount, TAccountTokenProgram, TAccountSystemProgram, TAccountRent, TAccountAssociatedTokenProgram, TAccountEventAuthority, TAccountSelfProgram >, config?: { programAddress?: TProgramAddress }, ): OpenInstruction< TProgramAddress, TAccountPayer, TAccountRentPayer, TAccountPayee, TAccountMint, TAccountAuthorizedSigner, TAccountChannel, TAccountPayerTokenAccount, TAccountChannelTokenAccount, TAccountTokenProgram, TAccountSystemProgram, TAccountRent, TAccountAssociatedTokenProgram, TAccountEventAuthority, TAccountSelfProgram > { // Program address. const programAddress = config?.programAddress ?? PAYMENT_CHANNELS_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { payer: { value: input.payer ?? null, isWritable: true }, rentPayer: { value: input.rentPayer ?? null, isWritable: true }, payee: { value: input.payee ?? null, isWritable: false }, mint: { value: input.mint ?? null, isWritable: false }, authorizedSigner: { value: input.authorizedSigner ?? null, isWritable: false, }, channel: { value: input.channel ?? null, isWritable: true }, payerTokenAccount: { value: input.payerTokenAccount ?? null, isWritable: true, }, channelTokenAccount: { value: input.channelTokenAccount ?? null, isWritable: true, }, tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, rent: { value: input.rent ?? null, isWritable: false }, associatedTokenProgram: { value: input.associatedTokenProgram ?? 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.systemProgram.value) { accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; } if (!accounts.selfProgram.value) { accounts.selfProgram.value = 'CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX' as Address<'CHNLxYvVA28MJP9PrFuDXccuoGXAx7jBacfLEkahyGsX'>; } const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); return Object.freeze({ accounts: [ getAccountMeta('payer', accounts.payer), getAccountMeta('rentPayer', accounts.rentPayer), getAccountMeta('payee', accounts.payee), getAccountMeta('mint', accounts.mint), getAccountMeta('authorizedSigner', accounts.authorizedSigner), getAccountMeta('channel', accounts.channel), getAccountMeta('payerTokenAccount', accounts.payerTokenAccount), getAccountMeta('channelTokenAccount', accounts.channelTokenAccount), getAccountMeta('tokenProgram', accounts.tokenProgram), getAccountMeta('systemProgram', accounts.systemProgram), getAccountMeta('rent', accounts.rent), getAccountMeta('associatedTokenProgram', accounts.associatedTokenProgram), getAccountMeta('eventAuthority', accounts.eventAuthority), getAccountMeta('selfProgram', accounts.selfProgram), ], data: getOpenInstructionDataEncoder().encode(args as OpenInstructionDataArgs), programAddress, } as OpenInstruction< TProgramAddress, TAccountPayer, TAccountRentPayer, TAccountPayee, TAccountMint, TAccountAuthorizedSigner, TAccountChannel, TAccountPayerTokenAccount, TAccountChannelTokenAccount, TAccountTokenProgram, TAccountSystemProgram, TAccountRent, TAccountAssociatedTokenProgram, TAccountEventAuthority, TAccountSelfProgram >); } export type ParsedOpenInstruction< TProgram extends string = typeof PAYMENT_CHANNELS_PROGRAM_ADDRESS, TAccountMetas extends readonly AccountMeta[] = readonly AccountMeta[], > = { programAddress: Address; accounts: { payer: TAccountMetas[0]; rentPayer: TAccountMetas[1]; payee: TAccountMetas[2]; mint: TAccountMetas[3]; authorizedSigner: TAccountMetas[4]; channel: TAccountMetas[5]; payerTokenAccount: TAccountMetas[6]; channelTokenAccount: TAccountMetas[7]; tokenProgram: TAccountMetas[8]; systemProgram: TAccountMetas[9]; rent: TAccountMetas[10]; associatedTokenProgram: TAccountMetas[11]; eventAuthority: TAccountMetas[12]; selfProgram: TAccountMetas[13]; }; data: OpenInstructionData; }; export function parseOpenInstruction( instruction: Instruction & InstructionWithAccounts & InstructionWithData, ): ParsedOpenInstruction { if (instruction.accounts.length < 14) { throw new SolanaError(SOLANA_ERROR__PROGRAM_CLIENTS__INSUFFICIENT_ACCOUNT_METAS, { actualAccountMetas: instruction.accounts.length, expectedAccountMetas: 14, }); } let accountIndex = 0; const getNextAccount = () => { const accountMeta = (instruction.accounts as TAccountMetas)[accountIndex]!; accountIndex += 1; return accountMeta; }; return { programAddress: instruction.programAddress, accounts: { payer: getNextAccount(), rentPayer: getNextAccount(), payee: getNextAccount(), mint: getNextAccount(), authorizedSigner: getNextAccount(), channel: getNextAccount(), payerTokenAccount: getNextAccount(), channelTokenAccount: getNextAccount(), tokenProgram: getNextAccount(), systemProgram: getNextAccount(), rent: getNextAccount(), associatedTokenProgram: getNextAccount(), eventAuthority: getNextAccount(), selfProgram: getNextAccount(), }, data: getOpenInstructionDataDecoder().decode(instruction.data), }; }