Testare la logica dei token su Solana significa configurare mint, token account
e autorità prima di poter testare la logica di trasferimento che interessa
davvero. Il plugin tokenProgram() di @solana-program/token riduce quella
configurazione a poche chiamate di metodo — e gestisce automaticamente la
creazione degli ATA.
Installazione
pnpm add @solana/kit @solana/kit-plugin-litesvm @solana/kit-plugin-signer @solana-program/token
Crea 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
Emetti Token
mintToATA emette token sull'associated token account del proprietario. Se
l'ATA non esiste, viene creato nella stessa transazione.
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();
Il parametro decimals è un controllo di sicurezza — deve corrispondere
esattamente ai decimali del mint, altrimenti il Token Program rifiuta la
transazione con l'errore 0x24. Questo evita di emettere accidentalmente 1000
volte più token del previsto.
Trasferisci Token
transferToATA sposta token tra utenti. L'ATA del destinatario viene creato
automaticamente se necessario.
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();
Il authority è il firmatario che possiede i token sorgente. Il plugin deriva
sia l'ATA sorgente che quello di destinazione dai loro indirizzi e dal mint.
Verifica dei Saldi
Per leggere i saldi dei token, deriva l'indirizzo ATA con
findAssociatedTokenPda e recupera l'account decodificato:
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
Decimali
Gli importi dei token sono sempre in unità grezze. 1000 token con 9 decimali
corrisponde a 1_000_000_000_000n, non 1000n.
// USDC has 6 decimalsconst oneUSDC = 10n ** 6n; // 1_000_000n// SOL has 9 decimalsconst oneSOL = 10n ** 9n; // 1_000_000_000n
Usa sempre BigInt per gli importi dei token. Il tipo Number di JavaScript
perde precisione oltre 2^53.
Riferimento Plugin
| Metodo | Descrizione |
|---|---|
client.token.instructions.createMint() | Crea un nuovo mint SPL token |
client.token.instructions.mintToATA() | Esegue il mint di token sull'ATA del proprietario (crea l'ATA se necessario) |
client.token.instructions.transferToATA() | Trasferisce token all'ATA del destinatario (crea l'ATA se necessario) |
client.token.accounts.mint.fetch() | Recupera e decodifica un mint account |
client.token.accounts.token.fetch() | Recupera e decodifica un token account |
Errori Comuni
| Errore | Causa | Soluzione |
|---|---|---|
custom program error: 0x24 | decimals non corrisponde al mint | Usa lo stesso valore decimals passato a createMint |
AccountNotFound | L'account non esiste ancora | Assicurati che il mint sia creato prima di eseguire il minting |
InsufficientFunds | lamport insufficienti per il rent | Esegui un airdrop di SOL aggiuntivo al pagante |
OwnerMismatch | Il programma proprietario dell'account non è corretto | Verifica il program ID |
Is this page helpful?