Testar a lógica de tokens no Solana significa configurar mints, token accounts e
autoridades antes de poder testar a lógica de transferência que realmente
importa. O plugin tokenProgram() do @solana-program/token reduz essa
configuração a poucas chamadas de método — e gerencia a criação de ATAs
automaticamente.
Instalação
pnpm add @solana/kit @solana/kit-plugin-litesvm @solana/kit-plugin-signer @solana-program/token
Criar um 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
Emitir Tokens
mintToATA emite tokens para o associated token account do proprietário. Se o
ATA não existir, ele é criado na mesma transação.
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();
O parâmetro decimals é uma verificação de segurança — ele deve corresponder
exatamente aos decimais do mint, caso contrário, o Token Program rejeita a
transação com o erro 0x24. Isso evita a emissão acidental de 1000x mais tokens
do que o pretendido.
Transferir Tokens
transferToATA move tokens entre usuários. O ATA do destinatário é criado
automaticamente, se necessário.
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();
O authority é o signatário que possui os tokens de origem. O plugin deriva os
ATAs de origem e destino a partir de seus endereços e do mint.
Verificando Saldos
Para ler os saldos de tokens, derive o endereço ATA com findAssociatedTokenPda
e busque a conta decodificada:
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
Decimais
Os valores de tokens são sempre em unidades brutas. 1000 tokens com 9 casas
decimais equivale a 1_000_000_000_000n, não 1000n.
// USDC has 6 decimalsconst oneUSDC = 10n ** 6n; // 1_000_000n// SOL has 9 decimalsconst oneSOL = 10n ** 9n; // 1_000_000_000n
Sempre use BigInt para valores de tokens. O Number do JavaScript perde
precisão acima de 2^53.
Referência de Plugins
| Método | Descrição |
|---|---|
client.token.instructions.createMint() | Criar um novo mint SPL token |
client.token.instructions.mintToATA() | Mintar tokens para a ATA do proprietário (cria a ATA se necessário) |
client.token.instructions.transferToATA() | Transferir tokens para a ATA do destinatário (cria a ATA se necessário) |
client.token.accounts.mint.fetch() | Buscar e decodificar um mint account |
client.token.accounts.token.fetch() | Buscar e decodificar um token account |
Erros Comuns
| Erro | Causa | Solução |
|---|---|---|
custom program error: 0x24 | decimals não corresponde ao mint | Use o mesmo valor de decimais que foi passado para createMint |
AccountNotFound | A conta ainda não existe | Certifique-se de que o mint foi criado antes de mintar |
InsufficientFunds | lamports insuficientes para rent | Faça airdrop de mais SOL para o pagador |
OwnerMismatch | O programa errado é proprietário da conta | Verifique o ID do programa |
Is this page helpful?