CPIs de Token SPL
anchor-spl expõe funções CPI tipadas para SPL Token: transfer_checked, mint_to, burn, approve, e mais. Elas encapsulam metadados de conta e dados de instrução para o programa de token.
Busque em todas as páginas da documentação
anchor-spl expõe funções CPI tipadas para SPL Token: transfer_checked, mint_to, burn, approve, e mais. Elas encapsulam metadados de conta e dados de instrução para o programa de token.
anchor_spl::token::{transfer, Transfer} está obsoleto. Ele omite a cunhagem e os decimais, então o programa de token não pode verificar se você está movendo o ativo que pensa que está. Use transfer_checked / TransferChecked em vez disso, e recorra a anchor_spl::token_interface quando precisar do Token-2022, bem como do Token clássico.
use anchor_spl::token_interface::{self, Burn, MintTo, TransferChecked};
token_interface::mint_to(cpi_ctx, amount)?;
token_interface::transfer_checked(cpi_ctx, amount, decimals)?;
token_interface::burn(cpi_ctx, amount)?;Quando usar isso: Seu programa move tokens SPL sem reimplementar layouts de instrução de token.
use anchor_lang::prelude::*;
use anchor_spl::token_interface::{
self, Mint, TokenAccount, TokenInterface, TransferChecked,
};
#[derive(Accounts)]
pub struct Deposit<'info> {
#[account(mut)]
pub user: Signer<'info>,
pub mint: InterfaceAccount<'info, Mint>,
#[account(mut, token::mint = mint)]
pub user_ata: InterfaceAccount<'info, TokenAccount>,
#[account(mut, token::mint = mint)]
pub vault_ata: InterfaceAccount<'info, TokenAccount>,
pub token_program: Interface<'info, TokenInterface>,
}
pub fn deposit(ctx: Context<Deposit>, amount: u64) -> Result<()> {
token_interface::transfer_checked(
CpiContext::new(
ctx.accounts.token_program.to_account_info(),
TransferChecked {
from: ctx.accounts.user_ata.to_account_info(),
mint: ctx.accounts.mint.to_account_info(),
to: ctx.accounts.vault_ata.to_account_info(),
authority: ctx.accounts.user.to_account_info(),
},
),
amount,
ctx.accounts.mint.decimals,
)?;
Ok(())
}O que isso demonstra:
transfer_checked carrega a cunhagem e os decimais para que uma troca de cunhagem não possa ocorrer.token::mint = mint fixa ambos os ATAs à mesma cunhagem.Interface + InterfaceAccount aceitam Token clássico e Token-2022.use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface};
pub mint: InterfaceAccount<'info, Mint>,
pub vault_ata: InterfaceAccount<'info, TokenAccount>,
pub token_program: Interface<'info, TokenInterface>,Use ao suportar os programas clássicos Token e Token-2022. Mantenha todo o conjunto consistente: InterfaceAccount deve ser emparelhado com os tipos Mint / TokenAccount de token_interface. Misturar anchor_spl::token::Mint em um InterfaceAccount não compila.
token::transfer obsoleto - Sem verificação de cunhagem ou decimais. Correção: Use transfer_checked / TransferChecked.Signer ou with_signer para PDA.transfer_checked falha a tx. Correção: Fixe ambos os ATAs com token::mint = mint e passe os decimals dessa cunhagem.mut nos ATAs - O programa de token rejeita. Correção: Marque as contas de token como mut.Interface.anchor_spl::token::Mint com InterfaceAccount - Erro de tipo. Correção: Pegue ambos de token_interface.exact-delegate.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| CPI de instrução de token bruta | Layouts personalizados | Fluxos SPL padrão |
| Transferências de token apenas do lado do cliente | Usuário assina instruções de token | Custódia do programa |
Códigos personalizados no IDL mais strings #[msg].
emit_cpi! custa mais CU, mas melhora a confiabilidade da captura.
Evite, exceto atrás de flags de recurso.
Do IDL via Anchor ou geração de código Codama.
Sim, os tipos #[event] são listados.
Sim, com @ MyError::Variant.
Cada linha de log e string formatada.
anchor test esperando códigos de erro.
Sim, mas não um contrato de API; use eventos.
Veja Relacionados para CPI SPL.
Versões da Stack: Esta página foi 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, e LiteSVM 0.6.x.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026