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();// Verifyconst mintAccount = await client.token.accounts.mint.fetch(newMint.address);console.log(mintAccount.data.supply); // 0nconsole.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 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();
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_000nconsole.log(aliceAccount.data.mint); // newMint.addressconsole.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 decimalsconst oneUSDC = 10n ** 6n; // 1_000_000n// SOL has 9 decimalsconst 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étodo | Descripció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
| Error | Causa | Solución |
|---|---|---|
custom program error: 0x24 | decimals no coincide con el mint | Usa el mismo valor de decimales que pasaste a createMint |
AccountNotFound | La cuenta aún no existe | Asegúrate de que el mint esté creado antes de acuñar |
InsufficientFunds | No hay suficientes lamports para rent | Haz un airdrop de más SOL al pagador |
OwnerMismatch | El programa incorrecto es propietario de la cuenta | Verifica el ID del programa |
Is this page helpful?