/** * This code was AUTOGENERATED using the kinobi library. * Please DO NOT EDIT THIS FILE, instead use visitors * to add features, then rerun kinobi to update it. * * @see https://github.com/metaplex-foundation/kinobi */ import { Address, IAccountMeta, IAccountSignerMeta, IInstruction, IInstructionWithAccounts, ReadonlyAccount, TransactionSigner, WritableAccount, WritableSignerAccount, } from '@solana/web3.js'; import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS } from '../programs'; import { ResolvedAccount, getAccountMetaFactory } from '../shared'; export type RecoverNestedAssociatedTokenInstruction< TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS, TAccountNestedAssociatedAccountAddress extends | string | IAccountMeta = string, TAccountNestedTokenMintAddress extends string | IAccountMeta = string, TAccountDestinationAssociatedAccountAddress extends | string | IAccountMeta = string, TAccountOwnerAssociatedAccountAddress extends | string | IAccountMeta = string, TAccountOwnerTokenMintAddress extends string | IAccountMeta = string, TAccountWalletAddress extends string | IAccountMeta = string, TAccountTokenProgram extends | string | IAccountMeta = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', TRemainingAccounts extends readonly IAccountMeta[] = [], > = IInstruction & IInstructionWithAccounts< [ TAccountNestedAssociatedAccountAddress extends string ? WritableAccount : TAccountNestedAssociatedAccountAddress, TAccountNestedTokenMintAddress extends string ? ReadonlyAccount : TAccountNestedTokenMintAddress, TAccountDestinationAssociatedAccountAddress extends string ? WritableAccount : TAccountDestinationAssociatedAccountAddress, TAccountOwnerAssociatedAccountAddress extends string ? ReadonlyAccount : TAccountOwnerAssociatedAccountAddress, TAccountOwnerTokenMintAddress extends string ? ReadonlyAccount : TAccountOwnerTokenMintAddress, TAccountWalletAddress extends string ? WritableSignerAccount & IAccountSignerMeta : TAccountWalletAddress, TAccountTokenProgram extends string ? ReadonlyAccount : TAccountTokenProgram, ...TRemainingAccounts, ] >; export type RecoverNestedAssociatedTokenInput< TAccountNestedAssociatedAccountAddress extends string = string, TAccountNestedTokenMintAddress extends string = string, TAccountDestinationAssociatedAccountAddress extends string = string, TAccountOwnerAssociatedAccountAddress extends string = string, TAccountOwnerTokenMintAddress extends string = string, TAccountWalletAddress extends string = string, TAccountTokenProgram extends string = string, > = { nestedAssociatedAccountAddress: Address; nestedTokenMintAddress: Address; destinationAssociatedAccountAddress: Address; ownerAssociatedAccountAddress: Address; ownerTokenMintAddress: Address; walletAddress: TransactionSigner; tokenProgram?: Address; }; export function getRecoverNestedAssociatedTokenInstruction< TAccountNestedAssociatedAccountAddress extends string, TAccountNestedTokenMintAddress extends string, TAccountDestinationAssociatedAccountAddress extends string, TAccountOwnerAssociatedAccountAddress extends string, TAccountOwnerTokenMintAddress extends string, TAccountWalletAddress extends string, TAccountTokenProgram extends string, >( input: RecoverNestedAssociatedTokenInput< TAccountNestedAssociatedAccountAddress, TAccountNestedTokenMintAddress, TAccountDestinationAssociatedAccountAddress, TAccountOwnerAssociatedAccountAddress, TAccountOwnerTokenMintAddress, TAccountWalletAddress, TAccountTokenProgram > ): RecoverNestedAssociatedTokenInstruction< typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS, TAccountNestedAssociatedAccountAddress, TAccountNestedTokenMintAddress, TAccountDestinationAssociatedAccountAddress, TAccountOwnerAssociatedAccountAddress, TAccountOwnerTokenMintAddress, TAccountWalletAddress, TAccountTokenProgram > { // Program address. const programAddress = ASSOCIATED_TOKEN_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { nestedAssociatedAccountAddress: { value: input.nestedAssociatedAccountAddress ?? null, isWritable: true, }, nestedTokenMintAddress: { value: input.nestedTokenMintAddress ?? null, isWritable: false, }, destinationAssociatedAccountAddress: { value: input.destinationAssociatedAccountAddress ?? null, isWritable: true, }, ownerAssociatedAccountAddress: { value: input.ownerAssociatedAccountAddress ?? null, isWritable: false, }, ownerTokenMintAddress: { value: input.ownerTokenMintAddress ?? null, isWritable: false, }, walletAddress: { value: input.walletAddress ?? null, isWritable: true }, tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, }; const accounts = originalAccounts as Record< keyof typeof originalAccounts, ResolvedAccount >; // Resolve default values. if (!accounts.tokenProgram.value) { accounts.tokenProgram.value = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>; } const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); const instruction = { accounts: [ getAccountMeta(accounts.nestedAssociatedAccountAddress), getAccountMeta(accounts.nestedTokenMintAddress), getAccountMeta(accounts.destinationAssociatedAccountAddress), getAccountMeta(accounts.ownerAssociatedAccountAddress), getAccountMeta(accounts.ownerTokenMintAddress), getAccountMeta(accounts.walletAddress), getAccountMeta(accounts.tokenProgram), ], programAddress, } as RecoverNestedAssociatedTokenInstruction< typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS, TAccountNestedAssociatedAccountAddress, TAccountNestedTokenMintAddress, TAccountDestinationAssociatedAccountAddress, TAccountOwnerAssociatedAccountAddress, TAccountOwnerTokenMintAddress, TAccountWalletAddress, TAccountTokenProgram >; return instruction; } export type ParsedRecoverNestedAssociatedTokenInstruction< TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS, TAccountMetas extends readonly IAccountMeta[] = readonly IAccountMeta[], > = { programAddress: Address; accounts: { nestedAssociatedAccountAddress: TAccountMetas[0]; nestedTokenMintAddress: TAccountMetas[1]; destinationAssociatedAccountAddress: TAccountMetas[2]; ownerAssociatedAccountAddress: TAccountMetas[3]; ownerTokenMintAddress: TAccountMetas[4]; walletAddress: TAccountMetas[5]; tokenProgram: TAccountMetas[6]; }; }; export function parseRecoverNestedAssociatedTokenInstruction< TProgram extends string, TAccountMetas extends readonly IAccountMeta[], >( instruction: IInstruction & IInstructionWithAccounts ): ParsedRecoverNestedAssociatedTokenInstruction { if (instruction.accounts.length < 7) { // TODO: Coded error. throw new Error('Not enough accounts'); } let accountIndex = 0; const getNextAccount = () => { const accountMeta = instruction.accounts![accountIndex]!; accountIndex += 1; return accountMeta; }; return { programAddress: instruction.programAddress, accounts: { nestedAssociatedAccountAddress: getNextAccount(), nestedTokenMintAddress: getNextAccount(), destinationAssociatedAccountAddress: getNextAccount(), ownerAssociatedAccountAddress: getNextAccount(), ownerTokenMintAddress: getNextAccount(), walletAddress: getNextAccount(), tokenProgram: getNextAccount(), }, }; }