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.
Receta
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.
Ejemplo de Trabajo
#[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::mintvincula el ATA a la mint.associated_token::authorityestablece el propietario.- El programa de token debe estar en la lista de cuentas.
- Usa
token_interfacepara Token-2022.
Análisis Profundo
Token-2022 / Interfaz
Para Token-2022, usa InterfaceAccount y TokenInterface:
pub token_program: Interface<'info, TokenInterface>,
pub mint: InterfaceAccount<'info, Mint>,Anchor 0.32.1 unifica patrones bajo tipos de interfaz de token.
Errores Comunes
- ID de programa de token incorrecto - La restricción falla para Token-2022. Solución: Usa
Interfacecuando soportes ambos. - Inicialización de ATA sin programa de sistema - La CPI de creación incompleta. Solución: Incluye los programas de sistema y token asociado.
- Desajuste de mint en la transferencia - El programa de token rechaza. Solución: Añade
constraint = from.mint == mint.key(). - ATA de destinatario sin verificar - Fondos enviados al ATA incorrecto. Solución: Usa restricciones de token asociado.
mutfaltante en cuentas de token - La transferencia falla. Solución: Marca el origen y el destino comomut.
Alternativas
| 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 |
Preguntas Frecuentes
¿Qué versión de Anchor utiliza este sitio?
0.32.1 para anchor-lang, Anchor CLI y ejemplos en esta sección.
¿Necesito Solana CLI junto con Anchor?
Sí. Solana CLI 3.0.10 maneja keypairs, airdrops e inspección de solana program.
¿Dónde vive el IDL después de la compilación?
target/idl/<program>.json en tu espacio de trabajo.
¿Puedo mezclar `UncheckedAccount` con `Signer`?
Sí, pero cada campo no verificado necesita restricciones explícitas o comprobaciones del manejador.
¿Cómo pruebo sin devnet?
Usa anchor test con Surfpool 0.12.0 o LiteSVM 0.6.x en CI.
¿Qué es el prefijo de 8 bytes en los datos de la cuenta?
Discriminador de cuenta de Anchor; no lo elimines al dimensionar space.
¿Debo confirmar el IDL generado?
Sí, o publica el IDL en la cadena para que los clientes tengan una fuente canónica.
¿Cómo depuro fallos en las restricciones?
Ejecuta con logs; Anchor imprime el nombre de la restricción y el índice de la cuenta.
¿Funciona Anchor en Agave 4.1.1?
Sí. Esta pila se dirige a validadores Agave con Solana CLI 3.0.10.
¿Qué debo leer a continuación en esta sección?
Consulta los artículos hermanos en Relacionados para temas más profundos sobre restricciones de tokens.
Relacionado
- CPIs de SPL Token - ayudantes de transferencia
- Cuentas de Token Asociado - modelo ATA
- anchor-lang & anchor-spl - descripción general de los crates
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.