/** * 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 CreateAssociatedTokenInstruction< TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS, TAccountPayer extends string | IAccountMeta = string, TAccountAta extends string | IAccountMeta = string, TAccountOwner extends string | IAccountMeta = string, TAccountMint extends string | IAccountMeta = string, TAccountSystemProgram extends | string | IAccountMeta = '11111111111111111111111111111111', TAccountTokenProgram extends | string | IAccountMeta = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', TRemainingAccounts extends readonly IAccountMeta[] = [], > = IInstruction & IInstructionWithAccounts< [ TAccountPayer extends string ? WritableSignerAccount & IAccountSignerMeta : TAccountPayer, TAccountAta extends string ? WritableAccount : TAccountAta, TAccountOwner extends string ? ReadonlyAccount : TAccountOwner, TAccountMint extends string ? ReadonlyAccount : TAccountMint, TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, TAccountTokenProgram extends string ? ReadonlyAccount : TAccountTokenProgram, ...TRemainingAccounts, ] >; export type CreateAssociatedTokenInput< TAccountPayer extends string = string, TAccountAta extends string = string, TAccountOwner extends string = string, TAccountMint extends string = string, TAccountSystemProgram extends string = string, TAccountTokenProgram extends string = string, > = { payer: TransactionSigner; ata: Address; owner: Address; mint: Address; systemProgram?: Address; tokenProgram?: Address; }; export function getCreateAssociatedTokenInstruction< TAccountPayer extends string, TAccountAta extends string, TAccountOwner extends string, TAccountMint extends string, TAccountSystemProgram extends string, TAccountTokenProgram extends string, >( input: CreateAssociatedTokenInput< TAccountPayer, TAccountAta, TAccountOwner, TAccountMint, TAccountSystemProgram, TAccountTokenProgram > ): CreateAssociatedTokenInstruction< typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS, TAccountPayer, TAccountAta, TAccountOwner, TAccountMint, TAccountSystemProgram, TAccountTokenProgram > { // Program address. const programAddress = ASSOCIATED_TOKEN_PROGRAM_ADDRESS; // Original accounts. const originalAccounts = { payer: { value: input.payer ?? null, isWritable: true }, ata: { value: input.ata ?? null, isWritable: true }, owner: { value: input.owner ?? null, isWritable: false }, mint: { value: input.mint ?? null, isWritable: false }, systemProgram: { value: input.systemProgram ?? null, isWritable: false }, tokenProgram: { value: input.tokenProgram ?? null, isWritable: false }, }; const accounts = originalAccounts as Record< keyof typeof originalAccounts, ResolvedAccount >; // Resolve default values. if (!accounts.systemProgram.value) { accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; } if (!accounts.tokenProgram.value) { accounts.tokenProgram.value = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA' as Address<'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'>; } const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); const instruction = { accounts: [ getAccountMeta(accounts.payer), getAccountMeta(accounts.ata), getAccountMeta(accounts.owner), getAccountMeta(accounts.mint), getAccountMeta(accounts.systemProgram), getAccountMeta(accounts.tokenProgram), ], programAddress, } as CreateAssociatedTokenInstruction< typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS, TAccountPayer, TAccountAta, TAccountOwner, TAccountMint, TAccountSystemProgram, TAccountTokenProgram >; return instruction; } export type ParsedCreateAssociatedTokenInstruction< TProgram extends string = typeof ASSOCIATED_TOKEN_PROGRAM_ADDRESS, TAccountMetas extends readonly IAccountMeta[] = readonly IAccountMeta[], > = { programAddress: Address; accounts: { payer: TAccountMetas[0]; ata: TAccountMetas[1]; owner: TAccountMetas[2]; mint: TAccountMetas[3]; systemProgram: TAccountMetas[4]; tokenProgram: TAccountMetas[5]; }; }; export function parseCreateAssociatedTokenInstruction< TProgram extends string, TAccountMetas extends readonly IAccountMeta[], >( instruction: IInstruction & IInstructionWithAccounts ): ParsedCreateAssociatedTokenInstruction { if (instruction.accounts.length < 6) { // 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: { payer: getNextAccount(), ata: getNextAccount(), owner: getNextAccount(), mint: getNextAccount(), systemProgram: getNextAccount(), tokenProgram: getNextAccount(), }, }; }