spl-token & spl-associated-token-account
O programa SPL Token define "mints" (cunhagens) e contas de token; o programa Associated Token Account (ATA) deriva endereços canônicos de carteira por "mint". Os crates Rust spl-token e spl-associated-token-account (mais os wrappers anchor-spl) codificam layouts e helpers de CPI para os programas e clientes do Agave 4.1.1.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
[dependencies]
spl-token = "7.0"
spl-associated-token-account = "6.0"use spl_associated_token_account::get_associated_token_address;
use spl_token::state::Mint;
let ata = get_associated_token_address(&owner, &mint);Quando usar isso:
- Programas que transferem, cunham ou queimam tokens SPL via CPI.
- Clientes que resolvem endereços ATA antes de construir instruções.
- Análise de decimais de "mint" e saldos de contas de token fora da cadeia.
- Integração com extensões Token-2022 via crates irmãos.
Exemplo de Trabalho
use anchor_lang::prelude::*;
use anchor_spl::{
associated_token::AssociatedToken,
token::{self, Mint, Token, TokenAccount, Transfer},
};
#[derive(Accounts)]
pub struct Pay<'info> {
#[account(mut)]
pub payer: Signer<'info>,
#[account(mut)]
pub payer_ata: Account<'info, TokenAccount>,
#[account(mut)]
pub merchant_ata: Account<'info, TokenAccount>,
pub mint: Account<'info, Mint>,
pub token_program: Program<'info, Token>,
pub associated_token_program: Program<'info, AssociatedToken>,
}
pub fn pay(ctx: Context<Pay>, amount: u64) -> Result<()> {
require!(amount > 0, ErrorCode::InvalidAmount);
token::transfer(
CpiContext::new(
ctx.accounts.token_program.to_account_info(),
Transfer {
from: ctx.accounts.payer_ata.to_account_info(),
to: ctx.accounts.merchant_ata.to_account_info(),
authority: ctx.accounts.payer.to_account_info(),
},
),
amount,
)?;
Ok(())
}
#[error_code]
pub enum ErrorCode {
#[msg("o valor deve ser positivo")]
InvalidAmount,
}O que isso demonstra:
- Os tipos
TokenAccounteMintvalidam proprietários e layouts. - Transferências CPI para SPL Token com a autoridade assinante correta.
- O programa ATA está disponível quando as instruções criam ATAs.
- Verificou o
amountantes do movimento do token.
Mergulho Profundo
Como Funciona
- Contas Mint armazenam o fornecimento, decimais e autoridades.
- Contas Token mantêm saldos por "mint" para um único proprietário.
- O programa ATA deriva PDAs deterministicamente do endereço da carteira + "mint" + ID do programa de token.
- O ID do programa Token
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DAno SPL clássico.
Tabela de Crates Rust
| Crate | Papel | Notas |
|---|---|---|
spl-token | Construtores de instrução de token, layouts de estado | On-chain + off-chain |
spl-associated-token-account | Derivação ATA e instruções de criação | Emparelhar com o ID do programa de token |
anchor-spl | Wrappers tipados e helpers de CPI | Projetos Anchor 0.32.1 |
spl-token-2022 | Programa de extensões de token | ID de programa separado |
Tabela TypeScript / NPM
| Pacote | Papel | Versão Fixa |
|---|---|---|
@solana/spl-token | Helpers de ix ATA + token | Corresponder à versão do programa de token |
@solana/kit | Tx de nível inferior com ix importado | 7.0.0 |
| Clientes gerados por Codama | Fluxos de token específicos do programa | Do seu IDL |
Notas Rust
// Sempre use matemática verificada para valores humanos
let raw = amount
.checked_mul(10u64.pow(mint.decimals as u32))
.ok_or(ProgramError::InvalidArgument)?;Armadilhas
- ID incorreto do programa de token para derivação ATA - "Mints" Token-2022 precisam do ID do programa Token-2022. Correção: passe o ID de programa correto para os helpers ATA.
- Transferência sem delegado ao usar autoridade delegada - falha com incompatibilidade de proprietário. Correção: inclua o "signer" delegado ou use o proprietário.
- Decimais assumidos como 9 - USDC usa 6. Correção: leia
mint.decimalsem tempo de execução. - Fechar ATA com "dust" (resíduos) - reabrir custa aluguel (rent). Correção: varra para zero antes de fechar ou mantenha a ATA.
- Autoridade de "mint" deixada em "mints" da rede principal - risco de inflação ilimitada. Correção: revogue a autoridade de "mint" após o lançamento.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Extensões token-2022 | "Transfer hooks", taxas | Apenas fungível simples |
| SOL Envolvido via "mint" nativo | SOL em forma SPL | Transferências puras de lamports são suficientes |
Fluxos de pagamento mpl | Checkout de NFT | Pagamentos apenas fungíveis |
| Lamports do programa System | Dicas apenas de SOL | Necessita de composabilidade SPL |
FAQs
ATA sempre existe?
Não - crie com associated_token::create antes da primeira transferência para o novo par carteira/mint.
Quem paga o aluguel (rent) da ATA?
O pagador na instrução create - frequentemente o protocolo ou o fluxo de integração do usuário.
Autoridade de token multissinatura?
Suportado via layouts multissinatura SPL - inclua todos os "signers" necessários.
Informações de "mint" offline?
Busque a conta "mint" uma vez e armazene em cache os decimais nos clientes.
CPI do programa de token a partir do nativo?
Use spl_token::instruction::transfer com invoke.
Paridade CLI?
A CLI spl-token do pacote Solana 3.0.10 espelha muitas operações.
"Mint" de SOL Envolvido?
So11111111111111111111111111111111111111112 - trate os decimais como 9.
Permitir delegado?
A instrução approve define a permissão de delegação - cuidado com a segurança na rede principal.
Extensão de proprietário imutável?
Recurso Token-2022 - planeje a criação da ATA antes de habilitá-la.
Indexadores?
Assine o programa de token para painéis de saldo em escala.
Relacionados
- anchor-lang & anchor-spl - Helpers SPL do Anchor
- SPL Token Basics - conceitos
- Associated Token Accounts - guia ATA
- Token-2022 Basics - extensões
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.