Los programas on-chain interactúan con SPL Token a través de invocaciones entre programas (CPIs). Anchor 0.32.1 anchor-spl encapsula la validación de cuentas, deserialización y constructores de instrucciones para lógica de tokens de grado de producción.
Account<'info, TokenAccount> valida que el propietario sea el programa Token clásico; rechaza las cuentas Token-2022.
Las restricciones token::mint y associated_token reducen las comprobaciones manuales de pubkey.
transfer_checked incluye los decimales para un manejo más seguro de los activos; la Transfer no verificada está obsoleta y Token-2022 la rechaza en las emisiones con tarifa de transferencia.
use anchor_lang::prelude::*;use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface};// Nunca mezcles los dos árboles de módulos. `anchor_spl::token::{Mint, TokenAccount}` son// solo para Token clásico y su comprobación de propietario rechaza las cuentas Token-2022; los// tipos de token_interface despachan sobre ambos programas.#[derive(Accounts)]pub struct EitherProgram<'info> { pub mint: InterfaceAccount<'info, Mint>, #[account(mut, token::mint = mint)] pub from: InterfaceAccount<'info, TokenAccount>, pub token_program: Interface<'info, TokenInterface>,}
Falta la comprobación de igualdad de emisión - ATA de bóveda con activo incorrecto. Solución: Restricción token::mint = mint en todas las cuentas de token.
UncheckedAccount como autoridad de bóveda - sin validación de semilla PDA. Solución: Restricciones seeds + bump en la PDA de autoridad.
Cuenta token_program incorrecta - Program<'info, Token> fija Tokenkeg..., y Account<'info, TokenAccount> rechaza cuentas propiedad de Token-2022, por lo que no hay una ruta de "simplemente pasar la cuenta del programa Token-2022". Solución: cambia toda la estructura de cuenta a anchor_spl::token_interface (InterfaceAccount + Interface<TokenInterface>), o en Rust nativo usa spl_token_2022::instruction::* - spl_token::instruction::* llama a check_program_account y devuelve IncorrectProgramId para cualquier ID que no sea Tokenkeg....
Mezclar tipos de anchor_spl::token y anchor_spl::token_interface - la comprobación de propietario de los tipos clásicos rechaza las emisiones de extensión. Solución: elige un árbol de módulos por estructura de cuenta.
La PDA no puede firmar la transferencia - faltan las semillas with_signer. Solución:CpiContext::new_with_signer con las semillas de la bóveda.
Profundidad CPI extra a través de hooks de Token-2022 - una emisión enganchada añade una CPI anidada a un programa de hook separado, costando profundidad y CU. Un hook nunca puede volver a entrar en un programa que ya está en la pila (incluido el tuyo o Token-2022 mismo) - Solana rechaza eso con ReentrancyNotAllowed. Solución: presupuesta CU y profundidad CPI; ver la documentación de transfer hook.