Тестирование токенов

Тестирование логики токенов на 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 перемещает токены между пользователями. Associated token account получателя создаётся автоматически при необходимости.

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 — это подписант, владеющий исходными токенами. Плагин определяет как исходный, так и целевой associated token account по их адресам и минту.

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

Чтобы считать балансы токенов, получите адрес 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 для сумм токенов. Number в JavaScript теряет точность при значениях выше 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Используйте то же значение decimals, которое вы передали в createMint
AccountNotFoundАккаунт ещё не существуетУбедитесь, что mint создан до выпуска токенов
InsufficientFundsНедостаточно lamport для rentПополните SOL на аккаунте плательщика через airdrop
OwnerMismatchНеверная программа владеет аккаунтомПроверьте ID программы

Is this page helpful?

Содержание

Редактировать страницу