Тестирование логики токенов на 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();// Verifyconst mintAccount = await client.token.accounts.mint.fetch(newMint.address);console.log(mintAccount.data.supply); // 0nconsole.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 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 — это подписант, владеющий исходными токенами. Плагин определяет как
исходный, так и целевой 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_000nconsole.log(aliceAccount.data.mint); // newMint.addressconsole.log(aliceAccount.data.owner); // alice.address
Десятичные знаки
Суммы токенов всегда указываются в минимальных единицах. 1000 токенов с 9
знаками после запятой — это 1_000_000_000_000n, а не 1000n.
// USDC has 6 decimalsconst oneUSDC = 10n ** 6n; // 1_000_000n// SOL has 9 decimalsconst 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: 0x24 | decimals не соответствует mint | Используйте то же значение decimals, которое вы передали в createMint |
AccountNotFound | Аккаунт ещё не существует | Убедитесь, что mint создан до выпуска токенов |
InsufficientFunds | Недостаточно lamport для rent | Пополните SOL на аккаунте плательщика через airdrop |
OwnerMismatch | Неверная программа владеет аккаунтом | Проверьте ID программы |
Is this page helpful?