Conceptos básicos de SPL Token
9 ejemplos para empezar con SPL Token: 7 básicos y 2 intermedios.
Prerrequisitos
solana config set --url devnet
solana airdrop 2
spl-token --versioncargo add anchor-lang@0.32.1 anchor-spl@0.32.1
npm install @solana/kit@7.0.0ID del programa SPL Token: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA.
Ejemplos básicos
1. Crear una Mint
Una cuenta de mint define los decimales, el suministro y las autoridades.
spl-token create-token --decimals 6decimalsestablece cómo las cantidades sin procesar se mapean a valores legibles por humanos- La autoridad de mint puede emitir más hasta que se revoque
- La autoridad de congelación es opcional;
Nonesignifica que las cuentas no se pueden congelar
Relacionado: Emisión y Quema - cambios de suministro
2. Inspeccionar el estado de la Mint
Lee los campos de suministro y autoridad antes de integrar clientes.
spl-token display <MINT>Supplyson unidades enteras sin procesar (no cantidad de UI)Mint authoritypubkey controla la inflaciónFreeze authoritydedisabledsignifica que no hay capacidad de congelación
Relacionado: Autoridades - patrones de revocación
3. Crear una Cuenta de Token (ATA)
Las billeteras mantienen saldos en cuentas de token, no en la mint en sí.
spl-token create-account <MINT>- La dirección de la Cuenta de Token Asociada (ATA) es un PDA a partir de la billetera + mint
- Una ATA por billetera por mint es el patrón de UX estándar
- El tamaño de la cuenta es de 165 bytes (~2M lamports exentos de alquiler)
Relacionado: Cuentas de Token Asociadas (ATAs)
4. Emitir Tokens a una ATA
Aumenta el suministro acreditando una cuenta de token.
spl-token mint <MINT> 10000001000000unidades sin procesar = 1.0 token cuando decimals = 6- Requiere que el firmante posea la autoridad de mint
- El suministro se actualiza en la cuenta de mint atómicamente
Relacionado: Decimales y Cantidades
5. Transferir entre Cuentas de Token
Mueve saldos sin cambiar el suministro total.
spl-token transfer <MINT> 500000 <RECIPIENT_WALLET> --fund-recipient- La fuente debe ser tu ATA para esa mint
--fund-recipientcrea la ATA del destinatario si falta- Los delegados pueden transferir en nombre del propietario cuando se aprueban
Relacionado: Transferencias y Delegados
6. Leer Saldos con @solana/kit
Los clientes consultan cuentas de token a través de RPC estándar.
import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const owner = address("YOUR_WALLET");
const { value } = await rpc
.getTokenAccountsByOwner(owner, { mint: address("MINT_PUBKEY") }, { encoding: "jsonParsed" })
.send();
const balance = value[0]?.account.data.parsed.info.tokenAmount.uiAmount;
console.log("Balance:", balance);jsonParseddevuelve la cantidad de UI y la cantidad sin procesar juntas- Un array vacío significa que aún no existe una ATA para esa mint
- Usa DAS para metadatos NFT; usa RPC de token para saldos fungibles
Relacionado: SOL Envuelto - SOL nativo como SPL
7. Quemar para Reducir el Suministro
Elimina permanentemente tokens de la circulación.
spl-token burn <MINT> 100000- Quema desde tu saldo de ATA, no desde tenedores arbitrarios
- Disminuye el campo de suministro de la mint
- Común antes de revocar la autoridad de mint para tokens de suministro fijo
Relacionado: Emisión y Quema
Ejemplos intermedios
8. Transferencia CPI en un Programa Anchor
Los programas mueven tokens a través de invocaciones entre programas (CPI).
use anchor_lang::prelude::*;
use anchor_spl::token::{self, Token, TokenAccount, Transfer};
#[derive(Accounts)]
pub struct PayFee<'info> {
#[account(mut)]
pub user_token: Account<'info, TokenAccount>,
#[account(mut)]
pub treasury_token: Account<'info, TokenAccount>,
pub authority: Signer<'info>,
pub token_program: Program<'info, Token>,
}
pub fn pay_fee(ctx: Context<PayFee>, amount: u64) -> Result<()> {
let cpi = CpiContext::new(
ctx.accounts.token_program.to_account_info(),
Transfer {
from: ctx.accounts.user_token.to_account_info(),
to: ctx.accounts.treasury_token.to_account_info(),
authority: ctx.accounts.authority.to_account_info(),
},
);
token::transfer(cpi, amount)?;
Ok(())
}Account<'info, TokenAccount>deserializa el diseño SPL y valida el propietario- El firmante debe ser el propietario de la cuenta de token o un delegado aprobado
- Siempre valida que la mint coincida en las cuentas de origen/destino en producción
Relacionado: SPL Token en Programas
9. Revocar Autoridad de Mint (Suministro Fijo)
Bloquea el suministro después de la distribución inicial.
spl-token authorize <MINT> mint --disable- Irreversible en esa mint - no más inflación posible
- Patrón de lanzamiento estándar: asignación de mint, airdrop, luego revocar
- Documenta los cambios de autoridad para transparencia e indexadores
Relacionado: Mejores Prácticas de SPL Token - lista de verificación de lanzamiento
Versiones de la pila: Esta página fue escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0 y LiteSVM 0.6.x.