Тестування токенів

Тестування логіки токенів на Solana означає налаштування мінтів, token accounts і повноважень, перш ніж ви зможете протестувати логіку переказів, яка вас насправді цікавить. Плагін tokenProgram() від @solana-program/token скорочує це налаштування до кількох викликів методів — і автоматично обробляє створення ATA.

Встановлення

pnpm add @solana/kit @solana/kit-plugin-litesvm @solana/kit-plugin-signer @solana-program/token

Створення мінту

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

Мінтинг токенів

mintToATA випускає токени на associated token account власника. Якщо ATA не існує, він створюється в тій самій транзакції.

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();

Параметр decimals — це перевірка безпеки: він має точно збігатися з кількістю десяткових знаків мінту, інакше Token Program відхилить транзакцію з помилкою 0x24. Це запобігає випадковому мінтингу в 1000 разів більшої кількості токенів.

Переказ токенів

transferToATA переміщує токени між користувачами. ATA отримувача створюється автоматично, якщо потрібно.

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 — це підписант, який володіє вихідними токенами. Плагін визначає як вихідний, так і цільовий ATA за їхніми адресами та мінтом.

Перевірка балансів

Щоб зчитати баланси токенів, отримайте адресу ATA за допомогою findAssociatedTokenPda та завантажте декодований акаунт:

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

Десяткові знаки

Суми токенів завжди вказуються в необроблених одиницях. 1000 токенів із 9 десятковими знаками — це 1_000_000_000_000n, а не 1000n.

// USDC has 6 decimals
const oneUSDC = 10n ** 6n; // 1_000_000n
// SOL has 9 decimals
const oneSOL = 10n ** 9n; // 1_000_000_000n

Завжди використовуйте BigInt для сум токенів. JavaScript's Number втрачає точність вище 2^53.

Довідник плагіна

МетодОпис
client.token.instructions.createMint()Створити новий SPL token mint
client.token.instructions.mintToATA()Мінтити токени на ATA власника (створює ATA за потреби)
client.token.instructions.transferToATA()Перенести токени на ATA отримувача (створює ATA за потреби)
client.token.accounts.mint.fetch()Отримати та декодувати mint account
client.token.accounts.token.fetch()Отримати та декодувати token account

Поширені помилки

ПомилкаПричинаВиправлення
custom program error: 0x24decimals не відповідає mintВикористовуйте те саме значення десяткових знаків, яке ви передали до createMint
AccountNotFoundАкаунт ще не існуєПереконайтеся, що mint створено перед мінтингом
InsufficientFundsНедостатньо lamport для rentПоповніть SOL на рахунок платника через airdrop
OwnerMismatchПрограма є неправильним власником акаунтаПеревірте ID програми

Is this page helpful?

Зміст

Редагувати сторінку