Restricciones de Token y Token Asociado
anchor-spl proporciona ayudantes de restricciones para cuentas de SPL Token y Token Asociado, reduciendo las comprobaciones manuales de mint/autoridad.
Busca en todas las páginas de la documentación
anchor-spl proporciona ayudantes de restricciones para cuentas de SPL Token y Token Asociado, reduciendo las comprobaciones manuales de mint/autoridad.
init_if_needed (usado por ambos ejemplos de ATA a continuación) está protegido por una característica de cargo. Sin ella, ninguno de los fragmentos compila:
[dependencies]
anchor-lang = { version = "0.32.1", features = ["init-if-needed"] }use anchor_spl::associated_token::AssociatedToken;
use anchor_spl::token::{Mint, Token, TokenAccount};
#[account(
init_if_needed,
payer = payer,
associated_token::mint = mint,
associated_token::authority = owner,
)]
pub ata: Account<'info, TokenAccount>,Cuándo usar esto: Las instrucciones mueven tokens o crean ATAs.
#[derive(Accounts)]
pub struct TransferTokens<'info> {
#[account(mut)]
pub payer: Signer<'info>,
#[account(mut)]
pub from: Account<'info, TokenAccount>,
#[account(
init_if_needed,
payer = payer,
associated_token::mint = mint,
associated_token::authority = recipient,
)]
pub to: Account<'info, TokenAccount>,
pub mint: Account<'info, Mint>,
pub recipient: SystemAccount<'info>,
pub token_program: Program<'info, Token>,
pub associated_token_program: Program<'info, AssociatedToken>,
pub system_program: Program<'info, System>,
}Lo que esto demuestra:
associated_token::mint vincula el ATA a la mint.associated_token::authority establece el propietario.token_interface para Token-2022.Para Token-2022, usa InterfaceAccount y TokenInterface. Estos tipos provienen de anchor_spl::token_interface, no de anchor_spl::token — anchor_spl::token::Mint es el tipo heredado solo para Token y su comprobación de propietario rechaza las mints de Token-2022:
use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface};
pub token_program: Interface<'info, TokenInterface>,
pub mint: InterfaceAccount<'info, Mint>,
#[account(mut)]
pub token_account: InterfaceAccount<'info, TokenAccount>,anchor_spl::token_interface refleja anchor_spl::token con tipos conscientes de la interfaz; elige un módulo por programa y no mezcles los dos tipos Mint.
Interface cuando soportes ambos.constraint = from.mint == mint.key().mut faltante en cuentas de token - La transferencia falla. Solución: Marca el origen y el destino como mut.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Comprobaciones manuales de token::accessor | Programas personalizados | Flujos estándar de SPL |
| Solo CPI sin restricción de ATA | Creación externa de ATA | Inicialización de ATA en la misma instrucción |
Ayudantes de CPI de token_interface | Transferencias de Token-2022 | Solo token heredado |
0.32.1 para anchor-lang, Anchor CLI y ejemplos en esta sección.
Sí. Solana CLI 3.0.10 maneja keypairs, airdrops e inspección de solana program.
target/idl/<program>.json en tu espacio de trabajo.
Sí, pero cada campo no verificado necesita restricciones explícitas o comprobaciones del manejador.
Usa anchor test con Surfpool 0.12.0 o LiteSVM 0.6.x en CI.
Discriminador de cuenta de Anchor; no lo elimines al dimensionar space.
Sí, o publica el IDL en la cadena para que los clientes tengan una fuente canónica.
Ejecuta con logs; Anchor imprime el nombre de la restricción y el índice de la cuenta.
Sí. Esta pila se dirige a validadores Agave con Solana CLI 3.0.10.
Consulta los artículos hermanos en Relacionados para temas más profundos sobre restricciones de tokens.
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.
Revisado por Chris St. John·Última actualización: 19 jul 2026