Noções Básicas de Token-2022
9 exemplos para você começar com Token-2022 (Token Extensions) - 7 básicos e 2 intermediários.
Pré-requisitos
solana config set --url devnet
spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --versioncargo add anchor-lang@0.32.1 anchor-spl@0.32.1ID do programa Token-2022: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb.
Exemplos Básicos
1. Criar um Mint Token-2022
Mesmo fluxo CLI do SPL clássico com ID de programa explícito.
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --decimals 6- Conta mint é maior quando extensões estão habilitadas
- Mint padrão sem extensões se comporta como Token clássico
- Sempre passe ID de programa em caminhos de derivação do cliente
Relacionado: Taxas de Transferência - extensão de taxa
2. Criar ATA para Mint Token-2022
Derivação ATA inclui ID de programa de token.
spl-token create-account <MINT> --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb- ID de programa errado na derivação produz endereço ATA errado
- Associated Token program é compartilhado com Token clássico
- Rent escala com tamanho da conta quando extensões se anexam a contas
Relacionado: Associated Token Accounts (ATAs)
3. Inspecionar Layout de Extensão
Display mostra extensões habilitadas em mint/conta.
spl-token display <MINT> --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb- Dados de extensão anexados ao layout SPL base
- Extensões imutáveis não podem ser removidas após init
- Planeje conjunto de extensões antes da criação de mint na mainnet
Relacionado: Metadata e Metadata Pointer
4. Mint e Transferência (Sem Extensões)
Token-2022 baseline sem extensões espelha comportamento clássico.
spl-token mint <MINT> 1000000 --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
spl-token transfer <MINT> 500000 <RECIPIENT> --fund-recipient --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb- Carteiras devem detectar programa Token-2022 no campo owner da conta mint
- Pacote
@solana-program/token-2022fornece builders de instrução - Suporte DEX varia - verifique compatibilidade do roteador
Relacionado: Migrando do SPL Token
5. Ler Programa Owner do Mint via RPC
Clientes ramificam no programa de token antes de construir instruções.
import { createSolanaRpc, address } from "@solana/kit";
const TOKEN_2022 = address("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb");
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const { value } = await rpc.getAccountInfo(address("MINT_PUBKEY")).send();
const isToken2022 = value?.owner === TOKEN_2022;
console.log("Token-2022 mint:", isToken2022);- Campo
ownerdo mint é o ID de programa de token - Use pacote correto para codificação de instrução
- DAS pode unificar leituras; transações ainda precisam do programa correto
Relacionado: Lendo NFTs (DAS API)
6. Habilitar Extensão Transfer Fee (CLI)
Extensão de receita comum configurada no init do mint.
# Extension flags vary by spl-token version - see transfer-fees page for full flow
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --decimals 6 --enable-transfer-fees- Fee basis points e max fee definidos em dados de init da extensão
- Taxas retidas acumulam em contas até harvest
- Carteiras devem mostrar valor líquido recebido
Relacionado: Taxas de Transferência
7. Usar token_interface no Anchor
Caminho único de código para mints Token e Token-2022.
use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface};
#[derive(Accounts)]
pub struct Deposit<'info> {
pub mint: InterfaceAccount<'info, Mint>,
#[account(mut)]
pub user_token: InterfaceAccount<'info, TokenAccount>,
pub token_program: Interface<'info, TokenInterface>,
}InterfaceAccountdeserializa ambos os layouts de programa- Passe conta
token_programreal correspondendo ao owner do mint - Obrigatório para protocolos aceitando tokens listados arbitrários
Relacionado: SPL Token em Programas
Exemplos Intermediários
8. Visão Geral da Extensão Transfer Hook
Programa customizado invocado em toda transferência.
// Transfer hook program ID stored in mint extension
// Token-2022 CPIs to hook with extra accounts from remaining_accounts- Hook pode aplicar allowlists, royalties ou contabilidade
- Contas extras devem ser passadas em transações do cliente
- CU avançado e modos de falha - teste no Surfpool 0.12.0
Relacionado: Transfer Hooks
9. Escolher Extensões para Requisitos de Produto
| Necessidade | Extensão |
|---|---|
| Receita em transferências | Transfer fee |
| Gating de conformidade | Default account state + non-transferable |
| Metadata on-mint | Metadata pointer |
| Privacidade | Confidential transfer |
- Habilite somente o que precisa - extensões imutáveis adicionam complexidade permanente
- Documente comportamento de carteira não suportado para usuários
Relacionado: Boas Práticas Token-2022
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.