CPI para Token SPL
Operações de token passam pelo programa SPL Token via construtores spl_token::instruction. Valide mints, autoridades e decimais antes de qualquer CPI.
Receita
let ix = spl_token::instruction::transfer(
token_program.key, source.key, dest.key, authority.key, &[], amount,
)?;
invoke(&ix, accounts)?;Quando usar isso:
- Transferências de liberação de escrow.
- Mintar tokens de recompensa.
- Queimar tokens de taxa.
Exemplo de Trabalho
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]]])
}O que isso demonstra:
- Construtores de ajuda
spl_tokencriam dados + metadados. - Autoridade PDA usa
invoke_signed. - Quantidade são unidades de token brutas (decimais).
Análise Detalhada
Verificações
- Origem/destino do mint correspondem
- Autoridade é dona da origem
- ID do programa de token correto (Token vs Token-2022)
Token-2022
ID de programa separado - passe a conta de programa correta.
Notas de Rust
use spl_token::state::Account as TokenAccount;Armadilhas
- ID incorreto do programa de token - Token-2022 vs clássico. Correção: Valide a chave da conta do programa.
- Incompatibilidade de mint - Drena o pool errado. Correção: Desempacote e compare as chaves públicas do mint.
- Confusão de decimais - Erro de 10^n. Correção: Use quantidades brutas consistentemente.
- Verificação de delegado ausente - Transferência não autorizada. Correção: Valide o campo de autoridade.
- Congelar conta - Transferência falha. Correção: Trate o código de erro.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| anchor_spl | CPI ergonômico | Nativo |
| Transferência do lado do cliente | Usuário assina | Escrow do programa |
| Extensões do Token-2022 | Ganchos de transferência | Contas extras |
FAQs
CPI de Mint?
Requer que o signatário da autoridade de mint esteja presente.
Queimar?
Similar a transferir com a instrução de queimar.
Aprovar delegado?
Instrução separada.
Criação de ATA?
CPI do programa de token associado.
Autoridade multisig?
Contas signatárias extras na CPI.
Fechar conta de token?
Transfira o restante e depois feche.
Aluguel na conta de token?
Normalmente isento.
Desempacotar dados de token?
Desempacotamento spl_token::state.
Taxa na transferência?
Extensão Token-2022.
Decodificar erro sim?
Mapeie códigos de erro de token.
anchor 0.32?
Wrappers anchor_spl.
Quantidade verificada?
Sempre antes da CPI.
Relacionados
- SPL Token em Programas - Visão geral
- PDAs como Autoridades - Mint PDA
- Cofre e Escrow - Escrow
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.