Kiểm Thử Token

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();
// Verify
const mintAccount = await client.token.accounts.mint.fetch(newMint.address);
console.log(mintAccount.data.supply); // 0n
console.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 Alice
await 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 Bob
await 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_000n
console.log(aliceAccount.data.mint); // newMint.address
console.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 decimals
const oneUSDC = 10n ** 6n; // 1_000_000n
// SOL has 9 decimals
const 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ứcMô 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ỗiNguyên nhânCách khắc phục
custom program error: 0x24decimals không khớp với mintSử dụng cùng giá trị decimals mà bạn đã truyền vào createMint
AccountNotFoundTài khoản chưa tồn tạiĐảm bảo mint đã được tạo trước khi thực hiện mint
InsufficientFundsKhông đủ lamport cho rentAirdrop thêm SOL cho người thanh toán
OwnerMismatchSai chương trình sở hữu tài khoảnKiểm tra program ID

Is this page helpful?

Mục lục

Chỉnh sửa trang