CPIs de SPL Token
anchor-spl expone funciones CPI tipadas para SPL Token: transferir, mint_to, burn, approve, y más. Envuelven metadatos de cuenta y datos de instrucción para el programa de tokens.
Receta
use anchor_spl::token::{self, MintTo, Transfer};
token::mint_to(cpi_ctx, amount)?;
token::transfer(cpi_ctx, amount)?;
token::burn(cpi_ctx, amount)?;Cuándo usar esto: Tu programa mueve tokens SPL sin reimplementar los layouts de instrucción de tokens.
Ejemplo Funcional
#[derive(Accounts)]
pub struct Deposit<'info> {
#[account(mut)]
pub user: Signer<'info>,
#[account(mut)]
pub user_ata: Account<'info, TokenAccount>,
#[account(mut)]
pub vault_ata: Account<'info, TokenAccount>,
pub token_program: Program<'info, Token>,
}
pub fn deposit(ctx: Context<Deposit>, amount: u64) -> Result<()> {
token::transfer(
CpiContext::new(
ctx.accounts.token_program.to_account_info(),
Transfer {
from: ctx.accounts.user_ata.to_account_info(),
to: ctx.accounts.vault_ata.to_account_info(),
authority: ctx.accounts.user.to_account_info(),
},
),
amount,
)?;
Ok(())
}Qué demuestra esto:
- MintTo requiere un firmante de autoridad de acuñación o un PDA.
- Transfer necesita ATAs de origen y destino mutables.
- Burn reduce el suministro de la cuenta de quema.
- Token-2022 usa el módulo token_interface.
Análisis Profundo
Interfaz de Token (2022)
use anchor_spl::token_interface::{self, Mint, TokenAccount, TokenInterface};
pub token_program: Interface<'info, TokenInterface>,Úsalo cuando necesites soportar tanto el programa Token clásico como Token-2022.
Errores Comunes
- Autoridad no firmante para transferencia de usuario - CPI falla. Solución: Usa
Signerowith_signerpara PDA. - Desajuste de acuñación/decimales - Magnitud incorrecta de la cantidad. Solución: Valida la acuñación en ambos ATAs.
- Olvidó
muten ATAs - El programa de tokens rechaza. Solución: Marca las cuentas de token comomut. - Usar el programa Token para acuñación Token-2022 - Desajuste de propietario. Solución: Cambia a tipos
Interface. - Aprobar sin revocar - Riesgo de que la asignación persista. Solución: Revoca o usa el patrón de delegado exacto.
Alternativas
| 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 |
Preguntas Frecuentes
¿Formato de error de Anchor 0.32.1?
Códigos personalizados en IDL más cadenas #[msg].
¿emit! vs emit_cpi!?
emit_cpi! cuesta más CU pero mejora la fiabilidad de la captura.
¿Debería usar msg! en mainnet?
Evitar excepto detrás de flags de características.
¿Cómo obtienen los clientes los códigos de error?
Desde IDL a través de la generación de código de Anchor o Codama.
¿Aparecen los eventos en IDL?
Sí, los tipos #[event] están listados.
¿Pueden las restricciones devolver errores personalizados?
Sí, con @ MyError::Variant.
¿Qué usa CU en el registro?
Cada línea de registro y cadena formateada.
¿Cómo probar errores?
anchor test esperando códigos de error.
¿Son los registros datos de consenso?
Sí, pero no un contrato de API; usa eventos.
¿Próxima lectura?
Ver Relacionados para CPI de spl.
Relacionados
- Conceptos básicos de CPI en Anchor - CpiContext
- Restricciones de Token y Token Asociado - validación
- Conceptos básicos de SPL Token - modelo de token
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.