Valide endereços EIP-55, Bitcoin, TRON e Solana e veja a forma correta com checksum.
Inspetor de pedidos de assinatura
A ferramenta em si está em inglês; esta página explica como usá-la no seu idioma.
Use Inspetor de pedidos de assinatura
O que ele faz
Cole o que uma carteira ou um site pede para você assinar e veja, em inglês simples, o que isso autorizaria. Aprovações de tokens, permits, assinaturas Permit2 e listagens Seaport que pagam outra pessoa são marcadas em vermelho.
Ele funciona inteiramente no seu navegador: nada do que você digitar é enviado.
Como usar Inspetor de pedidos de assinatura
- Copie o pedido bruto. Pegue o texto exato que pedem para você assinar: o JSON EIP-712, os dados 0x de uma transação, o objeto de transação inteiro, uma requisição JSON-RPC ou o texto da mensagem.
- Cole e inspecione. Cole na caixa. A inspeção começa ao colar; você também pode clicar em Inspect (inspecionar) ou pressionar Ctrl+Enter.
- Confira como foi lido. A primeira linha diz como a entrada foi lida, por exemplo transaction object. Se estiver errado, escolha o tipo certo em Read the input as.
- Leia a placa colorida. O selo, o título e o resumo dizem em inglês simples o que a assinatura permitiria. A lista abaixo traz as sinalizações; as mais graves ficam em negrito.
- Confira os campos. Veja na tabela o spender ou operator, o token, a quantidade, a expiração e a rede. Abra Decoded arguments ou Message fields para os valores brutos.
- Decida e compartilhe. Se você não conhece o spender, rejeite o pedido na sua carteira e consulte os endereços em um explorador de blocos. Copy report gera um resumo em texto simples com os links neutralizados.
Exemplo
Assinatura Permit2 para uma permissão ilimitada de USDC
{
"types": {
"EIP712Domain": [
{
"name": "name",
"type": "string"
},
{
"name": "chainId",
"type": "uint256"
},
{
"name": "verifyingContract",
"type": "address"
}
],
"PermitSingle": [
{
"name": "details",
"type": "PermitDetails"
},
{
"name": "spender",
"type": "address"
},
{
"name": "sigDeadline",
"type": "uint256"
}
],
"PermitDetails": [
{
"name": "token",
"type": "address"
},
{
"name": "amount",
"type": "uint160"
},
{
"name": "expiration",
"type": "uint48"
},
{
"name": "nonce",
"type": "uint48"
}
]
},
"primaryType": "PermitSingle",
"domain": {
"name": "Permit2",
"chainId": 1,
"verifyingContract": "0x000000000022D473030F116dDEE9F6B43aC78BA3"
},
"message": {
"details": {
"token": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"amount": "1461501637330902918203684832716283019655932542975",
"expiration": "281474976710655",
"nonce": "0"
},
"spender": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB",
"sigDeadline": "115792089237316195423570985008687907853269984665640564039457584007913129639935"
}
}Read as: EIP-712 typed data. Change this with “Read the input as”.
DangerousPermit2 PermitSingle: token allowance by signature (UNLIMITED)
Signing lets 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB move an unlimited amount of 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (USDC token on Ethereum) out of your wallet through Permit2. The allowance never expires in practice. The spender submits this signature itself, so you will not see another prompt. Drainers favour Permit2 because many wallets have already approved Permit2 for apps such as Uniswap.
Unlimited amount: the spender can take your whole balance of the token.
The allowance never expires in practice.
The signature never expires in practice.
SPENDER 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB
TOKEN 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
USDC token on Ethereum
AMOUNT Unlimited: 2^160−1, the Permit2 maximum (1461501637330902918203684832716283019655932542975)
ALLOWANCE EXPIRES 2^48−1 (Permit2 maximum): no practical expiry (beyond the year 5000)
NONCE 0
SIGNATURE VALID UNTIL (SIGDEADLINE) 2^256−1: no practical expiry (beyond the year 5000)
DOMAIN name "Permit2"
CHAIN Ethereum (chain ID 1)
VERIFYING CONTRACT 0x000000000022D473030F116dDEE9F6B43aC78BA3
Permit2 (Uniswap)
EIP-712 DIGEST (WHAT IS SIGNED) 0x579baa31b8f7279c82034e935d103d07caa27a817903937e201389d81d55984c
DOMAIN SEPARATOR 0x866a5aba21966af95d6c7ab78eb2b2fc913915c28be3b9aa07cc04ff903e3f28
MESSAGE HASH (HASHSTRUCT) 0xb646364eb4dc82faf68b61d79beb585797490532ff745845f3821e6f8573463c
PRIMARY TYPE PermitSingle(PermitDetails details,address spender,uint256
…Placa vermelha: o spender 0xbBbB…BBbB poderia mover uma quantidade ilimitada de USDC pelo Permit2, e nem a permissão nem a assinatura expiram. O digest EIP-712 é calculado.
O que ele verifica
| Sinal | O que isso significa |
|---|---|
| Selo de risco: Dangerous, Check carefully, Low risk ou Note | Dangerous significa que o pedido pode entregar tokens ou NFTs. Aprovações recebem esse selo mesmo para um app conhecido, porque o poder concedido é o mesmo. Uma revogação, como approve com quantidade 0, aparece como Low risk. |
| Spender ou operator em vermelho | O endereço que ganharia o direito de mover os seus ativos. Alguns contratos são identificados, como Permit2, Seaport e o conduit da OpenSea; qualquer outro endereço precisa ser verificado. |
| Quantidade ilimitada | Aparece para 2^256−1 ou qualquer valor de 2^255 ou mais e, em pedidos Permit2, para 2^160−1. O spender poderia levar todo o seu saldo desse token, agora e depois. |
| Quantidade com as casas decimais do token | Para USDC, USDT, DAI e WETH no Ethereum, o número bruto é convertido; por exemplo, 1000000 vira 1 USDC. Para outros tokens, você vê o inteiro bruto lido com 18 e com 6 casas decimais. |
| Expiração e prazo | Na prática, nunca expira (além do ano 5000), vale por mais de um ano ou já expirou. Um permit ou uma permissão que nunca expira continua utilizável muito depois de você esquecê-lo. |
| Assinatura cega de um hash de 32 bytes | A carteira não consegue mostrar o que o hash representa, e com eth_sign ele pode ser uma transação ou um permit. Assine só um hash que você mesmo gerou. |
| Verificações de ordens Seaport | Listagem com preço zero, outros destinatários recebem mais do que quem oferece, ou itens oferecidos reaparecem com outro destinatário: típico de listagens falsas de NFT que pagam o atacante. |
| Domínio do Sign-In with Ethereum | Uma mensagem de login indica o site que a pede. Se esse domínio não for exatamente o site em que você está, a assinatura poderia permitir que outra pessoa entrasse como você. |
| Duas leituras de um seletor | approve(address,uint256) é a mesma chamada no ERC-20 e no ERC-721. A menos que o contrato seja um dos poucos tokens que a ferramenta conhece, as duas leituras são exibidas. |
Mais exemplos
Aprovação de NFT para uma coleção inteira
0xa22cb465000000000000000000000000000000000000000000000000000000000000dead0000000000000000000000000000000000000000000000000000000000000001Read as: transaction calldata (known function selector). Dangerous: setApprovalForAll: control of ALL your NFTs in this collection. Operator 0x000000000000000000000000000000000000dEaD, Approved true, Collection (to) not given.
Aprovação limitada de USDC em uma transação
{"to":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","data":"0x095ea7b3000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000000f4240","value":"0x0","chainId":1}Read as: transaction object. Dangerous: ERC-20 approval. O resumo diz que 0x000000000000000000000000000000000000dEaD poderia mover até 1000000 unidades do token USDC no Ethereum sem pedir de novo. A tabela mostra Chain Ethereum (chain ID 1), Value 0 ETH (0 wei) e Amount 1000000 com a nota 1 USDC (6 decimals).
Pedido eth_sign cego
{"method":"eth_sign","params":["0x0000000000000000000000000000000000000001","0xabababababababababababababababababababababababababababababababab"]}Read as: JSON-RPC eth_sign request. Dangerous: Blind signature: um hash de 32 bytes em vez de texto, com a sinalização de que a maioria das carteiras desativou ou escondeu o eth_sign porque drainers o usavam.
Perguntas frequentes
O que o inspetor de pedidos de assinatura verifica?
Ele decodifica typed data EIP-712, calldata de transações, objetos de transação e mensagens personal_sign ou eth_sign e calcula o digest EIP-712. Ele sinaliza aprovações de tokens, setApprovalForAll, permits EIP-2612 e DAI, assinaturas Permit2, ordens Seaport que pagam alguém que não é você e assinaturas cegas sobre um hash de 32 bytes.
Um pedido que não aparece em vermelho ainda pode ser perigoso?
Sim. A ferramenta lê só o próprio pedido: ela não vê saldos, aprovações existentes nem se um contrato é malicioso, e funções fora da sua tabela aparecem como desconhecidas. Aprovações para apps legítimos também são marcadas em vermelho, porque a assinatura concede o mesmo poder de qualquer forma.
O pedido colado é enviado a algum lugar?
Não. A decodificação e o hash rodam no seu navegador, e a página não faz nenhuma requisição de rede com a sua entrada. Um pedido de assinatura não contém segredo, mas nunca cole uma chave privada ou uma frase-semente em nenhum site.
Uma quantidade pequena torna uma aprovação segura?
Ela limita o que pode ser levado a essa quantidade, mas o spender pode usá-la a qualquer momento sem pedir de novo. Por isso a ferramenta ainda mostra uma aprovação de 1 USDC como Dangerous. Aprove só a quantidade de que precisa, para um spender que você verificou.
Por que vejo uma leitura ERC-20 e outra ERC-721 para um único approve?
Os dois padrões usam o mesmo nome de função e os mesmos tipos de argumento, então os dados 0x sozinhos não dizem qual é. Cole a transação inteira com o endereço to e verifique em um explorador de blocos se esse contrato é um token ou uma coleção de NFT.
Já assinei um pedido que aparece em vermelho aqui. E agora?
Aja rápido. Revogue as aprovações on-chain e mova o que restou para uma nova carteira. Um permit assinado que ainda não foi usado não aparece como aprovação, então mover os tokens é o passo mais seguro. O guia de emergência lista a ordem das ações.