Testowanie tokenów

Testowanie logiki tokenów na Solanie oznacza konfigurowanie mintów, token accounts i uprawień, zanim będzie można przetestować właściwą logikę transferów. Wtyczka tokenProgram() z @solana-program/token sprowadza tę konfigurację do kilku wywołań metod — i automatycznie obsługuje tworzenie ATA.

Instalacja

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

Tworzenie minta

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

Mintowanie tokenów

mintToATA wydaje tokeny na associated token account właściciela. Jeśli ATA nie istnieje, jest tworzony w tej samej transakcji.

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

Parametr decimals to zabezpieczenie — musi dokładnie odpowiadać liczbie miejsc dziesiętnych minta, w przeciwnym razie Token Program odrzuci transakcję z błędem 0x24. Zapobiega to przypadkowemu wybiciem 1000x zbyt wielu tokenów.

Transfer tokenów

transferToATA przenosi tokeny między użytkownikami. Associated token account odbiorcy jest tworzony automatycznie, jeśli zajdzie taka potrzeba.

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 to sygnatariusz będący właścicielem tokenów źródłowych. Wtyczka wyprowadza zarówno źródłowe, jak i docelowe ATA na podstawie ich adresów oraz minta.

Weryfikacja sald

Aby odczytać salda tokenów, wyprowadź adres ATA za pomocą findAssociatedTokenPda i pobierz zdekodowane konto:

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

Dziesiętne

Kwoty tokenów są zawsze w jednostkach surowych. 1000 tokenów z 9 miejscami dziesiętnymi to 1_000_000_000_000n, a nie 1000n.

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

Zawsze używaj BigInt do kwot tokenów. JavaScript's Number traci precyzję powyżej 2^53.

Dokumentacja wtyczki

MetodaOpis
client.token.instructions.createMint()Utwórz nowy mint SPL token
client.token.instructions.mintToATA()Mintuj tokeny do ATA właściciela (tworzy ATA jeśli potrzeba)
client.token.instructions.transferToATA()Prześlij tokeny do ATA odbiorcy (tworzy ATA jeśli potrzeba)
client.token.accounts.mint.fetch()Pobierz i zdekoduj mint account
client.token.accounts.token.fetch()Pobierz i zdekoduj token account

Częste błędy

BłądPrzyczynaRozwiązanie
custom program error: 0x24decimals nie zgadza się z mintemUżyj tej samej wartości dziesiętnej, którą przekazałeś do createMint
AccountNotFoundKonto jeszcze nie istniejeUpewnij się, że mint został utworzony przed mintowaniem
InsufficientFundsZa mało lamport na rentWykonaj airdrop większej ilości SOL do płatnika
OwnerMismatchNieprawidłowy program jest właścicielem kontaSprawdź ID programu

Is this page helpful?

Spis treści

Edytuj stronę