import * as anchor from "@coral-xyz/anchor"; import { Program } from "@coral-xyz/anchor"; import { TransferFee } from "../target/types/transfer_fee"; import { TOKEN_2022_PROGRAM_ID, getAssociatedTokenAddressSync, getOrCreateAssociatedTokenAccount, mintTo, } from "@solana/spl-token"; import { ASSOCIATED_PROGRAM_ID } from "@coral-xyz/anchor/dist/cjs/utils/token"; describe("transfer-fee", () => { const provider = anchor.AnchorProvider.env(); const connection = provider.connection; const wallet = provider.wallet as anchor.Wallet; anchor.setProvider(provider); const program = anchor.workspace.TransferFee as Program; const mintKeypair = new anchor.web3.Keypair(); const recipient = new anchor.web3.Keypair(); const senderTokenAccountAddress = getAssociatedTokenAddressSync( mintKeypair.publicKey, wallet.publicKey, false, TOKEN_2022_PROGRAM_ID ); const recipientTokenAccountAddress = getAssociatedTokenAddressSync( mintKeypair.publicKey, recipient.publicKey, false, TOKEN_2022_PROGRAM_ID ); it("Create Mint with Transfer Fee", async () => { const transferFeeBasisPoints = 100; const maximumFee = 1; const transactionSignature = await program.methods .initialize(transferFeeBasisPoints, new anchor.BN(maximumFee)) .accounts({ mintAccount: mintKeypair.publicKey }) .signers([mintKeypair]) .rpc({ skipPreflight: true }); console.log("Your transaction signature", transactionSignature); }); it("Mint Tokens", async () => { await getOrCreateAssociatedTokenAccount( connection, wallet.payer, mintKeypair.publicKey, wallet.publicKey, false, null, null, TOKEN_2022_PROGRAM_ID, ASSOCIATED_PROGRAM_ID ); await mintTo( connection, wallet.payer, mintKeypair.publicKey, senderTokenAccountAddress, wallet.payer, 300, [], null, TOKEN_2022_PROGRAM_ID ); }); it("Transfer", async () => { const transactionSignature = await program.methods .transfer(new anchor.BN(100)) .accounts({ sender: wallet.publicKey, recipient: recipient.publicKey, mintAccount: mintKeypair.publicKey, senderTokenAccount: senderTokenAccountAddress, recipientTokenAccount: recipientTokenAccountAddress, }) .rpc({ skipPreflight: true }); console.log("Your transaction signature", transactionSignature); }); it("Transfer Again, fee limit by maximumFee", async () => { const transactionSignature = await program.methods .transfer(new anchor.BN(200)) .accounts({ sender: wallet.publicKey, recipient: recipient.publicKey, mintAccount: mintKeypair.publicKey, senderTokenAccount: senderTokenAccountAddress, recipientTokenAccount: recipientTokenAccountAddress, }) .rpc({ skipPreflight: true }); console.log("Your transaction signature", transactionSignature); }); it("Harvest Transfer Fees to Mint Account", async () => { const transactionSignature = await program.methods .harvest() .accounts({ mintAccount: mintKeypair.publicKey }) .remainingAccounts([ { pubkey: recipientTokenAccountAddress, isSigner: false, isWritable: true, }, ]) .rpc({ skipPreflight: true }); console.log("Your transaction signature", transactionSignature); }); it("Withdraw Transfer Fees from Mint Account", async () => { const transactionSignature = await program.methods .withdraw() .accounts({ mintAccount: mintKeypair.publicKey, tokenAccount: senderTokenAccountAddress, }) .rpc({ skipPreflight: true }); console.log("Your transaction signature", transactionSignature); }); it("Update Transfer Fee", async () => { const transferFeeBasisPoints = 0; const maximumFee = 0; const transactionSignature = await program.methods .updateFee(transferFeeBasisPoints, new anchor.BN(maximumFee)) .accounts({ mintAccount: mintKeypair.publicKey }) .rpc({ skipPreflight: true }); console.log("Your transaction signature", transactionSignature); }); });