Het testen van tokenlogica op Solana betekent het instellen van mints, token
accounts en autorisaties voordat je de transferlogica kunt testen die je
eigenlijk wilt controleren. De tokenProgram()-plugin van
@solana-program/token reduceert die setup tot een aantal methodeaanroepen — en
verwerkt het aanmaken van ATA's automatisch.
Installatie
pnpm add @solana/kit @solana/kit-plugin-litesvm @solana/kit-plugin-signer @solana-program/token
Een Mint Aanmaken
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
Tokens Minten
mintToATA geeft tokens uit aan de Associated Token Account van een eigenaar.
Als de ATA niet bestaat, wordt deze aangemaakt in dezelfde transactie.
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();
De parameter decimals is een veiligheidscontrole — deze moet exact
overeenkomen met de decimalen van de mint, anders wijst het Token Program de
transactie af met fout 0x24. Dit voorkomt dat je per ongeluk 1000x te veel
tokens mint.
Tokens Overdragen
transferToATA verplaatst tokens tussen gebruikers. De ATA van de ontvanger
wordt automatisch aangemaakt indien nodig.
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();
De authority is de ondertekenaar die de brontokens bezit. De plugin leidt
zowel de bron- als de bestemmings-ATA's af van hun adressen en de mint.
Saldi Verifiëren
Om tokenbalansen terug te lezen, leid het ATA-adres af met
findAssociatedTokenPda en haal het gedecodeerde account op:
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
Decimalen
Tokenbedragen zijn altijd in ruwe eenheden. 1000 tokens met 9 decimalen is
1_000_000_000_000n, niet 1000n.
// USDC has 6 decimalsconst oneUSDC = 10n ** 6n; // 1_000_000n// SOL has 9 decimalsconst oneSOL = 10n ** 9n; // 1_000_000_000n
Gebruik altijd BigInt voor tokenbedragen. JavaScript's Number verliest
precisie boven 2^53.
Plugin Referentie
| Methode | Beschrijving |
|---|---|
client.token.instructions.createMint() | Maak een nieuw SPL token mint aan |
client.token.instructions.mintToATA() | Mint tokens naar de ATA van een eigenaar (maakt ATA aan indien nodig) |
client.token.instructions.transferToATA() | Stuur tokens over naar de ATA van een ontvanger (maakt ATA aan indien nodig) |
client.token.accounts.mint.fetch() | Haal een mint account op en decodeer het |
client.token.accounts.token.fetch() | Haal een token account op en decodeer het |
Veelvoorkomende Fouten
| Fout | Oorzaak | Oplossing |
|---|---|---|
custom program error: 0x24 | decimals komt niet overeen met de mint | Gebruik dezelfde decimalen waarde die je hebt doorgegeven aan createMint |
AccountNotFound | Account bestaat nog niet | Zorg dat de mint is aangemaakt voordat je tokens mint |
InsufficientFunds | Niet genoeg lamports voor rent | Stort meer SOL bij op het betaalaccount |
OwnerMismatch | Verkeerd programma is eigenaar van het account | Controleer het programma-ID |
Is this page helpful?