Tópicos Técnicos Avançados: Token-2022, PDA, Multisig e Erros
Guia técnico avançado cobrindo falhas de transação, especificidades do Token-2022, gerenciamento de contas PDA, integração com hardware wallets e interpretação de códigos de erro.
#Por que transações falham: razões técnicas?
Mesmo transações corretamente formadas podem não entrar em um bloco. Entender as razões ajuda a evitar perda de tempo e gas.
Arquitetura de Transações na Solana
Cada transação na Solana tem limites rígidos e restrições de tempo:
- Tamanho máximo: 1232 bytes (MTU de pacote de rede)
- Limite de Compute Units: 1.400.000 CU por transação
- Tempo de vida: 150 slots (~60-90 segundos)
- Validade do Blockhash: Válido apenas para blocos recentes
Transaction Expired: Erro Mais Comum
O que aconteceu: Transação contém referência a blockhash recente (identificador de bloco). Se mais de 150 slots passaram enquanto aguardava na fila, a rede rejeita a transação como desatualizada.
Processo técnico:
- Você forma transação com blockhash do bloco N
- Transação aguarda inclusão em bloco
- Rede atinge bloco N+150
- Seu blockhash não está mais na lista "recent blockhashes"
- Validadores rejeitam transação com erro "Blockhash not found"
Por que isso acontece:
Congestionamento de rede: Durante mints populares de NFT ou hype de token, rede recebe milhões de transações. Priority Fee determina ordem.
Priority Fee baixo: Se você definiu taxa mínima, validadores priorizarão transações com pagamento maior.
Problemas de RPC: Nós RPC públicos podem ser lentos ou perder conexão.
Solução:
- ✅ Aumente Priority Fee para "Medium" ou "High" nas configurações da carteira
- ✅ Tente novamente após 1-2 minutos (blockhash atualiza automaticamente)
- ✅ Use endpoints RPC privados (Helius, Triton) para estabilidade
Importante: Transação expirada não deduz taxa. Seus fundos estão seguros.
Account State Changed: Conflito de Dados
O que aconteceu: Entre formação da transação e execução, estado da conta mudou.
Cenários típicos:
Cenário 1: Recarga durante cleanup
- Scanner determinou: conta vazia, saldo = 0
- Você forma transação CloseAccount
- Alguém envia 1 token para esta conta
- Transação tenta fechar conta com saldo > 0
- Erro: "Account has non-zero balance"
Cenário 2: Race condition com outra transação
- Você enviou swap de token A na DEX
- Simultaneamente enviou transação de fechamento de conta do token A
- Ambas transações tentam modificar mesma conta
- Uma passa, segunda é rejeitada
Solução:
- ✅ Execute novo escaneamento - dados atualizarão
- ✅ Use ferramentas com simulação pre-flight (verificação antes de envio)
- ✅ Evite operações simultâneas com um token
Compute Budget Exceeded: Limite de Computação Excedido
O que aconteceu: Transação tentou executar operações muito complexas, excedendo limite de 1.4M Compute Units.
Causas:
- Muitas instruções no pacote: Tentativa de fechar 30-40 contas de uma vez
- Smart contracts complexos: Alguns Token-2022 com extensões requerem mais computação
- Chamadas de programa aninhadas: Programa A chama programa B, que chama C
Solução:
- ✅ Reduza número de contas no pacote (feche 15-20 em vez de 25-30)
- ✅ Use ferramentas que otimizam automaticamente tamanhos de pacote
- ✅ Adicione instrução
ComputeBudgetProgram.setComputeUnitLimit()para aumentar limite
Detalhe técnico: Você pode solicitar até 1.400.000 CU, mas isso requer Priority Fee proporcionalmente maior:
Priority Fee = CU solicitadas × Preço por CU
Insufficient Lamports: Fundos Insuficientes
O que aconteceu: SOL insuficiente no saldo para executar operação.
Causas não óbvias:
Mínimo rent-exempt: Se você tentar transferir todo SOL mas tem contas vazias abertas, carteira deve preservar mínimo para cobrir rent de todas as contas.
Mudanças dinâmicas de gas: Durante congestionamento, Priority Fee pode crescer 10-100x. Transação formada com cálculo de 0.000005 SOL de gas pode requerer 0.0005 SOL.
Múltiplas transações: Você enviou 5 transações seguidas, cada uma reserva gas. Última não passa devido a fundos livres insuficientes.
Solução:
- ✅ Sempre mantenha mínimo de 0.01-0.02 SOL no saldo
- ✅ Use modo "Advanced" na carteira para controlar reserva de gas
- ✅ Envie transações sequencialmente, aguardando confirmação
#Como funciona o Token-2022 e como recuperar rent dele?
Token Extensions Program (Token-2022) é a evolução do SPL Token clássico, lançado em 2023.
Principais Diferenças do SPL Token
SPL Token (clássico):
- Program ID:
TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA - Tamanho fixo: 165 bytes
- Funcionalidade básica: transfer, mint, burn, approve
Token-2022:
- Program ID:
TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb - Tamanho variável: 165-500+ bytes (depende de extensões)
- Funcionalidade estendida: 16+ capacidades adicionais
Principais Extensões
Transfer Fee Extension:
Permite ao criador do token cobrar taxa em cada transferência.
Exemplo:
Transferir 100 tokens
Taxa: 2% = 2 tokens
Destinatário recebe: 98 tokens
Criador recebe: 2 tokens de taxa
Impacto na recuperação de rent: Contas com Transfer Fee ocupam mais espaço → rent aumenta para ~0.0025 SOL.
Permanent Delegate:
Criador do token designa endereço que pode transferir tokens de qualquer carteira sem consentimento do proprietário.
Aplicações:
- Stablecoins centralizadas (USDC pode congelar fundos de criminosos)
- Tokens de jogos (desenvolvedor pode confiscar ao banir)
Risco: Criador tem acesso backdoor aos seus fundos.
Confidential Transfers:
Criptografia de saldos usando provas de conhecimento zero.
Como funciona:
- Apenas saldo criptografado publicamente visível
- Remetente e destinatário conhecem valores reais
- Validadores podem verificar correção sem revelação
Tamanho da conta: Até 400 bytes → rent até ~0.004 SOL
Non-Transferable Tokens:
Tokens que não podem ser transferidos (soulbound).
Aplicações:
- Certificados e diplomas
- Conquistas em jogos
- Tokens KYC (verificação de identidade)
Especificidade de recuperação de rent: Tais tokens não podem ser queimados, mas conta pode ser fechada se criador previu esta função.
Por Que Ferramentas Antigas Não Veem Token-2022
Razão técnica: Serviços de cleanup clássicos usam método RPC que retorna apenas tokens SPL. Abordagem correta requer duas consultas separadas para programas SPL e Token-2022.
Recuperação de Rent do Token-2022
Valores de recuperação (aproximados):
- Token-2022 básico: ~0.00204 SOL (como SPL)
- Com uma extensão: ~0.0025 SOL
- Com duas extensões: ~0.003 SOL
- Com Confidential Transfers: ~0.004 SOL
Importante: Valor real depende do tamanho exato da conta em bytes.
Processo de fechamento: Idêntico aos tokens SPL - Queimar restos (se houver), depois instrução CloseAccount. Única diferença: precisa usar Program ID correto ao formar instrução.
#O que são contas PDA e é possível recuperar rent delas?
Program Derived Address (PDA) - contas controladas por programas, não usuários.
O Que é PDA Tecnicamente
Conta regular:
Private Key → Public Key (endereço)
Assinatura de transação = sua chave privada
PDA:
Program ID + Seeds → Endereço determinístico
Assinatura de transação = programa (via invoke_signed)
Característica chave: PDA não tem chave privada. Apenas o programa pode assinar operações em seu nome.
Onde PDAs São Usados
Protocolos de lending (Solend, MarginFi):
Quando você deposita:
- Programa cria PDA para armazenar seu colateral
- Você é o proprietário mas não controla diretamente
- Saque possível apenas através da função withdraw() do programa
DEX (Raydium, Orca):
Ordens abertas armazenadas em PDAs - Order Book contém PDA de cada ordem aberta. Cancelar ordem = fechar PDA + retornar rent
Programas de staking:
Seus tokens em stake ficam em PDA - programa controla período de unlock, você não pode "roubar" seus próprios tokens antes do vencimento
É Possível Retornar Rent de PDA
Depende da implementação do programa.
Se programa previu Close Authority para usuário:
✅ Você pode fechar PDA e retornar rent
Exemplos: Versões desatualizadas do Serum DEX, protocolos de lending antigos
Se programa não previu:
❌ PDA permanece aberto para sempre
Exemplos: Alguns programas de staking criam PDAs permanentemente
Se fundos ainda estão em uso:
❌ Fechamento impossível até retirada
Exemplo: Não pode fechar PDA com empréstimo ativo em lending
Como Determinar Se Você Pode Retornar Rent
Passo 1: Verificar Owner
Abra conta no Solscan e verifique se Owner é um programa conhecido (Raydium, Orca).
Passo 2: Verificar Saldo
Se saldo = apenas rent (sem tokens/dados), fechamento pode ser possível.
Passo 3: Verificar Close Authority
Alguns exploradores mostram campo Close Authority. Se é seu endereço - você pode fechar.
Detecção Automática em Ferramentas de Cleanup
Serviços de qualidade:
- Escaneiam todas as contas onde você é Rent Payer
- Filtram por programas com lógica conhecida
- Verificam saldo e status via RPC
- Mostram apenas PDAs seguros para fechar
Aviso: Não feche PDAs manualmente sem entendimento. Pode perder acesso a fundos no protocolo.
#Como usar Ledger e hardware wallets para cleanup?
Hardware wallets fornecem segurança máxima mas requerem passos adicionais para operações de cleanup.
Por Que Ledger Bloqueia Transações Complexas
Limitação de tela: Ledger Nano S/X tem tela de 128×64 pixels. Pode mostrar endereço (parcialmente), valor de transferência e informações básicas de transação, mas NÃO detalhes de 20 instruções CloseAccount, lista de todas as contas afetadas, ou chamadas complexas de smart contract.
Mecanismo de proteção: Se Ledger não pode exibir detalhes da transação, rejeita por padrão com erro:
Condition of use not satisfied (0x6985)
O Que é Blind Signing
Blind Signing - modo onde você permite que Ledger assine transações sem exibição completa de detalhes na tela.
Como habilitar:
- Conecte Ledger ao computador
- Abra app Solana no dispositivo
- Pressione ambos os botões simultaneamente para entrar em Settings
- Encontre opção "Blind signing"
- Mude para "Enabled"
- Saia de Settings
Importante: Esta configuração está dentro do app Solana no Ledger, não no Ledger Live no computador.
Riscos do Blind Signing
Perda de verificação no dispositivo: Você não vê o que está assinando. Teoricamente, site malicioso poderia enviar transação transferindo todo SOL para hacker e fechando suas contas - e você não veria isso na tela do Ledger.
Como minimizar riscos:
- ✅ Habilite Blind Signing apenas para operação específica
- ✅ Use apenas serviços verificados
- ✅ Verifique simulação de transação na carteira Phantom/Solflare (se usando como interface)
- ✅ Desabilite Blind Signing imediatamente após uso
Workflow Alternativo Sem Blind Signing
Método 1: Cleanup parcial
Algumas operações simples não requerem Blind Signing - fechar 1-3 contas por transação, tokens SPL simples sem extensões.
Método 2: Exportar via xpub
- Exporte extended public key do Ledger
- Importe para hot wallet (watch-only)
- Faça cleanup na hot wallet
- Envie SOL recuperado de volta ao Ledger
Método 3: Criar carteira intermediária
- Transfira fundos para hot wallet temporária
- Faça cleanup na hot wallet
- Retorne fundos ao Ledger
#Como recuperar rent de carteiras multisig?
Carteiras multisignature (Squads Protocol, Goki) usam múltiplas chaves para autorizar transações.
Como Multisig Funciona na Solana
Estrutura:
Multisig Vault (PDA)
├── Signer 1: Alice (1/3 voto)
├── Signer 2: Bob (1/3 voto)
└── Signer 3: Charlie (1/3 voto)
Threshold: 2/3 (precisa assinaturas de dois dos três)
Processo de transação:
- Alice cria Proposal: "Fechar 50 contas vazias"
- Bob revisa e Aprova
- Threshold atingido (2/3) → transação executa automaticamente
- Charlie pode Aprovar depois (mas já não é necessário)
Por Que Ferramentas de Cleanup Regulares Não Funcionam com Multisig
Problema: Serviços padrão tentam enviar transação imediatamente após conexão de carteira. Mas em Multisig:
- Uma assinatura é insuficiente
- Precisa criar Proposal
- Aguardar outros signatários
Momento técnico: Multisig Vault é um PDA. Tokens armazenados não nos endereços dos signatários, mas no Vault. Portanto, escanear endereço de Alice mostrará 0 contas, embora Vault tenha centenas.
Workflow de Cleanup Multisig
Passo 1: Escanear endereço do Vault
Encontre endereço do Multisig Vault na interface do Squads, cole no scanner de cleanup (Read-Only).
Passo 2: Exportar lista de contas
Algumas ferramentas avançadas permitem exportar lista de contas de tokens para fechar.
Passo 3: Criar Proposal manualmente
Na interface do Squads:
- New Proposal → Custom Instruction
- Program: Token Program / Token-2022 Program
- Instruction: CloseAccount
- Account list: colar da exportação
- Create Proposal
Passo 4: Coletar assinaturas
Envie link do Proposal para outros signatários. Após atingir threshold, transação executa.
Automação para Multisig
Desenvolvedores podem criar scripts usando Squads SDK para automatizar criação de proposal, coleta de assinaturas e execução. Custo inclui gas para criação do Proposal mais gas de execução da transação.
#Como interpretar códigos de erro comuns da Solana?
Solana usa códigos de erro numéricos que nem sempre são claros para usuários.
Códigos de Erro Comuns Durante Cleanup
0x0 (Success): Não é erro. Transação executada com sucesso.
0x1 (Insufficient funds): SOL insuficiente para pagamento de gas ou mínimo rent-exempt. Solução: Recarregar saldo.
0x3 (Invalid account data): Conta tem estrutura de dados incorreta. Causa: Token bugado, metadados corrompidos. Solução: Pular esta conta, fechar as outras.
0x7 (Account already in use): Outra transação simultaneamente modificando esta conta. Solução: Aguardar 5-10 segundos, tentar novamente.
0xBB8 (3000 - Account not rent exempt): Tentativa de criar conta sem depósito suficiente. Em contexto de cleanup: Bug da ferramenta (erro raro).
0x1771 (6001 - Custom program error): Erro específico do programa particular. Precisa verificar detalhes na mensagem de erro.
Como Obter Detalhes do Erro
No Phantom/Solflare:
Após transação falhar aparece:
Transaction failed
View in Explorer →
Clicar → abre Solscan com log completo.
No Solscan:
- Encontre seção "Program Logs"
- Procure por linhas com "Error:"
- Frequentemente há descrição legível
Exemplo:
Program log: Error: Account has non-zero balance
Program TokenkegQf... failed: custom program error: 0x10
Interpretação: 0x10 = "Non-zero balance", não pode fechar conta com tokens.