CPI a Token SPL
Las operaciones de tokens pasan por el programa SPL Token a través de los constructores de spl_token::instruction. Valida las emisiones, autoridades y decimales antes de cualquier CPI.
Receta
let ix = spl_token::instruction::transfer(
token_program.key, source.key, dest.key, authority.key, &[], amount,
)?;
invoke(&ix, accounts)?;Cuándo usar esto:
- Liberación de transferencias de escrow.
- Emisión de tokens de recompensa.
- Quema de tokens de tarifa.
Ejemplo de Trabajo
pub fn cpi_transfer(amount: u64, token_program: &AccountInfo, source: &AccountInfo, dest: &AccountInfo, auth: &AccountInfo, bump: u8) -> ProgramResult {
let ix = spl_token::instruction::transfer(token_program.key, source.key, dest.key, auth.key, &[], amount)?;
invoke_signed(&ix, &[source.clone(), dest.clone(), auth.clone(), token_program.clone()], &[&[b"auth", &[bump]]])
}Lo que esto demuestra:
- Los constructores auxiliares de
spl_tokencrean datos y metadatos. - La autoridad PDA usa
invoke_signed. - La cantidad son unidades de token brutas (decimales).
Análisis Profundo
Comprobaciones
- Coincidencia de la emisión de origen/destino
- La autoridad posee la cuenta de origen
- ID de programa de token correcto (Token vs Token-2022)
Token-2022
ID de programa separado: pasa la cuenta de programa correcta.
Notas de Rust
use spl_token::state::Account as TokenAccount;Trampas Comunes
- ID de programa de token incorrecto: Token-2022 vs clásico. Solución: Valida la clave de la cuenta del programa.
- Desajuste de emisión: Drena el pool equivocado. Solución: Desempaqueta y compara las claves públicas de emisión.
- Confusión de decimales: Desfase de 10^n. Solución: Usa cantidades brutas de forma consistente.
- Falta de comprobación de delegado: Transferencia no autorizada. Solución: Valida el campo de autoridad.
- Congelar cuenta: La transferencia falla. Solución: Maneja el código de error.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
anchor_spl | CPI ergonómico | Nativo |
| Transferencia del lado del cliente | El usuario firma | Escrow del programa |
| Extensiones de Token-2022 | Ganchos de transferencia | Cuentas adicionales |
Preguntas Frecuentes
CPI de emisión?
Necesita la autoridad de emisión como firmante.
Quemar?
Similar a la transferencia con la instrucción de quemar.
Aprobar delegado?
Instrucción separada.
Creación de ATA?
CPI del programa de token asociado.
Autoridad multisig?
Cuentas firmantes adicionales en la CPI.
Cerrar cuenta de token?
Transferir lo restante y luego cerrar.
Alquiler en cuenta de token?
Normalmente exento.
Desempaquetar datos de token?
spl_token::state::unpack.
Tarifa en transferencia?
Extensión de Token-2022.
Decodificar error de simulación?
Mapear códigos de error de token.
Anchor 0.32?
Envolturas anchor_spl.
Cantidad comprobada?
Siempre antes de la CPI.
Relacionado
- SPL Token en Programas - Resumen
- PDAs como Autoridades - Emisión de PDA
- Vault y Escrow - Escrow
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.