Token & Associated Token Constraints
anchor-spl fornece helpers de constraint para contas SPL Token e Associated Token, reduzindo verificações manuais de mint/authority.
Receita
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>,Quando usar isso: Instruções movem tokens ou criam ATAs.
Exemplo de Trabalho
#[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>,
}O que isso demonstra:
associated_token::mintvincula a ATA ao mintassociated_token::authoritydefine o proprietário- O programa de token deve estar na lista de contas
- Use
token_interfacepara Token-2022
Mergulho Profundo
Token-2022 / Interface
Para Token-2022, use InterfaceAccount e TokenInterface:
pub token_program: Interface<'info, TokenInterface>,
pub mint: InterfaceAccount<'info, Mint>,Anchor 0.32.1 unifica padrões sob tipos de interface de token.
Armadilhas
- ID do programa de token incorreto - A constraint falha para Token-2022. Correção: Use
Interfaceao suportar ambos. - Inicialização de ATA sem programa de sistema - CPI de criação incompleta. Correção: Inclua os programas de sistema e de token associado.
- Discrepância de mint na transferência - O programa de token rejeita. Correção: Adicione
constraint = from.mint == mint.key(). - ATA de destinatário não verificado - Fundos enviados para ATA errada. Correção: Use constraints de token associado.
mutausente em contas de token - A transferência falha. Correção: Marque a origem e o destino comomut.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Verificações manuais de token::accessor | Programas personalizados | Fluxos SPL padrão |
| Apenas CPI sem constraint de ATA | Criação externa de ATA | Inicialização de ATA na mesma instrução |
Helpers de CPI token_interface | Transferências Token-2022 | Apenas token legado |
FAQs
Qual versão do Anchor este site usa?
0.32.1 para anchor-lang, Anchor CLI e exemplos nesta seção.
Preciso do Solana CLI junto com o Anchor?
Sim. Solana CLI 3.0.10 lida com keypairs, airdrops e inspeção de solana program.
Onde fica o IDL após a compilação?
target/idl/<program>.json em seu workspace.
Posso misturar `UncheckedAccount` com `Signer`?
Sim, mas cada campo não verificado precisa de constraints explícitas ou verificações do manipulador.
Como testar sem devnet?
Use anchor test com Surfpool 0.12.0 ou LiteSVM 0.6.x em CI.
Qual é o prefixo de 8 bytes nos dados da conta?
Discriminador de conta Anchor; não o remova ao dimensionar space.
Devo commitar o IDL gerado?
Sim, ou publique o IDL on-chain para que os clientes tenham uma fonte canônica.
Como depuro falhas de constraint?
Execute com logs; Anchor imprime o nome da constraint e o índice da conta.
O Anchor funciona no Agave 4.1.1?
Sim. Esta pilha tem como alvo validadores Agave com Solana CLI 3.0.10.
O que devo ler a seguir nesta seção?
Veja artigos irmãos vinculados em Relacionados para tópicos mais aprofundados sobre constraints de token.
Relacionados
- CPIs SPL Token - helpers de transferência
- Contas de Token Associadas - modelo ATA
- anchor-lang & anchor-spl - visão geral dos crates
Versões da pilha: 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.