Uma aprovação de token ERC20 é uma permissão que assina e que permite a um smart contract gastar tokens da sua carteira. Revogar aprovações antigas ou infinitas é uma prática rotineira de higiene da carteira que limita o que uma dapp comprometida pode drenar, e ferramentas como Revoke.cash ou o verificador de aprovações de tokens da Etherscan tornam isto uma tarefa de cinco minutos. A revogação apenas fecha aprovações on chain, não assinaturas permit off chain, que são o maior risco que a maioria dos utilizadores nunca vê.
Pontos-chave
- Uma aprovação de token é uma permissão que assina, e aprovações infinitas permitem que um contrato continue a gastar os seus tokens até as cancelar.
- Revoke.cash e o verificador de aprovações de tokens da Etherscan leem os mesmos dados da blockchain, por isso escolha com base na interface e no modelo de confiança, e não nas funcionalidades.
- O phishing de aprovações usa assinaturas permit e Permit2 que parecem inícios de sessão, e revogar aprovações ERC20 não faz nada para as remover.
- Trate a limpeza como higiene rotineira, agrupe operações quando possível e reserve gas, em vez de esperar por um momento de pânico depois de um protocolo ser atacado.
O que é uma aprovação de token e porque é que a haveria de revogar?
Quando troca um token numa exchange descentralizada, empresta colateral num mercado de empréstimos ou move ativos para um produto de rendimento, o contrato de destino normalmente não consegue puxar os seus tokens sozinho. Os tokens ERC20 foram concebidos com um modelo simples de allowances: o contrato do token não sabe que aplicação está a usar, e a aplicação não pode mover tokens a menos que a tenha autorizado explicitamente a fazê-lo. Assim, antes de uma negociação ou de um depósito, a sua carteira pede-lhe que assine uma transação de aprovação que diz, na prática, que o router da Uniswap pode gastar até X dos seus USDC, ou um montante ilimitado.
Essa aprovação assinada fica armazenada dentro do próprio contrato do token, on chain, e permanece lá até a cancelar. Se aprovou um router para 100 USDC e usou 95, os 5 restantes ficam como allowance. Se aprovou um montante ilimitado, essa allowance fica ativa para sempre até a revogar, e esse é o problema central. Carteiras como a MetaMask mostram isto como "ilimitado" em vez do número gigantesco, em parte para ocultar o quão exposto o utilizador está.
As aprovações não são más por si só. São a forma como DeFi funciona. O risco vem de três pontos. Primeiro, a dapp que aprovou é atacada mais tarde e o atacante invoca a allowance ainda ativa. Segundo, a dapp é uma fraude desde o primeiro dia e a aprovação é todo o payload. Terceiro, usou um protocolo há meses, esqueceu-se dele, e esse protocolo entretanto mudou de mãos, foi atualizado ou migrou. Nenhum destes problemas é teórico: o incidente da Badger DAO em 2022 perdeu cerca de 120 milhões de dólares em parte porque aprovações antigas no router da Badger foram abusadas, e inúmeras perdas pessoais remontam a aprovações concedidas a sites de phishing.
O que pode realmente correr mal: a superfície de risco real
A forma mais clara de pensar no risco das aprovações é separar três camadas: o contrato spender, o contrato do token e a camada de assinatura. Cada camada tem um raio de impacto diferente quando falha, e a maioria dos guias junta tudo numa só. Não são a mesma coisa.
O contrato spender. Esta é a dapp, o router ou o cofre a que deu permissão. Se este contrato for atualizado, explorado ou simplesmente alvo de um rug pull pelas chaves de administrador, qualquer allowance que aponte para ele passa a ser uma allowance que aponta para o atacante. Com uma aprovação infinita, o atacante pode drenar todos os tokens desse tipo da sua carteira numa única chamada, sem precisar de mais assinaturas.
O contrato do token. A aprovação é registada no próprio token. Revogar significa enviar uma nova transação para o token que repõe a sua allowance para esse spender a zero. Até essa transação ser minerada, a allowance antiga continua ativa. Não existe botão de "anular", apenas uma nova transação que substitui a allowance antiga.
A camada de assinatura. Esta é a parte que a maioria dos utilizadores não percebe. Carteiras e dapps modernas usam assinaturas off chain (eth_sign, EIP 2612 permit, Permit2 da Uniswap) para que possa conceder uma aprovação sem pagar gas, ou até sem enviar qualquer transação. Essas assinaturas não são armazenadas on chain como aprovações, vivem no histórico de quem assina. Uma assinatura maliciosa pode dar a um spender permissão para puxar tokens da sua carteira, e revogar as suas aprovações on chain não faz absolutamente nada em relação a isso. A solução é uma ferramenta diferente, que abordamos abaixo.
O enquadramento honesto: revogar é necessário, mas não suficiente. Fecha a fuga lenta das allowances on chain que ficaram para trás, mas não fecha a porta que uma assinatura permit abriu ontem.
Aprovações infinitas vs finitas: qual é realmente mais segura?
A maioria das carteiras usa 'ilimitado' por predefinição por conveniência, porque a alternativa é assinar uma nova aprovação sempre que o teu saldo muda. Do ponto de vista da segurança, uma aprovação finita é estritamente mais segura, mas não é gratuita.
Uma aprovação infinita custa-te uma transação na primeira vez que usas uma dapp e depois zero transações contínuas, porque a permissão é suficientemente grande para cobrir qualquer interação futura. A desvantagem é exatamente o risco de cauda longa descrito acima: uma dapp que usaste uma vez em 2021 continua a ter carta branca sobre os teus tokens em 2026. Uma aprovação finita, pelo contrário, custa-te uma transação praticamente sempre que depositas ou negoceias, uma vez que a permissão é consumida e tem de ser reforçada.
Na prática, os utilizadores sensatos encontram um meio-termo. Concedem aprovações infinitas apenas a um pequeno conjunto de contratos bem testados com os quais interagem semanalmente, e aprovações finitas a tudo o resto. O Revoke.cash facilita esta auditoria, porque mostra cada spender, a permissão e o token, num único ecrã.
Uma nuance: alguns tokens implementam ERC20 de formas não padrão. USDT, por exemplo, não permite alterações diretas de aprovação de um valor diferente de zero para outro valor diferente de zero. Primeiro tens de definir a permissão como zero, esperar que essa transação seja minerada e, em seguida, definir a nova permissão. O Revoke.cash trata disto automaticamente; se o fizeres manualmente através do Etherscan, tens de definir primeiro a permissão como zero.
Revoke.cash vs verificador de aprovações de tokens do Etherscan
Estas são as duas ferramentas que os principiantes vão encontrar primeiro, e não são tanto concorrentes como duas vistas sobre os mesmos dados. Ambas leem os teus eventos de aprovação on-chain diretamente da Ethereum, por isso nenhuma das ferramentas tem custódia dos teus fundos e nenhuma pode assinar nada por ti.
O Revoke.cash é uma dapp dedicada que lista todos os tokens que alguma vez aprovaste, incluindo tokens ERC20, NFTs ERC721 e ERC1155, e em cadeias para além da Ethereum (a maioria das principais EVMs e algumas cadeias não EVM). Agrupa permissões por contrato spender, mostra etiquetas de risco para protocolos conhecidos e revela permissões para tokens que já não deténs, que é a exposição oculta mais comum. Também liga a uma transação de revogação pré-preenchida na tua carteira. O site é open source e existe desde o início da era DeFi, o que é importante para a confiança.
O verificador de aprovações de tokens do Etherscan está dentro do explorador de blocos Etherscan. Ligas um endereço de carteira e ele lista todas as aprovações ERC20 associadas a esse endereço, com ligações para os contratos relevantes do token e do spender. É mais conservador e tem menos funcionalidades, mas herda a confiança da marca Etherscan e é uma segunda opinião útil se um resultado do Revoke.cash parecer estranho.
Ambas as ferramentas exigem que assines uma transação de revogação na tua própria carteira. Também podes fazer o mesmo chamando 'approve(spender, 0)' diretamente no contrato do token através do separador write contract do Etherscan, mas esse caminho é mais fácil de errar e mais difícil de auditar. Para principiantes, o Revoke.cash é a opção predefinida mais limpa.
A armadilha das assinaturas: porque revogar não chega
As assinaturas Permit (EIP 2612) e o Permit2 da Uniswap foram introduzidos para tornar as aprovações mais baratas ou sem gas. Em vez de enviares uma transação de aprovação, assinas uma mensagem off-chain que diz 'Autorizo o spender X a movimentar até Y do meu token Z'. Essa mensagem é depois submetida pelo spender, e o contrato do token verifica-a on-chain e define a permissão por ti, na mesma transação que a ação que a utiliza. Do ponto de vista do utilizador, a UX é mais fluida: menos confirmações, sem gas separado.
A armadilha é que um site malicioso também pode pedir-te exatamente a mesma assinatura, com uma permissão muito maior e um prazo de expiração muito mais longo. A assinatura não faz nada até o spender a submeter, mas, uma vez submetida, é indistinguível de qualquer outra aprovação on-chain. Pior ainda, alguns kits de phishing pedem assinaturas de permit que não são usadas de imediato, mas vendidas na dark web para serem resgatadas mais tarde, depois de o utilizador já ter seguido em frente.
Revogar as tuas aprovações on-chain não toca nestas assinaturas. A permissão criada por um permit só existe on-chain depois da submissão e, quando passa a existir, aparece no Revoke.cash como qualquer outra aprovação, pelo que ainda podes revogá-la. Mas a janela perigosa é antes da submissão, quando nem o Etherscan nem o Revoke.cash a conseguem ver. Essa janela só é fechada ao nível da assinatura.
As ferramentas práticas de defesa funcionam ao nível da carteira: ferramentas como Scam Sniffer, Pocket Universe, Blowfish, e os avisos integrados em carteiras como Rabby e a versão mais recente da MetaMask, intercetam assinaturas suspeitas antes de as assinares. A disciplina a adotar é simples: nunca assines um permit ou uma aprovação off-chain a menos que compreendas totalmente a mensagem, o spender e a permissão que concede. Lê os ecrãs de aviso que a tua carteira te mostra. Se a dapp estiver a pedir um permit quando apenas querias ver um site, esse é o sinal de phishing.
Uma rotina de limpeza segura e repetível
O objetivo de uma rotina é remover a decisão 'devo revogar isto' no momento, porque é aí que tens maior probabilidade de cometer um erro. Executa a rotina trimestralmente, ou depois de qualquer interação com um protocolo sobre o qual não tenhas 100 por cento de certeza.
Passo 1: Abre o Revoke.cash (ou o verificador de aprovações de tokens do Etherscan como alternativa) e liga a carteira que queres auditar. Revê a lista de spenders. Tudo o que não reconheceres, ou tudo o que apontar para um protocolo que já não usas, é candidato a revogação.
Passo 2: Ordena por etiqueta de risco. O Revoke.cash assinala protocolos conhecidos e spenders maliciosos conhecidos. Tudo o que estiver neste último grupo deve ser revogado imediatamente, independentemente do tamanho da permissão.
Passo 3: Para os spenders restantes, decide entre infinito e finito. Se o protocolo fizer parte da tua rotação semanal, mantém a aprovação infinita e apenas toma nota. Se o usas mensalmente ou menos, define a permissão para o montante exato que pretendes usar, ou coloca-a a zero e volta a aprovar mais tarde.
Passo 4: Agrupa quando puderes. O Revoke.cash permite-te colocar várias revogações numa única transação em algumas carteiras, o que reduz materialmente o gas. Na Ethereum mainnet, revogar uma dúzia de aprovações uma a uma pode custar 20 a 60 dólares em gas em períodos de maior movimento, enquanto uma versão agrupada custa uma taxa base mais um pequeno acréscimo. Não há pressão temporal on-chain para revogações, por isso podes esperar por uma janela de gas baixo se o custo for importante.
Passo 5: Depois de revogar, executa o verificador mais uma vez para confirmar que cada permissão visada agora aparece como zero. Em seguida, audita o teu histórico de assinaturas na tua carteira (Rabby e MetaMask mostram ambas mensagens assinadas recentes) e assinala tudo o que parecer desconhecido. Qualquer coisa que não consigas explicar deve ser tratada como comprometida, e deves considerar mover os fundos para uma carteira nova.
Como seguir a higiene de aprovações de forma inteligente
A higiene de aprovações não é um botão de pânico pontual. É um hábito, como rodar chaves API ou rever extratos bancários, e compensa mais quando é aborrecida. O Zippfeed destaca manchetes sobre carteiras e DeFi com pontuação de sentimento (bullish, neutral ou bearish) e uma classificação de importância, para que consiga detetar uma grande exploração de um protocolo assim que é reportada e auditar as suas autorizações antigas antes de o ciclo noticioso avançar.