Kiểm thử logic token trên Solana có nghĩa là phải thiết lập các mint, token
account và các authority trước khi bạn có thể kiểm thử logic chuyển token mà bạn
thực sự quan tâm. Plugin tokenProgram() từ @solana-program/token rút gọn quá
trình thiết lập đó xuống còn vài lần gọi phương thức — và tự động xử lý việc tạo
ATA.
Cài Đặt
pnpm add @solana/kit @solana/kit-plugin-litesvm @solana/kit-plugin-signer @solana-program/token
Tạo Mint
import { createClient, generateKeyPairSigner, lamports } from "@solana/kit";import { litesvm } from "@solana/kit-plugin-litesvm";import { signer } from "@solana/kit-plugin-signer";import { tokenProgram } from "@solana-program/token";const mySigner = await generateKeyPairSigner();const client = createClient().use(signer(mySigner)).use(litesvm()).use(tokenProgram());client.svm.airdrop(client.payer.address, lamports(10_000_000_000n));const mintAuthority = await generateKeyPairSigner();const newMint = await generateKeyPairSigner();await client.token.instructions.createMint({newMint,decimals: 9,mintAuthority: mintAuthority.address}).sendTransaction();// Verifyconst mintAccount = await client.token.accounts.mint.fetch(newMint.address);console.log(mintAccount.data.supply); // 0nconsole.log(mintAccount.data.decimals); // 9
Phát Hành Token
mintToATA phát hành token đến associated token account của chủ sở hữu. Nếu ATA
chưa tồn tại, nó sẽ được tạo trong cùng một giao dịch.
await client.token.instructions.mintToATA({mint: newMint.address,owner: client.payer.address,mintAuthority,amount: 1_000_000_000_000n, // 1000 tokens (9 decimals)decimals: 9}).sendTransaction();
Tham số decimals là một kiểm tra an toàn — nó phải khớp chính xác với số thập
phân của mint, hoặc Token Program sẽ từ chối giao dịch với lỗi 0x24. Điều này
ngăn chặn việc vô tình phát hành nhiều hơn 1000 lần số token cần thiết.
Chuyển Token
transferToATA di chuyển token giữa các người dùng. ATA của người nhận sẽ được
tạo tự động nếu cần.
const alice = await generateKeyPairSigner();const bob = await generateKeyPairSigner();// Mint to Aliceawait client.token.instructions.mintToATA({mint: newMint.address,owner: alice.address,mintAuthority,amount: 1_000_000_000_000n,decimals: 9}).sendTransaction();// Transfer 400 tokens from Alice to Bobawait client.token.instructions.transferToATA({mint: newMint.address,authority: alice,recipient: bob.address,amount: 400_000_000_000n,decimals: 9}).sendTransaction();
authority là người ký sở hữu các token nguồn. Plugin suy ra cả ATA nguồn lẫn
ATA đích từ địa chỉ của họ kết hợp với mint.
Xác Minh Số Dư
Để đọc lại số dư token, hãy lấy địa chỉ ATA bằng findAssociatedTokenPda và tải
tài khoản đã giải mã:
import {findAssociatedTokenPda,TOKEN_PROGRAM_ADDRESS} from "@solana-program/token";const [aliceAta] = await findAssociatedTokenPda({owner: alice.address,mint: newMint.address,tokenProgram: TOKEN_PROGRAM_ADDRESS});const aliceAccount = await client.token.accounts.token.fetch(aliceAta);console.log(aliceAccount.data.amount); // 600_000_000_000nconsole.log(aliceAccount.data.mint); // newMint.addressconsole.log(aliceAccount.data.owner); // alice.address
Số thập phân
Số lượng token luôn ở dạng đơn vị thô. 1000 token với 9 chữ số thập phân là
1_000_000_000_000n, không phải 1000n.
// USDC has 6 decimalsconst oneUSDC = 10n ** 6n; // 1_000_000n// SOL has 9 decimalsconst oneSOL = 10n ** 9n; // 1_000_000_000n
Luôn sử dụng BigInt cho số lượng token. Number của JavaScript mất độ chính
xác với giá trị trên 2^53.
Tham chiếu Plugin
| Phương thức | Mô tả |
|---|---|
client.token.instructions.createMint() | Tạo một SPL token mint mới |
client.token.instructions.mintToATA() | Mint token vào ATA của chủ sở hữu (tạo ATA nếu chưa có) |
client.token.instructions.transferToATA() | Chuyển token đến ATA của người nhận (tạo ATA nếu chưa có) |
client.token.accounts.mint.fetch() | Tải và giải mã một mint account |
client.token.accounts.token.fetch() | Tải và giải mã một token account |
Lỗi Thường Gặp
| Lỗi | Nguyên nhân | Cách khắc phục |
|---|---|---|
custom program error: 0x24 | decimals không khớp với mint | Sử dụng cùng giá trị decimals mà bạn đã truyền vào createMint |
AccountNotFound | Tài khoản chưa tồn tại | Đảm bảo mint đã được tạo trước khi thực hiện mint |
InsufficientFunds | Không đủ lamport cho rent | Airdrop thêm SOL cho người thanh toán |
OwnerMismatch | Sai chương trình sở hữu tài khoản | Kiểm tra program ID |
Is this page helpful?