import type { ConfirmOptions, Connection, PublicKey, Signer, TransactionSignature } from '@cartbc/web3.js'; import { sendAndConfirmTransaction, Transaction } from '@cartbc/web3.js'; import { getSigners } from '../../actions/internal.js'; import { TOKEN_2022_PROGRAM_ID } from '../../constants.js'; import { createHarvestWithheldTokensToMintInstruction, createTransferCheckedWithFeeInstruction, createWithdrawWithheldTokensFromAccountsInstruction, createWithdrawWithheldTokensFromMintInstruction, } from './instructions.js'; /** * Transfer tokens from one account to another, asserting the transfer fee, token mint, and decimals * * @param connection Connection to use * @param payer Payer of the transaction fees * @param source Source account * @param mint Mint for the account * @param destination Destination account * @param owner Owner of the source account * @param amount Number of tokens to transfer * @param decimals Number of decimals in transfer amount * @param multiSigners Signing accounts if `owner` is a multisig * @param confirmOptions Options for confirming the transaction * @param programId CPL Token program account * * @return Signature of the confirmed transaction */ export async function transferCheckedWithFee( connection: Connection, payer: Signer, source: PublicKey, mint: PublicKey, destination: PublicKey, owner: Signer | PublicKey, amount: bigint, decimals: number, fee: bigint, multiSigners: Signer[] = [], confirmOptions?: ConfirmOptions, programId = TOKEN_2022_PROGRAM_ID ): Promise { const [ownerPublicKey, signers] = getSigners(owner, multiSigners); const transaction = new Transaction().add( createTransferCheckedWithFeeInstruction( source, mint, destination, ownerPublicKey, amount, decimals, fee, multiSigners, programId ) ); return await sendAndConfirmTransaction(connection, transaction, [payer, ...signers], confirmOptions); } /** * Withdraw withheld tokens from mint * * @param connection Connection to use * @param payer Payer of the transaction fees * @param mint The token mint * @param destination The destination account * @param authority The mint's withdraw withheld tokens authority * @param multiSigners Signing accounts if `owner` is a multisig * @param confirmOptions Options for confirming the transaction * @param programId CPL Token program account * * @return Signature of the confirmed transaction */ export async function withdrawWithheldTokensFromMint( connection: Connection, payer: Signer, mint: PublicKey, destination: PublicKey, authority: Signer | PublicKey, multiSigners: Signer[] = [], confirmOptions?: ConfirmOptions, programId = TOKEN_2022_PROGRAM_ID ): Promise { const [authorityPublicKey, signers] = getSigners(authority, multiSigners); const transaction = new Transaction().add( createWithdrawWithheldTokensFromMintInstruction(mint, destination, authorityPublicKey, signers, programId) ); return await sendAndConfirmTransaction(connection, transaction, [payer, ...signers], confirmOptions); } /** * Withdraw withheld tokens from accounts * * @param connection Connection to use * @param payer Payer of the transaction fees * @param mint The token mint * @param destination The destination account * @param authority The mint's withdraw withheld tokens authority * @param multiSigners Signing accounts if `owner` is a multisig * @param sources Source accounts from which to withdraw withheld fees * @param confirmOptions Options for confirming the transaction * @param programId CPL Token program account * * @return Signature of the confirmed transaction */ export async function withdrawWithheldTokensFromAccounts( connection: Connection, payer: Signer, mint: PublicKey, destination: PublicKey, authority: Signer | PublicKey, multiSigners: Signer[], sources: PublicKey[], confirmOptions?: ConfirmOptions, programId = TOKEN_2022_PROGRAM_ID ): Promise { const [authorityPublicKey, signers] = getSigners(authority, multiSigners); const transaction = new Transaction().add( createWithdrawWithheldTokensFromAccountsInstruction( mint, destination, authorityPublicKey, signers, sources, programId ) ); return await sendAndConfirmTransaction(connection, transaction, [payer, ...signers], confirmOptions); } /** * Harvest withheld tokens from accounts to the mint * * @param connection Connection to use * @param payer Payer of the transaction fees * @param mint The token mint * @param sources Source accounts from which to withdraw withheld fees * @param confirmOptions Options for confirming the transaction * @param programId CPL Token program account * * @return Signature of the confirmed transaction */ export async function harvestWithheldTokensToMint( connection: Connection, payer: Signer, mint: PublicKey, sources: PublicKey[], confirmOptions?: ConfirmOptions, programId = TOKEN_2022_PROGRAM_ID ): Promise { const transaction = new Transaction().add(createHarvestWithheldTokensToMintInstruction(mint, sources, programId)); return await sendAndConfirmTransaction(connection, transaction, [payer], confirmOptions); }