import type { ConfirmOptions, Connection, PublicKey, Signer } from '@cartbc/web3.js'; import { sendAndConfirmTransaction, Transaction } from '@cartbc/web3.js'; import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID } from '../constants.js'; import { createAssociatedTokenAccountIdempotentInstruction } from '../instructions/associatedTokenAccount.js'; import { getAssociatedTokenAddressSync } from '../state/mint.js'; /** * Create and initialize a new associated token account * The instruction will succeed even if the associated token account already exists * * @param connection Connection to use * @param payer Payer of the transaction and initialization fees * @param mint Mint for the account * @param owner Owner of the new account * @param confirmOptions Options for confirming the transaction * @param programId CPL Token program account * @param associatedTokenProgramId CPL Associated Token program account * * @return Address of the new or existing associated token account */ export async function createAssociatedTokenAccountIdempotent( connection: Connection, payer: Signer, mint: PublicKey, owner: PublicKey, confirmOptions?: ConfirmOptions, programId = TOKEN_PROGRAM_ID, associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID ): Promise { const associatedToken = getAssociatedTokenAddressSync(mint, owner, false, programId, associatedTokenProgramId); const transaction = new Transaction().add( createAssociatedTokenAccountIdempotentInstruction( payer.publicKey, associatedToken, owner, mint, programId, associatedTokenProgramId ) ); await sendAndConfirmTransaction(connection, transaction, [payer], confirmOptions); return associatedToken; }