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();// Verifyconst mintAccount = await client.token.accounts.mint.fetch(newMint.address);console.log(mintAccount.data.supply); // 0nconsole.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 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 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_000nconsole.log(aliceAccount.data.mint); // newMint.addressconsole.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 decimalsconst oneUSDC = 10n ** 6n; // 1_000_000n// SOL has 9 decimalsconst 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
| Metoda | Opis |
|---|---|
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łąd | Przyczyna | Rozwiązanie |
|---|---|---|
custom program error: 0x24 | decimals nie zgadza się z mintem | Użyj tej samej wartości dziesiętnej, którą przekazałeś do createMint |
AccountNotFound | Konto jeszcze nie istnieje | Upewnij się, że mint został utworzony przed mintowaniem |
InsufficientFunds | Za mało lamport na rent | Wykonaj airdrop większej ilości SOL do płatnika |
OwnerMismatch | Nieprawidłowy program jest właścicielem konta | Sprawdź ID programu |
Is this page helpful?