Pruebas de Tokens

Probar la lógica de tokens en Solana implica configurar mints, token accounts y autoridades antes de poder probar la lógica de transferencia que realmente te interesa. El plugin tokenProgram() de @solana-program/token reduce esa configuración a unas pocas llamadas a métodos — y gestiona la creación de ATA automáticamente.

Instalación

pnpm add @solana/kit @solana/kit-plugin-litesvm @solana/kit-plugin-signer @solana-program/token

Crear 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();
// Verify
const mintAccount = await client.token.accounts.mint.fetch(newMint.address);
console.log(mintAccount.data.supply); // 0n
console.log(mintAccount.data.decimals); // 9

Acuñar Tokens

mintToATA emite tokens a la associated token account del propietario. Si la ATA no existe, se crea en la misma transacción.

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();

El parámetro decimals es una verificación de seguridad — debe coincidir exactamente con los decimales del mint, o el Token Program rechaza la transacción con el error 0x24. Esto evita acuñar accidentalmente 1000 veces más tokens de los previstos.

Transferir Tokens

transferToATA mueve tokens entre usuarios. La ATA del destinatario se crea automáticamente si es necesario.

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();

El authority es el firmante que posee los tokens de origen. El plugin deriva tanto la ATA de origen como la de destino a partir de sus direcciones y el mint.

Verificación de Saldos

Para leer los saldos de tokens, deriva la dirección ATA con findAssociatedTokenPda y obtén la cuenta 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

Decimales

Las cantidades de tokens siempre están en unidades brutas. 1000 tokens con 9 decimales es 1_000_000_000_000n, no 1000n.

// USDC has 6 decimals
const oneUSDC = 10n ** 6n; // 1_000_000n
// SOL has 9 decimals
const oneSOL = 10n ** 9n; // 1_000_000_000n

Utiliza siempre BigInt para las cantidades de tokens. El tipo Number de JavaScript pierde precisión por encima de 2^53.

Referencia de Plugins

MétodoDescripción
client.token.instructions.createMint()Crear un nuevo mint de token SPL
client.token.instructions.mintToATA()Acuñar tokens en el ATA del propietario (crea el ATA si es necesario)
client.token.instructions.transferToATA()Transferir tokens al ATA del destinatario (crea el ATA si es necesario)
client.token.accounts.mint.fetch()Obtener y decodificar un mint account
client.token.accounts.token.fetch()Obtener y decodificar un token account

Errores Comunes

ErrorCausaSolución
custom program error: 0x24decimals no coincide con el mintUsa el mismo valor de decimales que pasaste a createMint
AccountNotFoundLa cuenta aún no existeAsegúrate de que el mint esté creado antes de acuñar
InsufficientFundsNo hay suficientes lamports para rentHaz un airdrop de más SOL al pagador
OwnerMismatchEl programa incorrecto es propietario de la cuentaVerifica el ID del programa

Is this page helpful?

Tabla de Contenidos

Editar Página