Restrições de Token e Token Associado
anchor-spl fornece helpers de restrição para contas SPL Token e Token Associado, reduzindo verificações manuais de mint/autoridade.
Busque em todas as páginas da documentação
anchor-spl fornece helpers de restrição para contas SPL Token e Token Associado, reduzindo verificações manuais de mint/autoridade.
init_if_needed (usado por ambos os exemplos de ATA abaixo) é controlado por um recurso do cargo. Sem ele, nenhum dos trechos compila:
[dependencies]
anchor-lang = { version = "0.32.1", features = ["init-if-needed"] }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.
#[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::mint vincula a ATA ao mintassociated_token::authority define o proprietáriotoken_interface para Token-2022Para Token-2022, use InterfaceAccount e TokenInterface. Esses tipos vêm de anchor_spl::token_interface, não de anchor_spl::token — anchor_spl::token::Mint é o tipo legado apenas para Token e sua verificação de proprietário rejeita mints Token-2022:
use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface};
pub token_program: Interface<'info, TokenInterface>,
pub mint: InterfaceAccount<'info, Mint>,
#[account(mut)]
pub token_account: InterfaceAccount<'info, TokenAccount>,anchor_spl::token_interface espelha anchor_spl::token com tipos cientes de interface; escolha um módulo por programa e não misture os dois tipos Mint.
Interface ao suportar ambos.constraint = from.mint == mint.key().mut ausente em contas de token - A transferência falha. Correção: Marque a origem e o destino como mut.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Verificações manuais de token::accessor | Programas personalizados | Fluxos SPL padrão |
| Apenas CPI sem restrição 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 |
0.32.1 para anchor-lang, Anchor CLI e exemplos nesta seção.
Sim. Solana CLI 3.0.10 lida com keypairs, airdrops e inspeção de solana program.
target/idl/<program>.json em seu workspace.
Sim, mas cada campo não verificado precisa de restrições explícitas ou verificações do manipulador.
Use anchor test com Surfpool 0.12.0 ou LiteSVM 0.6.x em CI.
Discriminador de conta Anchor; não o remova ao dimensionar space.
Sim, ou publique o IDL on-chain para que os clientes tenham uma fonte canônica.
Execute com logs; Anchor imprime o nome da restrição e o índice da conta.
Sim. Esta pilha tem como alvo validadores Agave com Solana CLI 3.0.10.
Veja artigos irmãos vinculados em Relacionados para tópicos mais aprofundados sobre restrições de token.
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.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026