Testes de Token

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();
// Verify
const mintAccount = await client.token.accounts.mint.fetch(newMint.address);
console.log(mintAccount.data.supply); // 0n
console.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 Alice
await 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 Bob
await 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_000n
console.log(aliceAccount.data.mint); // newMint.address
console.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 decimals
const oneUSDC = 10n ** 6n; // 1_000_000n
// SOL has 9 decimals
const 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étodoDescriçã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

ErroCausaSolução
custom program error: 0x24decimals não corresponde ao mintUse o mesmo valor de decimais que foi passado para createMint
AccountNotFoundA conta ainda não existeCertifique-se de que o mint foi criado antes de mintar
InsufficientFundslamports insuficientes para rentFaça airdrop de mais SOL para o pagador
OwnerMismatchO programa errado é proprietário da contaVerifique o ID do programa

Is this page helpful?

Índice

Editar Página
© 2026 Fundação Solana. Todos os direitos reservados.