CPIs de SPL Token
anchor-spl expone funciones CPI tipadas para SPL Token: transfer_checked, mint_to, burn, approve, y más. Envuelven metadatos de cuenta y datos de instrucción para el programa de tokens.
Busca en todas las páginas de la documentación
anchor-spl expone funciones CPI tipadas para SPL Token: transfer_checked, mint_to, burn, approve, y más. Envuelven metadatos de cuenta y datos de instrucción para el programa de tokens.
anchor_spl::token::{transfer, Transfer} está obsoleto. Omite la acuñación y los decimales, por lo que el programa de tokens no puede verificar que estás moviendo el activo que crees que es. Usa transfer_checked / TransferChecked en su lugar, y recurre a anchor_spl::token_interface cuando necesites Token-2022 además del Token clásico.
use anchor_spl::token_interface::{self, Burn, MintTo, TransferChecked};
token_interface::mint_to(cpi_ctx, amount)?;
token_interface::transfer_checked(cpi_ctx, amount, decimals)?;
token_interface::burn(cpi_ctx, amount)?;Cuándo recurrir a esto: Tu programa mueve tokens SPL sin reimplementar los layouts de instrucción de tokens.
use anchor_lang::prelude::*;
use anchor_spl::token_interface::{
self, Mint, TokenAccount, TokenInterface, TransferChecked,
};
#[derive(Accounts)]
pub struct Deposit<'info> {
#[account(mut)]
pub user: Signer<'info>,
pub mint: InterfaceAccount<'info, Mint>,
#[account(mut, token::mint = mint)]
pub user_ata: InterfaceAccount<'info, TokenAccount>,
#[account(mut, token::mint = mint)]
pub vault_ata: InterfaceAccount<'info, TokenAccount>,
pub token_program: Interface<'info, TokenInterface>,
}
pub fn deposit(ctx: Context<Deposit>, amount: u64) -> Result<()> {
token_interface::transfer_checked(
CpiContext::new(
ctx.accounts.token_program.to_account_info(),
TransferChecked {
from: ctx.accounts.user_ata.to_account_info(),
mint: ctx.accounts.mint.to_account_info(),
to: ctx.accounts.vault_ata.to_account_info(),
authority: ctx.accounts.user.to_account_info(),
},
),
amount,
ctx.accounts.mint.decimals,
)?;
Ok(())
}Qué demuestra esto:
transfer_checked transporta la acuñación y los decimales para que un intercambio de acuñación no pueda colarse.token::mint = mint fija ambos ATAs a la misma acuñación.Interface + InterfaceAccount aceptan Token clásico y Token-2022.use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface};
pub mint: InterfaceAccount<'info, Mint>,
pub vault_ata: InterfaceAccount<'info, TokenAccount>,
pub token_program: Interface<'info, TokenInterface>,Úsalo cuando necesites soportar tanto el programa Token clásico como Token-2022. Mantén todo el conjunto consistente: InterfaceAccount debe emparejarse con los tipos Mint / TokenAccount de token_interface. Mezclar anchor_spl::token::Mint en un InterfaceAccount no compila.
token::transfer - Sin verificación de acuñación ni decimales. Solución: Usa transfer_checked / TransferChecked.Signer o with_signer para PDA.transfer_checked falla la tx. Solución: Fija ambos ATAs con token::mint = mint y pasa los decimals de esa acuñación.mut en ATAs - El programa de tokens rechaza. Solución: Marca las cuentas de token como mut.Interface.anchor_spl::token::Mint con InterfaceAccount - Error de tipo. Solución: Toma ambos de token_interface.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| CPI de instrucción de token cruda | Layouts personalizados | Flujos estándar de SPL |
| Transferencias de tokens solo del lado del cliente | El usuario firma las instrucciones de token | Custodia del programa |
Códigos personalizados en IDL más cadenas #[msg].
emit_cpi! cuesta más CU pero mejora la fiabilidad de la captura.
Evitar excepto detrás de flags de características.
Desde IDL a través de la generación de código de Anchor o Codama.
Sí, los tipos #[event] están listados.
Sí, con @ MyError::Variant.
Cada línea de registro y cadena formateada.
anchor test esperando códigos de error.
Sí, pero no un contrato de API; usa eventos.
Ver Relacionados para CPI de spl.
Versiones de Stack: 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.
Revisado por Chris St. John·Última actualización: 16 jul 2026