setApprovalForAll é a função ERC-721 / ERC-1155 que concede a um contrato ou endereço permissão geral para transferir todos os NFTs ou tokens de uma coleção particular pertencentes ao seu endereço — presentes e futuros. Uma única assinatura, escopo indefinido, sem limite por token. O padrão OpenSea de "aprovar uma vez, negociar muitas vezes" depende disso; os kits Inferno Drainer e Pink Drainer exploram isso. Em termos de dólares, esta é uma das chamadas de função mais caras da história do Ethereum.

Por que setApprovalForAll existe

Marketplaces de NFT precisam poder transferir NFTs em nome dos vendedores sem exigir uma transação de approval separada para cada listing. OpenSea, LooksRare, X2Y2, Blur — todos usam setApprovalForAll para conceder ao contrato de marketplace permissão para mover NFTs quando vendas executam.

Isso é conveniente para uso legítimo. Também é uma catástrofe de uma assinatura se o contrato que você aprovou se revelar malicioso. Diferente dos approvals ERC-20 (que têm limite de quantia por token), setApprovalForAll é binário: sim ou não, tudo ou nada.

A mecânica do drainer

Página falsa de mint → usuário conecta carteira → botão de mint pede setApprovalForAll no contrato NFT mais valioso na carteira do usuário → usuário assina sem ler → atacante agora tem direitos de transferência sobre cada NFT naquela coleção naquele endereço.

O atacante tipicamente atrasa o drain. Às vezes esperam até o usuário adicionar mais NFTs à carteira (um butim maior). Às vezes esperam até um evento de mercado reduzir a vigilância do usuário. Às vezes o drain acontece imediatamente se a carteira contém ativos sensíveis ao tempo como NFTs em staking prestes a ser destravados.

Pela contabilidade da Chainalysis, o Inferno Drainer sozinho exfiltrou cerca de US$ 80 milhões em 2023, primariamente via assinaturas setApprovalForAll em páginas falsas de mint distribuídas pelo Discord.

Como a UI de uma carteira apresenta setApprovalForAll

A transação lê "setApprovalForAll" no campo de função, com dois parâmetros: um endereço "operator" (o contrato recebendo o approval) e um booleano (true para conceder, false para revogar). Carteiras modernas como Rabby e a MetaMask pós-2024 mostram isso claramente, frequentemente com aviso se o endereço operator for desconhecido.

Firmware mais antigo de hardware wallet mostra a transação raw com dados em hex. O firmware pré-2024 do Ledger Nano S Plus não parsava setApprovalForAll de forma significativa; o Trezor Safe 3 e Safe 5 fazem. Se sua hardware wallet exibir hex raw para uma chamada desconhecida, trate como red flag — recuse assinar, atualize firmware, tente novamente.

O que defende

Três regras que funcionam na prática:

Primeiro, só aprove marketplaces que você usa ativamente. Se você minta exclusivamente no OpenSea, não aprove o contrato do LooksRare. Cada approval não utilizado é uma superfície de ataque futura.

Segundo, revogue após primeiro uso de contratos não familiares. Se você conecta a um novo dApp uma vez para um claim de airdrop, imediatamente depois visite revoke.cash e remova o approval.

Terceiro, separe carteiras "trading" e "cofre". Mantenha NFTs valiosos em um endereço que tem zero approvals para qualquer coisa. Quando quiser listar um, transfira para o endereço de trading, faça o listing, depois transfira sobras de volta. Isso adiciona fricção mas elimina inteiramente a classe catastrófica setApprovalForAll.

Leitura adicional: EIP-2612 Permit, revoke.cash, Phishing.