Tester la logique des tokens sur Solana implique de configurer des mints, des
token accounts et des autorités avant de pouvoir tester la logique de transfert
qui vous intéresse réellement. Le plugin tokenProgram() de
@solana-program/token réduit cette configuration à quelques appels de méthodes
— et gère automatiquement la création des ATA.
Installation
pnpm add @solana/kit @solana/kit-plugin-litesvm @solana/kit-plugin-signer @solana-program/token
Créer un Mint
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
Émettre des tokens
mintToATA émet des tokens vers l'associated token account du propriétaire. Si
l'ATA n'existe pas, il est créé dans la même transaction.
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();
Le paramètre decimals est une vérification de sécurité — il doit correspondre
exactement aux décimales du mint, sinon le Token Program rejette la transaction
avec l'erreur 0x24. Cela évite de minter accidentellement 1000 fois trop de
tokens.
Transférer des tokens
transferToATA déplace des tokens entre utilisateurs. L'ATA du destinataire est
créé automatiquement si nécessaire.
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();
Le authority est le signataire propriétaire des tokens source. Le plugin
dérive les ATA source et destination à partir de leurs adresses et du mint.
Vérification des soldes
Pour lire les soldes de tokens, dérivez l'adresse ATA avec
findAssociatedTokenPda et récupérez le compte décodé :
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
Décimales
Les montants de tokens sont toujours exprimés en unités brutes. 1000 tokens avec
9 décimales correspondent à 1_000_000_000_000n, et non à 1000n.
// USDC has 6 decimalsconst oneUSDC = 10n ** 6n; // 1_000_000n// SOL has 9 decimalsconst oneSOL = 10n ** 9n; // 1_000_000_000n
Utilisez toujours BigInt pour les montants de tokens. Le type Number de
JavaScript perd en précision au-delà de 2^53.
Référence des plugins
| Méthode | Description |
|---|---|
client.token.instructions.createMint() | Créer un nouveau mint account SPL |
client.token.instructions.mintToATA() | Minter des tokens vers l'ATA d'un propriétaire (crée l'ATA si nécessaire) |
client.token.instructions.transferToATA() | Transférer des tokens vers l'ATA d'un destinataire (crée l'ATA si nécessaire) |
client.token.accounts.mint.fetch() | Récupérer et décoder un mint account |
client.token.accounts.token.fetch() | Récupérer et décoder un token account |
Erreurs courantes
| Erreur | Cause | Correction |
|---|---|---|
custom program error: 0x24 | decimals ne correspond pas au mint | Utilisez la même valeur de décimales que celle passée à createMint |
AccountNotFound | Le compte n'existe pas encore | Assurez-vous que le mint est créé avant de minter |
InsufficientFunds | Pas assez de lamports pour le rent | Effectuez un airdrop de SOL supplémentaire vers le payeur |
OwnerMismatch | Le mauvais programme possède le compte | Vérifiez l'ID du programme |
Is this page helpful?