Permit2 Phishing: How One Signature Drains a Wallet
Quick answer. A phishing site asks you to sign a Permit or Permit2 message naming the attacker as spender. The attacker submits the signature onchain and moves your tokens, with no approval transaction from you.
Video transcript
One signature, framed as a login or a claim, can let an attacker drain your tokens. No approval transaction required.
A normal approval is an onchain transaction, with gas and a wallet warning. A permit is only a signature, and anyone holding it can turn it into an allowance.
A fake airdrop or mint page asks you to connect. It requests a signature. You sign, and no gas is paid. Then the attacker submits it and moves your tokens.
ScamSniffer names Permit as the main signature type behind large phishing thefts in both 2024 and 2025. In 2025, Permit and Permit2 drove 38 percent of large-case losses.
In a Permit2 request, three fields decide the damage. The spender should be the app you meant to use. An unlimited amount or an expiration years away is a red flag.
Before signing, read the typed data, not the site's description. Simulate first. Sign exact amounts with short expirations. On treasury wallets, two people check every signature.
Signed something bad? Act fast. Revoke existing allowances, or batch them with lockdown. Invalidate the nonces of unused signatures, since revoke tools cannot see them until they are submitted.
Guardian's browser extension pentest checks that the signed payload matches the screen. Read the full article, or talk to Guardian at guardian.security.
A token approval is normally an onchain transaction, with a gas fee and a wallet warning. A permit is only a signature.
That makes it a favorite of drainer kits. ScamSniffer's annual reports name Permit as the main signature type behind large phishing thefts in both 2024 and 2025.
Here is how permits work, what a malicious request looks like field by field, and the controls that stop it.
Permits vs Approvals
EIP-2612 adds a permit function to ERC-20 tokens. The owner signs an EIP-712 message naming the owner, spender, value, nonce and deadline.
The standard says: "The caller of the permit function can be any address." So whoever holds the signature can turn it into an allowance.
Permit2 is Uniswap's version for any ERC-20 token. You approve the Permit2 contract once per token, then grant spenders access by signature.
It has two parts:
- AllowanceTransfer: a stored allowance with an amount and an expiration.
- SignatureTransfer: a one-time transfer, valid only in the transaction that spends the signature.
| approve() | EIP-2612 permit | Permit2 | |
|---|---|---|---|
| Who sends the transaction | The token owner | Anyone with the signature | Anyone with the signature |
| Owner pays gas | Yes | No | Only for the one-time Permit2 approval |
| Tokens covered | Any ERC-20 | Only tokens that implement it | Any ERC-20 approved to Permit2 |
| Built-in expiry | None | Signature deadline | Signature deadline and allowance expiration |
| Visible in revoke tools | After the transaction | Only after it is submitted | Only after it is submitted |
How the Scam Works
- A fake airdrop, mint or support page asks you to connect a wallet.
- It requests a signature, often framed as a login or a claim.
- You sign. No transaction is sent and no gas is paid.
- The attacker submits your signature, gains the allowance and transfers your tokens.
Revoke.cash puts it simply: "it may look like you're simply signing into a website, but you're actually granting an approval." It notes that the warnings wallets show for approval transactions are missing for permit signatures.
Permit2 needs one precondition: a standing approval from you to the Permit2 contract. Uniswap's docs recommend a maximum approval, so anyone who has used a Permit2 app may already have one.
A single Permit2 signature can also cover several tokens. Revoke.cash warns that this flexibility makes requests harder to understand, and phishing sites abuse it.
The losses
ScamSniffer's figures cover wallet drainer phishing on EVM chains.
| 2024 | 2025 | |
|---|---|---|
| Total lost | About $494M | $83.85M (down 83%) |
| Victims | 332,000 addresses | 106,106 |
| Large cases | 30 cases exceeding $1M | 11 cases of $1M or more |
| Share of large-case losses | Permit: 56.7% | Permit and Permit2: 38% |
The Permit shares cover only those large cases, not all losses.
The largest 2025 theft was $6.5M in stETH and aEthWBTC, in September, through a Permit signature.
Decoding a Permit2 Request
The request below is illustrative, not a captured attack. The field names are Permit2's own; the values show what a drainer typically asks for.
| Field | Illustrative value | What it means |
|---|---|---|
domain.name | Permit2 | You are authorizing the Permit2 contract |
domain.verifyingContract | 0x000000000022D473030F116dDEE9F6B43aC78BA3 | Permit2's address on Uniswap chains except zkSync |
details.token | Your largest stablecoin | The token exposed |
details.amount | 1461501637330902918203684832716283019655932542975 | type(uint160).max: unlimited |
details.expiration | A date years away | When the allowance stops working |
details.nonce | 0 | Replay protection |
spender | An address you do not recognize | Who can move your tokens |
sigDeadline | Minutes or hours from now | Last moment the signature can be used |
Three fields decide the damage: spender, amount and expiration.
The spender should be a contract of the app you meant to use. An unknown spender with an unlimited amount is a drain.
A SignatureTransfer request is shorter: a token and amount, a spender, a nonce and a deadline. It moves tokens once, in the transaction that uses it.
A plain EIP-2612 permit usually names the token contract in the domain. Check the same things: spender, value and deadline.
Controls for Teams
Before signing
- Read the typed data, not the site's description of it.
- Check spender, token, amount and expiry against the app you meant to use.
- Sign exact amounts with short expirations. Refuse unlimited, long-lived permits.
- Simulate the request first, in the wallet or a simulator, and read the result.
- Never sign a permit from a link, airdrop or login prompt you did not seek out.
- On treasury wallets, treat a signature like a transaction: two people check it.
Signing data you cannot read is blind signing. Our explainer on what blind signing is covers the wider habit.
After a bad signature
Permit2 has its own functions for this. Revoke.cash shows Permit2 allowances and can revoke them for you.
| Situation | Call | Effect |
|---|---|---|
| Permit2 allowance active | approve(token, spender, 0, 0) | Sets the allowance to zero |
| Several Permit2 allowances | lockdown(pairs) | Batch-revokes token and spender pairs |
| Allowance signature not yet used | invalidateNonces(token, spender, newNonce) | Invalidates every nonce below newNonce |
| One-time transfer not yet used | invalidateUnorderedNonces(wordPos, mask) | Burns the chosen nonces |
| EIP-2612 permit already used | approve(spender, 0) on the token | Clears the normal allowance |
| No longer using Permit2 | approve(Permit2, 0) on the token | Removes the base approval |
Act fast. Revoke.cash notes that scammers try to use a signature as soon as possible, and that no tool can list a signature until it is submitted onchain.
If tokens are already gone, follow our first-hour checklist for a drained wallet.
For wallet teams
- Decode Permit, Permit2 and batch requests into token, amount, spender and expiry.
- Warn on unlimited amounts, unknown spenders and long expirations.
- Give signatures the same warnings as approval transactions.
Our browser extension pentest guide for crypto wallets covers the rest of the signing screen.
How Guardian Helps
Guardian's browser extension pentest checks signing flows: what the user sees before approving, and whether the signed payload matches the screen.
An SDK audit covers what a library encodes and hands to a wallet.
For institutions, Guardian designs approval thresholds and key custody. Managed Security reviews every multisig transaction before it is signed.
Frequently Asked Questions
What is Permit2?
A Uniswap contract that lets apps get token access by signature. You approve Permit2 once per token, then sign messages that give a spender an expiring allowance or a one-time transfer.
Can I cancel a Permit2 signature before it is used?
Yes, if you act before it is submitted. Call invalidateNonces for an allowance signature, or invalidateUnorderedNonces for a one-time transfer. Drainers try to submit signatures at once, so also revoke any allowance that already exists.
Does revoking approvals stop a permit drain?
It removes allowances that already exist onchain. A signature that has not been submitted does not appear in revoke tools, per Revoke.cash, so invalidate its nonce or move the tokens.
Is signing a message safer than sending a transaction?
Not always. A Permit or Permit2 message can grant the same spending power as an approval transaction, without gas and sometimes without a wallet warning. Read every field before you sign.
Sources
- Ethereum Improvement Proposals: ERC-2612, Permit Extension for EIP-20 Signed Approvals (created April 13, 2020)
- Uniswap Developers: Permit2 Overview (accessed November 5, 2026)
- Uniswap Developers: Allowance Transfer (accessed November 5, 2026)
- Uniswap Developers: Signature Transfer (accessed November 5, 2026)
- Uniswap: permit2, IAllowanceTransfer.sol (GitHub)
- Uniswap: permit2, ISignatureTransfer.sol (GitHub)
- Uniswap: permit2, PermitHash.sol (GitHub)
- ScamSniffer: Scam Sniffer 2024, Web3 Phishing Attacks: Wallet Drainers Drain $494 Million (January 3, 2025)
- ScamSniffer: Scam Sniffer 2025, Crypto Phishing Losses Fall 83% to $84 Million (January 3, 2026)
- Revoke.cash: What Is Permit2? (accessed November 5, 2026)
- Revoke.cash: What Are Permit Signatures? (accessed November 5, 2026)
Make every signature readable before it is signed
Guardian tests wallet signing flows, checking that what users see matches what they sign, and advises institutions on custody and signing models.