A assinatura que você não pode desfazer

Fevereiro 2025. Uma titular em Recife clica num anúncio do Twitter para um "claim grátis do BAYC temporada 2". O site parece o OpenSea, pede para ela conectar a carteira, e solicita uma assinatura rotulada "Confirmar elegibilidade ao airdrop". A assinatura é um setApprovalForAll no contrato ERC-721 dela. Ela assina.

Em quatro minutos, três Bored Apes, um Pudgy Penguin e um Doodle saem da carteira. Perda pelo floor da época: 137 mil USD.

O que setApprovalForAll realmente faz

É uma única chamada de função em contrato ERC-721 ou ERC-1155 que concede a um terceiro endereço permissão para transferir qualquer NFT daquela coleção que você tenha agora ou venha a ter no futuro, até que você revogue. Uma vez concedida, o operador pode chamar transferFrom sem nenhuma interação adicional sua. A assinatura não parece incomum no MetaMask — mostra apenas o endereço do contrato e a palavra "approve".

Os três sinais na tela de assinatura

  • "setApprovalForAll" quase nunca é legítimo para airdrop. Airdrops reais usam ou uma função Merkle-claim (você assina uma transação chamando claim, sem aprovação) ou um transferFrom da própria carteira do projeto (você não assina nada). Se uma página de "claim" pede setApprovalForAll, feche a aba.
  • O endereço operador deve ser o contrato em que você confia. Veja para quem você está aprovando. Se for um EOA aleatório (externally owned account) e não o marketplace verificado, esse é o endereço do drainer.
  • O MetaMask mostra alerta desde a versão 11. Um banner vermelho aparece para aprovações de alto risco. Não passe por ele.

Se já assinou

Vá em revoke.cash ou etherscan.io/tokenapprovalchecker imediatamente. Conecte a carteira afetada. Encontre toda aprovação para endereços não-marketplace e revogue. Cada revogação é uma transação com gas — orçe 20–50 USD em ETH. Se o drainer ainda não moveu os NFTs, dá para salvar. A corrida costuma ser de menos de cinco minutos; mobile é mais rápido que desktop aqui.

A regra permanente

Reviso minhas aprovações no revoke.cash uma vez por mês. Mantenho um screenshot da lista do mês anterior. Qualquer aprovação nova que eu não tenha autorizado conscientemente é revogada na mesma hora.