Menguji logika token di Solana berarti menyiapkan mint, token account, dan
otoritas sebelum Anda dapat menguji logika transfer yang sebenarnya ingin Anda
uji. Plugin tokenProgram() dari @solana-program/token menyederhanakan
penyiapan tersebut menjadi beberapa pemanggilan metode — dan menangani pembuatan
ATA secara otomatis.
Instalasi
pnpm add @solana/kit @solana/kit-plugin-litesvm @solana/kit-plugin-signer @solana-program/token
Buat 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
Mint Token
mintToATA menerbitkan token ke associated token account milik pemilik. Jika
ATA belum ada, ATA akan dibuat dalam transaksi yang sama.
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();
Parameter decimals adalah pemeriksaan keamanan — nilainya harus cocok persis
dengan desimal mint, sinon Token Program akan menolak transaksi dengan error
0x24. Ini mencegah pembuatan token yang secara tidak sengaja 1000x lebih
banyak dari yang seharusnya.
Transfer Token
transferToATA memindahkan token antar pengguna. ATA penerima dibuat secara
otomatis jika diperlukan.
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 adalah penanda tangan yang memiliki token sumber. Plugin ini
menurunkan baik ATA sumber maupun tujuan dari alamat mereka + mint.
Memverifikasi Saldo
Untuk membaca kembali saldo token, turunkan alamat ATA dengan
findAssociatedTokenPda dan ambil akun yang telah didekode:
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
Desimal
Jumlah token selalu dalam satuan mentah. 1000 token dengan 9 desimal adalah
1_000_000_000_000n, bukan 1000n.
// USDC has 6 decimalsconst oneUSDC = 10n ** 6n; // 1_000_000n// SOL has 9 decimalsconst oneSOL = 10n ** 9n; // 1_000_000_000n
Selalu gunakan BigInt untuk jumlah token. Number milik JavaScript
kehilangan presisi di atas 2^53.
Referensi Plugin
| Method | Description |
|---|---|
client.token.instructions.createMint() | Buat mint token SPL baru |
client.token.instructions.mintToATA() | Mint token ke ATA pemilik (membuat ATA jika diperlukan) |
client.token.instructions.transferToATA() | Transfer token ke ATA penerima (membuat ATA jika diperlukan) |
client.token.accounts.mint.fetch() | Ambil dan dekode mint account |
client.token.accounts.token.fetch() | Ambil dan dekode token account |
Kesalahan Umum
| Error | Cause | Fix |
|---|---|---|
custom program error: 0x24 | decimals tidak cocok dengan mint | Gunakan nilai desimal yang sama yang Anda berikan ke createMint |
AccountNotFound | Akun belum ada | Pastikan mint dibuat sebelum melakukan minting |
InsufficientFunds | lamport tidak cukup untuk rent | Airdrop lebih banyak SOL ke pembayar |
OwnerMismatch | Program yang salah memiliki akun | Periksa ID program |
Is this page helpful?