TL;DR
Your wallet was drained not because someone stole your keys, but because you signed a message you couldn't read. Signing, approving, and sending are three different operations in MetaMask — and signing is the one people ignore most and lose the most to. Permit-type signatures are the worst: they need no gas and leave no trace in your transaction history, so an attacker can move your tokens on-chain after you've signed, while you think you "never clicked anything." CertiK attributes roughly $723 million in 2025 phishing losses across 248 incidents1. The rule that keeps your wallet safe is one line: never sign anything you can't read. Below, we separate signing from approving and sending, break down four signature types by risk, and give you a pre-sign checklist and an after-the-fact plan.
Separating the three "consents": sending, approving, and signing
Beginners stumble here most. Every MetaMask confirmation is one of three different things — tell them apart and you'll know which step actually hands your assets over.
| Operation | What you're doing | Leaves a record? | Reversible? |
|---|---|---|---|
| Send (transaction) | You initiate a transfer/contract call, pay gas | ✅ In tx history | ❌ No, on-chain |
| Approve | On-chain tx letting a contract spend a set amount of your token | ✅ In tx history | ✅ Yes, revocable (gas) |
| Sign (signature) | You sign a message, usually no gas | ⚠️ May leave nothing | ⚠️ Depends, often not |
One line to remember: approve gives a revocable, on-chain allowance you can see; sign gives an instruction that can be invisible and hard to undo. What makes signature phishing so dangerous is that it bypasses the whole "revoke approvals" defense — an off-chain signature shows no revocable record before it's executed.
For the "approve" side — how to revoke on-chain allowances — see DeFi Approval Security: How to Revoke Unused Contract Approvals. This article focuses on the more hidden "signing" side.
What is a signature, and why does "signing" lose money
A signature is you using your private key to sign a message, proving "this address agrees to this message's content." It usually creates no on-chain transaction and costs no gas, so people treat it casually — like a simple "login" or "connect wallet."
The catch: the message can be anything. It could be "allow this contract to spend my USDC," or "send 10 ETH to this address." The attacker just needs to wrap malicious content in a form you're too lazy to read — or can't read — and get you to tap "Sign."
The key difference from approval phishing is detectability:
- Approving is an on-chain transaction. You can see it in your wallet history and on block explorers, and you can revoke it afterward.
- Signing — especially Permit — is purely off-chain. Your transaction history shows nothing, and you may not even know when you "authorized" whom.
That's why so many victims say "I didn't do anything and my coins are gone" — they made no on-chain transaction. They just signed once.
Four signature types, ranked by risk
The signature requests you'll see in MetaMask, from highest to lowest risk, come down to these four.
| Type | What the prompt looks like | Risk | Handling |
|---|---|---|---|
| eth_sign | Raw hex, unreadable | 🔴 Critical | Always refuse |
| Permit / Permit2 | Looks like an approval, but no gas / no tx record | 🔴 Critical | Check spender / amount / deadline |
| personal_sign | Readable text or JSON | 🟡 Medium | Read every word |
| signTypedData (EIP-712) | Structured fields, fairly readable | 🟡 Medium | Check key fields |
eth_sign is the most dangerous blind signing. It lets you sign arbitrary raw data, so MetaMask often shows a string of hex. An attacker can pack a "move my tokens" instruction into that data and trick you into signing it. MetaMask shows a red warning for eth_sign, and wallets like imToken and OneKey have disabled it or added strong warnings. Any eth_sign request: refuse, no exceptions.
personal_sign and signTypedData are more readable — they show text or structured data — but attackers still use the "blind signing" trick: hide the key fields among a pile you won't bother reading. The test isn't "is this official," it's "do I actually understand the spender, amount, and deadline shown in this prompt."
Permit (EIP-2612) is the costliest category in recent years, covered next.
Permit and Permit2: the hardest-to-detect off-chain phishing
Permit lets you grant a token approval with a single off-chain signature — no gas, no entry in your transaction history. That's exactly why it's dangerous. Victims think they "just logged in" or "signed something to claim an airdrop," when they've actually handed their token-spending authority to an attacker.
The flow: the attacker tricks you into signing a malicious Permit → the attacker pays gas to call permit on-chain, completing the approval → then calls transferFrom to move your tokens out. You have no on-chain transaction, no gas cost, and a clean transaction history the whole time — until the coins are gone.
Real cases show how severe this is:
- One user lost about $440,000 in USDC after signing a malicious Permit2;
- A four-year-old wallet was drained of roughly $6.5 million in stETH and aEthWBTC through a Permit-signature trap3.
There's also Permit2 — Uniswap's shared approval contract. If you've previously authorized Permit2 on Uniswap, an attacker only needs one more signature from you to use Permit2's permit and transferFrom to drain your tokens, turning a single approval into a permanent signing entry point.
This scales because of a mature black-market industry — DaaS (Drainer-as-a-Service): developers bundle malicious contracts, phishing page templates, and automated sweep scripts into kits they rent to non-technical criminals for a cut of the stolen funds (often 20–30%). Known services include Inferno, Pink, Angel, Monkey, and Venom. That's why signature-phishing losses keep climbing — it drops the technical barrier to zero.
Five things to check before you sign
Build the habit: before any confirmation, pause one second and check these five things.
- Spender address — is it the official contract of a protocol you recognize? A stranger address means refuse.
- Amount — limited or unlimited? Set a limit whenever you can.
- Deadline — a legitimate Permit usually carries an expiry; treat one without it with suspicion.
- Is it eth_sign? — any eth_sign blind signing means refuse.
- Is anything asking for your seed phrase? — any request to enter or "verify" a seed phrase is a scam; MetaMask will never ask.
One-line test: if you can't read what the prompt says, don't sign. Missing one airdrop is cheaper than signing something you don't understand.
What to do after a signature-phishing drain
First identify which situation you're in — the response is very different.
Case A: you only signed a Permit-style authorization, keys intact. Immediately check and revoke the approval on Revoke.cash or a block explorer, then move remaining funds to a fresh wallet. The sooner you revoke, the more you can save.
Case B: your seed phrase / private key leaked (sweeper bot present). If funds vanish the moment you deposit, your keys are compromised and revoking won't help — an attacker with your key can do everything. Abandon the wallet now: create a new one, move out anything not yet swept, and retire the old wallet permanently. See the Seed Phrase & Private Key Security Guide.
Case C: you suspect eth_sign or an EIP-7702 delegation. eth_sign blind signing can be a one-off transfer instruction, and EIP-7702 can delegate your entire address to an attacker's contract with a single signature. In these cases the safest move is to migrate remaining assets straight to a brand-new wallet rather than trying to patch the old one.
Be clear: once tokens are gone, recovery is effectively impossible. The blockchain executed an instruction you signed, and experts put the odds near zero. Signature security can only be handled before the fact, not after.
Long-term defense: minimize your signing risk
Make these four habits stick and you'll block the vast majority of signature theft:
- Separate a hot wallet from a hardware wallet. Use a low-balance wallet for all dApp interactions (airdrops, mints, farming) and keep large holdings in a hardware wallet (Ledger/Trezor) or cold wallet, leaving only what you can afford to lose in the hot wallet. For choosing your setup, see the Complete Crypto Wallet Guide.
- Build "read the prompt" muscle memory. Run the five checks above before every signature, approval, and transaction; refuse what you can't read.
- Prefer wallets with transaction simulation. Some wallets simulate and translate a signature before you confirm (e.g. "this signature lets contract X spend all your USDC"). Use them or enable the feature.
- Always enter from the official source. Type or bookmark URLs; don't click ads in search results or links in DMs/email — phishing sites are the entry point for all of this. For a systematic approach, see the Crypto Anti-Phishing Guide.
If you don't have a wallet yet, start with the MetaMask Installation & Security Tutorial.
FAQ
My wallet was drained but I never clicked anything — what happened?
You most likely signed a message you couldn't read at some point. Signature phishing — especially Permit — lets an attacker collect your authorization off-chain, then submit it on-chain to move your tokens, with no transaction in your history and no second confirmation. CertiK attributes roughly $723 million in 2025 phishing losses across 248 incidents to attacks like this1.
What's the difference between signing, approving, and sending?
Sending is a transaction you initiate, on-chain and irreversible. Approving is an on-chain transaction that lets a contract spend a set amount of your token, and it can be revoked. Signing produces a digital signature on a message — it may create no on-chain transaction at all, yet it can hand your spending authority to someone else. Signing, especially Permit, is where most people lose money.
What is a Permit signature and why can I be drained without paying gas?
Permit (EIP-2612) lets you grant a token approval with a single off-chain signature — no gas, no entry in your transaction history. An attacker tricks you into signing a malicious Permit, then submits it on-chain to complete the approval and drain your tokens. Known cases include one user losing about $440,000 in USDC and a four-year-old wallet drained of roughly $6.5 million in stETH and aEthWBTC.
What should I do when I see an eth_sign request?
Refuse it, always. eth_sign signs arbitrary raw data, so the prompt is often an unreadable hex string. An attacker can pack a "move my tokens" instruction into that data and trick you into signing it. MetaMask shows a red risk warning for eth_sign, and wallets like imToken and OneKey have disabled or strongly warned against it. Any eth_sign request should be rejected without exception.
I already signed something suspicious — can I still fix it?
It depends. If it was a Permit-style authorization, immediately check and revoke it on Revoke.cash or a block explorer, then move remaining funds to a fresh wallet — the sooner you revoke, the more you can save. But once tokens are already gone, recovery is effectively impossible: the blockchain executed an instruction you signed, and experts put the odds near zero.
Can revoking approvals stop signature phishing?
Not fully. Revoking only cancels on-chain approve transactions you already made. Signature phishing — especially Permit — is off-chain, so there's no revocable record to see before it's executed. The real defense is reading every prompt, refusing blind signing, and separating funds between a hot wallet and a hardware wallet.
How do I decide whether a signature is safe to sign?
Check these before signing: ① the spender address — is it a protocol you recognize?; ② the amount — limited or unlimited?; ③ the deadline — legit Permits usually carry one; ④ is it eth_sign?; ⑤ is anything asking for your seed phrase? If any item doesn't add up, or you can't read what the prompt says, refuse.
Further reading
- DeFi Approval Security: How to Revoke Unused Contract Approvals — the sibling topic: revoking on-chain approvals
- Seed Phrase & Private Key Security Guide — the other big risk beyond signatures: keeping your seed phrase safe
- Crypto Anti-Phishing Guide — a systematic breakdown of 7 phishing methods
- On-Chain Guide — more blockchain and Web3 security explainers
No crypto yet? Buy on an exchange first, then withdraw to your own wallet. Binance (code BINANBT) | OKX (code 60895497)
Disclaimer: This content is for educational purposes only and does not constitute investment advice. Cryptocurrency investing involves risk; make decisions based on your own situation.