Taxas de Transferência
A extensão Transfer Fee permite que mints Token-2022 cobrem taxa em toda transferência, retida em contas de token até harvest para um coletor de taxas. Habilita receita on-chain sem programas de transferência customizados.
Receita
spl-token create-token \
--program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb \
--decimals 6 \
--transfer-fee-basis-points 100 \
--transfer-fee-maximum-fee 1000000use anchor_spl::token_interface::{Mint, TokenAccount, TokenInterface};
// Use spl-token-2022 CPI helpers for harvest_withheld_tokens_to_mintQuando usar isso:
- Receita de protocolo em transferências secundárias
- Ativos tokenizados do mundo real com taxas de emissor
- Tokens de fidelidade com mecânicas de redistribuição
- Substituir rastreamento de taxa off-chain frágil
Exemplo de Trabalho
# Create mint with 1% fee (100 bps), max 1 token raw fee cap
MINT=$(spl-token create-token \
--program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb \
--decimals 6 \
--transfer-fee-basis-points 100 \
--transfer-fee-maximum-fee 1000000 | awk '/Creating token/{print $3}')
spl-token create-account "$MINT" --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
spl-token mint "$MINT" 10000000 --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
# Transfer 1_000_000 raw - recipient receives less; fee withheld
spl-token transfer "$MINT" 1000000 <RECIPIENT> --fund-recipient \
--program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
spl-token display <RECIPIENT_ATA> --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEbO que isso demonstra:
- Taxa calculada em basis points (100 bps = 1%) limitada por
maximum_fee - Valor retido permanece na conta do destinatário ou remetente conforme config até harvest
- Carteiras devem mostrar valor líquido, não entrada bruta de transferência
Mergulho Profundo
Como Funciona
- Config de transfer fee armazenada na extensão do mint (bps, max fee, transfer fee authority)
- Em
Transfer, programa move porção de taxa para bucket retido nas contas HarvestWithheldTokensToMintagrega taxas retidas ao mintWithdrawWithheldTokensFromMintenvia taxas coletadas para ATA do coletor
Matemática de Taxa
| Configuração | Exemplo | Em transferência 1_000_000 raw |
|---|---|---|
| 100 bps | 1% | 10_000 de taxa se abaixo do max |
| max fee | 1_000_000 raw | Limita taxa a 1 token UI (6 dec) |
Notas de TypeScript
// When building transfers, fetch mint with extensions parsed
// Show: amount, estimated fee, net to recipient
// Include harvest instructions in treasury crank botsArmadilhas
- Usuários surpresos com recebimento líquido - UX espera valor bruto. Correção: exiba breakdown de taxa antes de assinar.
- Taxas retidas presas em ATAs - sem crank harvest. Correção: automatize
harvest_withheldem bot keeper. - Incompatibilidade DEX - roteadores podem não passar contas de extensão. Correção: verifique suporte Token-2022 Jupiter/Meteora.
- Overflow de basis points - máx 10_000 bps (100%). Correção: valide na criação do mint.
- Assumir instrução transfer clássica - extensão de taxa requer programa Token-2022. Correção: ramifique no owner do mint.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Taxa customizada transfer hook | Lógica de taxa complexa | Taxa bps simples basta |
| Taxa de tesouraria no seu programa | Controle total em um programa | Transferências padrão de carteira fora da sua UI |
| Token clássico + taxa off-chain | Máxima compatibilidade | Precisa taxa aplicável on-chain |
FAQs
O que são transfer fees?
Taxa automática deduzida em transferências Token-2022 conforme config da extensão do mint.
Quem recebe as taxas?
Transfer fee authority saca taxas harvestadas para contas coletoras configuradas.
O que são basis points?
1 bps = 0,01%. 100 bps = 1% do valor de transferência antes do cap máximo.
Taxas podem mudar após lançamento?
Transfer fee authority pode atualizar bps/max dentro das regras de autoridade - documente governança.
Taxas aplicam a mint/burn?
Tipicamente somente transferências - verifique spec da extensão para sua config de mint.
Como harvest taxas?
Crank instruções harvest_withheld_tokens_to_mint depois withdraw_withheld_tokens_from_mint.
Carteiras suportam exibição de taxa?
Varia - carteiras principais melhorando suporte Token-2022; teste suas carteiras alvo.
Taxa pode ser 0%?
Extensão pode existir com 0 bps - incomum; omita extensão se não precisa de taxa.
Impacto em swaps AMM?
Swaps são transferências - taxas aplicam a menos que programa de pool trate isenção via hook.
Teste devnet?
Use mesmo ID de programa na devnet com Surfpool 0.12.0 para iteração local.
Config de taxa imutável?
Alguns campos imutáveis no init - planeje antes do mint mainnet.
Relação com transfer hooks?
Hooks adicionam lógica customizada; transfer fee é extensão nativa com matemática mais simples.
Relacionados
- Noções Básicas de Token-2022 - ID de programa
- Transfer Hooks - lógica de transferência customizada
- Boas Práticas Token-2022 - verificações do cliente
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.