Wallet Security Review
A disciplined, repeatable methodology for reviewing what a crypto wallet is
about to sign — or what it has already approved — before a drainer or
phishing site empties it. Approval-based attacks drained over $200M in
2024–2025, and the new EIP-7702 delegation vector (live since the 2025 Pectra
upgrade) is overwhelmingly malicious: >90% of observed on-chain 7702
delegations are linked to malicious contracts, with single phishing signs
costing victims seven figures.
The core skill is reading a signature/approval request precisely, naming the
blast radius of what it grants, and returning a blunt sign / don't-sign
verdict plus remediation.
When to Activate
Activate when the user:
- Pastes a signature or transaction request (or its raw JSON / typed-data
payload) and asks "is this safe to sign?"
- Shares a wallet address's approvals (e.g. a revoke.cash or Etherscan
Token Approval Checker export) and wants them reviewed.
- Suspects they hit a drainer or phishing site, clicked a "claim/airdrop"
popup, or already signed something and wants to know their exposure.
- Wants a wallet hygiene / approval audit ("clean up my approvals", "how
exposed am I?").
- Mentions any of: unlimited approval, Permit, Permit2, setApprovalForAll,
eth_sign, blind signing, 7702 / delegation, drainer, address poisoning,
revoke.cash.
You cannot fetch on-chain state. This skill reasons over what the user
gives you. If you need the approval list or the request payload, ask for
it (Step 1) — never invent allowances, spenders, or balances.
Step 1: Scope & Context
Establish exactly what you are reviewing before saying anything about safety.
- What are we reviewing?
- (A) A LIVE request — a signature or transaction the user is about to
approve in their wallet right now. Highest urgency: a wrong answer here
can cost them everything in one click.
- (B) An existing wallet's approvals — an audit of standing grants
(allowances, operator approvals, delegations) the wallet already made.
- (C) A suspicious site / dApp / message — triage before they interact
("is this airdrop real?", "is this the real Uniswap?").
- Which chain(s)? Ethereum mainnet, an L2 (Arbitrum, Base, Optimism,
Polygon), BNB Chain, etc. Approvals and revocation are per-chain — an
approval on Base is separate from the same token on mainnet.
- What wallet / signer? Software (MetaMask, Rabby, Phantom) vs hardware
(Ledger, Trezor, Keystone). Hardware materially lowers key-theft risk but
does not stop you from signing a malicious approval — you can hardware-sign
a wallet-draining permit just fine. Note whether clear signing is on.
- Get the artifact. Ask for whichever applies:
- the raw request payload (the JSON your wallet shows:
method, params,
typed-data domain/message, or the to/data calldata), and/or
- the approval list (from revoke.cash or the Etherscan Token
Approval Checker), including spender addresses and allowance amounts,
and/or
- the site URL and how they arrived at it (Discord DM? X link? Google ad?).
Do not proceed to a verdict until you know what is being signed/audited and
on which chain.
Step 2: Severity Model
Rate every finding by blast radius × likelihood of loss.
| Severity |
Meaning |
| 🔴 Critical |
Can drain everything now, or the wallet is likely already compromised. Includes any eth_sign/blind-sign of an unknown payload, a Permit2 full-balance sig to a hostile spender, or an unknown EIP-7702 delegation. Act immediately. |
| 🟠 High |
Large, standing exposure: an unlimited ERC-20 allowance or a setApprovalForAll to an unverified/unknown spender. Not auto-draining, but one rug away from total loss of that asset. |
| 🟡 Medium |
Real but bounded: a finite allowance larger than needed, a stale approval to a known-but-dormant contract, a Permit2 allowance with sane limits. |
| 🟢 Low |
Tight, intentional, scoped grants to verified contracts; finite allowance ≈ the amount being spent. |
| ℹ️ Info |
Context/hygiene notes (dApp disconnected ≠ revoked; bookmark the real domain; enable clear signing). |
Blast radius = how much can be taken if this is malicious (one token? the
whole NFT collection? every token ever approved to Permit2? the entire EOA?).
Likelihood = how plausibly hostile (unverified spender, phishing delivery,
no simulation, urgency).
Step 3: Signature & Approval Taxonomy (the core)
For each request type: what it does · blast radius · how to recognize it ·
safe vs dangerous. This is the heart of the review — name the exact type
before judging it.
1. ERC-20 approve(spender, amount)
- Does: grants
spender the right to pull up to amount of one token from
your wallet, repeatedly, until changed or revoked.
- Blast radius: that one token, up to
amount. Unlimited if amount is
uint256 max (2^256 − 1 = 115792089237316195423570985008687907853269984665640564039457584007913129639935, often shown as a huge number or ∞/"Unlimited").
- Recognize: an on-chain tx,
data begins 0x095ea7b3; wallet shows
"Approve TOKEN — spending cap".
- Safe: a finite cap ≈ the amount you're about to trade, to a verified,
intended contract. Dangerous: unlimited cap, or any cap to an
unverified/random spender. Disconnecting the dApp does NOT revoke an approval.
2. increaseAllowance(spender, addedValue)
- Same risk class as
approve — it raises an existing allowance. Treat an
increaseAllowance to unlimited or to an unknown spender exactly like a
dangerous approve.
3. Permit — EIP-2612 (permit)
- Does: an off-chain, gasless signature that authorizes a spender's
allowance without an on-chain approve tx.
- Blast radius: up to the permitted
value of that token — potentially the
full balance.
- Recognize: a
signTypedData_v4 request whose typed-data message has
fields like owner, spender, value, nonce, deadline; no gas, no
transaction, so it leaves no trace in your tx history — invisible until
the attacker pulls funds.
- Safe: a permit to a contract you intend to use, with a sane
value/
deadline. Dangerous: any permit whose spender you don't recognize, or
a far-future deadline. Because it's invisible and gasless, drainers love it.
4. Permit2 (Uniswap's universal approval contract)
- Does: a single signature authorizes the Permit2 contract's transfer of
your tokens to a spender. One signature is the entire authorization.
- Blast radius: enormous. A single phishing Permit2 signature can let the
spender drain allowances across every token you have ever approved to the
Permit2 contract — and drainer payloads default to full balance + a long
expiry. This is one of the highest-blast-radius signatures in the ecosystem.
- Recognize:
signTypedData_v4 with the Permit2 domain (name: "Permit2") and a PermitSingle/PermitBatch/PermitTransferFrom message
containing details (token, amount, expiration), a spender, and a
sigDeadline.
- Safe: a Permit2 sig on Uniswap itself (or another protocol you
deliberately chose), with a bounded
amount and short expiration.
Dangerous: a Permit2 sig on any site that isn't the one you intended,
an amount near full balance, or a long/odd expiration → ⛔.
5. setApprovalForAll(operator, true) — ERC-721 / ERC-1155
- Does: grants
operator blanket control of your entire NFT collection
from that contract.
- Blast radius: every NFT in that collection — all of them, transferable
at will, until revoked.
- Recognize: tx with
data 0xa22cb465; wallet shows "Approve all" /
"Set approval for all"; approved = true.
- Safe: to a major, verified marketplace you're actively listing on.
Dangerous: requested by a "mint" / "claim" / "airdrop" flow (a mint
never needs operator rights over your existing NFTs), or to an unknown
operator → 🟠/🔴.
6. eth_sign — raw-hash blind signature
- Does: signs an arbitrary 32-byte hash with no human-readable context.
An attacker can craft that hash to authorize any transaction or message.
- Blast radius: unbounded — effectively a blank check.
- Recognize:
method: "eth_sign"; wallets warn with red banners like
"Signing this message can be dangerous" / "this could let someone control
your account."
- Verdict: NEVER sign
eth_sign. No legitimate modern dApp requires it. Its
presence is itself a 🔴 red flag. (This differs from the safe, structured
personal_sign/signTypedData — but see below.)
7. personal_sign / signTypedData — disguised intents
- Does: normally benign (login / "Sign-In with Ethereum" / message
acknowledgement). But attackers stuff a disguised permit, order, or
approval into the payload.
- Blast radius: whatever the payload actually authorizes — for a hidden
Permit/Permit2/order, that's your tokens.
- Recognize: read the decoded message. A real login is human-readable
("Sign in to … nonce …"). Treat as dangerous any typed-data with
Permit/PermitSingle/order structs, a spender/seller, value/amount,
or unreadable hex.
- Safe: a clearly human-readable login/nonce with no spend authorization.
Dangerous: any spend/transfer/approval semantics hiding inside a "sign-in".
8. EIP-7702 authorization / delegation (set EOA code)
- Does: authorizes your EOA (your normal wallet address) to delegate
its code to a contract — the account now executes that contract's logic.
- Blast radius: the entire account. A malicious delegate can include a
fallback that auto-forwards any incoming balance in the same block, so the
wallet drains itself on every deposit. This is not a single token — it's the
whole address.
- Recognize: an authorization / "set code" / "delegate" / upgrade-account
request (EIP-7702
authorizationList with chainId, an address to delegate
to, and a nonce); wallet language about "smart account" / "delegate" /
"upgrade".
- Critical rule: an unknown or unverified delegation target = treat the
wallet as FULLY COMPROMISED, not "just revoke it." Over 90% of observed
7702 delegations are malicious. Redelegating to a safe address may not undo
what a hostile delegate already armed — move assets to a fresh wallet (see
Step 6). Legitimate 7702 (e.g. a known wallet's batching/gas-sponsorship
upgrade) delegates to a verified, audited implementation you chose.
Step 4: Wallet Approval Audit
When given an approval list (revoke.cash / Etherscan export), enumerate every
active grant and flag each of these:
- Unlimited allowances — any ERC-20 allowance at
uint256 max → 🟠 (🔴 if
the spender is unverified). Recommend reducing to needed amount or revoking.
- Unknown / unverified spender — spender contract is unverified on the block
explorer, has no recognizable name, or you can't tie it to a dApp you use → 🔴.
- Stale approvals — grants to contracts you no longer use (old DEX, dead
farm). Even "safe" ones are standing risk if that contract is later exploited →
🟡, revoke.
setApprovalForAll grants — list every NFT-collection operator approval;
flag any to a marketplace you no longer use or don't recognize → 🟠/🔴.
- Permit2 allowances — surface Permit2
amount/expiration per token;
flag full-balance amounts or long expiries → 🟡/🟠.
- EIP-7702 delegations — does the EOA have delegated code? If the target is
unknown/unverified → 🔴 compromised (Step 6 fresh-wallet path), not a
routine revoke.
Also screen the wallet's history and surroundings:
- Address poisoning — dust or $0 transfers from a lookalike vanity
address (matching first/last characters of an address you really use),
planted so you later copy the wrong address from history. Warn the user to
never copy a destination from tx history; verify the full address.
- Drainer-kit delayed draining — off-the-shelf drainer kits (Inferno/
Pink-style) frequently wait days after the malicious signature before
pulling funds. "Nothing happened yet" is not safety — if a bad signature
or approval exists, treat it as live and revoke/move now.
Step 5: Red-Flags Quick Scan
Any one of these flips the review toward ⛔ / 🚨:
- Unlimited approval to an unverified / random contract.
- ANY
eth_sign request — never legitimate; refuse outright.
- A Permit2 signature on a site you didn't intend (anything that isn't the
protocol you deliberately chose) — full-balance blast radius.
setApprovalForAll requested by a "mint" / "claim" — mints never need
operator rights over your existing NFTs.
- Urgency / countdown / FOMO — "limited time", "claim before it's gone",
weekend "limited mint".
- Blind signing — no human-readable decode, no simulation/preview of what
changes. Missing preview is itself a warning.
- Lookalike domain — extra hyphen, swapped letters, non-Latin/punycode
characters,
.app/.xyz clone of a real .org.
- Dust from a near-identical address in history (address poisoning).
- EIP-7702 delegation to an unknown contract → assume compromise.
- "Free airdrop / claim / giveaway / mint" sites — the dominant drainer lure.
- Delivery via Discord DM, hacked/large X account, or fake support
(fake "MetaMask"/"Coinbase"/"Ledger" help) — legitimate support never DMs you
to sign.
Step 6: Output Format
Lead with a verdict banner, then the findings, then remediation.
Verdict banner (pick one)
- ✅ LIKELY SAFE TO SIGN — recognized intent, scoped/finite, verified
spender, human-readable, on the intended site.
- ⚠️ CAUTION — VERIFY FIRST — plausible but with unconfirmed elements
(verify domain, reduce to finite, confirm the spender) before signing.
- ⛔ DO NOT SIGN — a dangerous pattern is present (unlimited to unverified,
Permit2 on the wrong site, disguised permit, mint asking
setApprovalForAll,
any eth_sign).
- 🚨 WALLET MAY BE COMPROMISED — ACT NOW — an unknown 7702 delegation, or a
live drainer approval/permit already signed with funds still at risk. Go
straight to the fresh-wallet remediation.
Findings table
| # |
Item |
Type |
Blast radius |
Severity |
| 1 |
… (token/spender/site) |
unlimited approve / Permit2 / 7702 / … |
one token / whole NFT collection / all Permit2 tokens / entire EOA |
🔴/🟠/🟡/🟢/ℹ️ |
For each finding, state "what this grants" in one plain sentence, then a
recommendation (sign / don't sign / reduce to N / revoke / move funds).
Remediation playbook
- Revoke standing approvals via revoke.cash or the Etherscan Token
Approval Checker — per chain (each revoke costs gas; do the highest-
blast-radius ones first: unlimited,
setApprovalForAll, Permit2).
- Approve only what's needed going forward — set finite caps, not unlimited.
- If a malicious EIP-7702 delegation or a live drainer approval/permit is
found and funds remain → move assets to a FRESH wallet immediately. A
compromised key or hostile delegation can't always be safely "cleaned";
transfer assets out (to a brand-new seed you generate offline) before
attempting any revoke, and assume the old address is burned.
- Use a hardware wallet and enable clear signing (ERC-7730) so you read
exactly what you sign instead of a blind hash.
- Burner / vault split — a vault wallet that never touches experimental
sites and holds the bulk of funds, and a burner/spending wallet with
limited funds for minting and new dApps.
- Simulate transactions (Tenderly / wallet preview) before signing; no
preview = warning.
- Verify domains by typing them yourself or using a bookmark — never via a
DM/ad/search link. Type seed phrases nowhere online; keep them offline.
- 2FA via an authenticator app, not SMS, on every exchange/email tied to
your crypto.
Disclaimer (always include)
Educational security guidance — not financial, legal, or investment advice,
and not a guarantee of safety. On-chain risk is real and transactions are
irreversible; this review reasons only over the information you provided
and cannot see live chain state. A "looks safe" here is not a warranty —
verify the spender, the domain, and the decoded payload yourself. If you
believe your wallet is compromised, act immediately (move funds to a fresh
wallet) and consult a qualified security professional.
Related Viprasol Skills
smart-contract-audit — audit the Solidity/EVM contract behind a
spender or 7702 delegation target for vulnerabilities and backdoors.
defi-protocol-review — assess whether the protocol asking for an
approval is itself trustworthy (admin keys, audits, oracle/TVL risk).
Not affiliated with or endorsed by Anthropic.
1---2name: wallet-security-review3description: Review a crypto wallet signature request, token approval, or wallet's exposure for drainer & phishing risk — unlimited approvals, Permit/Permit2, setApprovalForAll, eth_sign blind signing, and EIP-7702 delegations. Outputs a sign/don't-sign verdict and remediation. Use before signing anything, or to audit a wallet's approvals.4---56# Wallet Security Review78A disciplined, repeatable methodology for reviewing what a crypto wallet is9about to **sign** — or what it has **already approved** — before a drainer or10phishing site empties it. Approval-based attacks drained **over $200M in112024–2025**, and the new EIP-7702 delegation vector (live since the 2025 Pectra12upgrade) is overwhelmingly malicious: **>90% of observed on-chain 770213delegations are linked to malicious contracts**, with single phishing signs14costing victims seven figures.1516The core skill is reading a signature/approval request precisely, naming the17**blast radius** of what it grants, and returning a blunt **sign / don't-sign**18verdict plus remediation.1920---2122## When to Activate2324Activate when the user:2526- Pastes a **signature or transaction request** (or its raw JSON / typed-data27 payload) and asks *"is this safe to sign?"*28- Shares a **wallet address's approvals** (e.g. a revoke.cash or Etherscan29 Token Approval Checker export) and wants them reviewed.30- Suspects they hit a **drainer or phishing site**, clicked a "claim/airdrop"31 popup, or already signed something and wants to know their exposure.32- Wants a **wallet hygiene / approval audit** ("clean up my approvals", "how33 exposed am I?").34- Mentions any of: *unlimited approval, Permit, Permit2, setApprovalForAll,35 eth_sign, blind signing, 7702 / delegation, drainer, address poisoning,36 revoke.cash*.3738> **You cannot fetch on-chain state.** This skill reasons over what the user39> gives you. If you need the approval list or the request payload, **ask for40> it** (Step 1) — never invent allowances, spenders, or balances.4142---4344## Step 1: Scope & Context4546Establish exactly what you are reviewing before saying anything about safety.47481. **What are we reviewing?**49 - **(A) A LIVE request** — a signature or transaction the user is about to50 approve in their wallet right now. *Highest urgency: a wrong answer here51 can cost them everything in one click.*52 - **(B) An existing wallet's approvals** — an audit of standing grants53 (allowances, operator approvals, delegations) the wallet already made.54 - **(C) A suspicious site / dApp / message** — triage before they interact55 ("is this airdrop real?", "is this the real Uniswap?").562. **Which chain(s)?** Ethereum mainnet, an L2 (Arbitrum, Base, Optimism,57 Polygon), BNB Chain, etc. Approvals and revocation are **per-chain** — an58 approval on Base is separate from the same token on mainnet.593. **What wallet / signer?** Software (MetaMask, Rabby, Phantom) vs **hardware**60 (Ledger, Trezor, Keystone). Hardware materially lowers key-theft risk **but61 does not stop you from signing a malicious approval** — you can hardware-sign62 a wallet-draining permit just fine. Note whether **clear signing** is on.634. **Get the artifact.** Ask for whichever applies:64 - the **raw request payload** (the JSON your wallet shows: `method`, `params`,65 typed-data `domain`/`message`, or the `to`/`data` calldata), and/or66 - the **approval list** (from **revoke.cash** or the **Etherscan Token67 Approval Checker**), including spender addresses and allowance amounts,68 and/or69 - the **site URL** and how they arrived at it (Discord DM? X link? Google ad?).7071Do not proceed to a verdict until you know **what** is being signed/audited and72**on which chain**.7374---7576## Step 2: Severity Model7778Rate every finding by **blast radius × likelihood of loss**.7980| Severity | Meaning |81|---|---|82| 🔴 **Critical** | Can drain everything **now**, or the wallet is likely already compromised. Includes any `eth_sign`/blind-sign of an unknown payload, a Permit2 full-balance sig to a hostile spender, or an **unknown EIP-7702 delegation**. Act immediately. |83| 🟠 **High** | Large, standing exposure: an **unlimited** ERC-20 allowance or a `setApprovalForAll` to an unverified/unknown spender. Not auto-draining, but one rug away from total loss of that asset. |84| 🟡 **Medium** | Real but bounded: a finite allowance larger than needed, a stale approval to a known-but-dormant contract, a Permit2 allowance with sane limits. |85| 🟢 **Low** | Tight, intentional, scoped grants to verified contracts; finite allowance ≈ the amount being spent. |86| ℹ️ **Info** | Context/hygiene notes (dApp disconnected ≠ revoked; bookmark the real domain; enable clear signing). |8788**Blast radius** = *how much can be taken if this is malicious* (one token? the89whole NFT collection? every token ever approved to Permit2? the entire EOA?).90**Likelihood** = *how plausibly hostile* (unverified spender, phishing delivery,91no simulation, urgency).9293---9495## Step 3: Signature & Approval Taxonomy (the core)9697For each request type: **what it does · blast radius · how to recognize it ·98safe vs dangerous.** This is the heart of the review — name the exact type99before judging it.100101### 1. ERC-20 `approve(spender, amount)`102- **Does:** grants `spender` the right to pull up to `amount` of one token from103 your wallet, repeatedly, until changed or revoked.104- **Blast radius:** that one token, up to `amount`. **Unlimited** if `amount` is105 `uint256` max (`2^256 − 1` = `115792089237316195423570985008687907853269984665640564039457584007913129639935`, often shown as a huge number or `∞`/"Unlimited").106- **Recognize:** an on-chain tx, `data` begins `0x095ea7b3`; wallet shows107 "Approve TOKEN — spending cap".108- **Safe:** a **finite** cap ≈ the amount you're about to trade, to a **verified,109 intended** contract. **Dangerous:** **unlimited** cap, or any cap to an110 unverified/random spender. *Disconnecting the dApp does NOT revoke an approval.*111112### 2. `increaseAllowance(spender, addedValue)`113- Same risk class as `approve` — it **raises** an existing allowance. Treat an114 `increaseAllowance` to unlimited or to an unknown spender exactly like a115 dangerous `approve`.116117### 3. Permit — EIP-2612 (`permit`)118- **Does:** an **off-chain, gasless signature** that authorizes a spender's119 allowance without an on-chain approve tx.120- **Blast radius:** up to the permitted `value` of that token — potentially the121 full balance.122- **Recognize:** a `signTypedData_v4` request whose typed-data `message` has123 fields like `owner`, `spender`, `value`, `nonce`, `deadline`; **no gas, no124 transaction**, so it **leaves no trace in your tx history** — invisible until125 the attacker pulls funds.126- **Safe:** a permit to a contract you intend to use, with a sane `value`/127 `deadline`. **Dangerous:** any permit whose `spender` you don't recognize, or128 a far-future `deadline`. Because it's invisible and gasless, drainers love it.129130### 4. Permit2 (Uniswap's universal approval contract)131- **Does:** a single signature authorizes the **Permit2** contract's transfer of132 your tokens to a spender. One signature is the entire authorization.133- **Blast radius:** **enormous.** A single phishing Permit2 signature can let the134 spender drain allowances across **every token you have ever approved to the135 Permit2 contract** — and drainer payloads default to **full balance + a long136 expiry**. This is one of the highest-blast-radius signatures in the ecosystem.137- **Recognize:** `signTypedData_v4` with the **Permit2** domain (`name:138 "Permit2"`) and a `PermitSingle`/`PermitBatch`/`PermitTransferFrom` message139 containing `details` (token, `amount`, `expiration`), a `spender`, and a140 `sigDeadline`.141- **Safe:** a Permit2 sig **on Uniswap itself (or another protocol you142 deliberately chose)**, with a bounded `amount` and short `expiration`.143 **Dangerous:** a Permit2 sig on **any site that isn't the one you intended**,144 an `amount` near full balance, or a long/odd `expiration` → ⛔.145146### 5. `setApprovalForAll(operator, true)` — ERC-721 / ERC-1155147- **Does:** grants `operator` blanket control of your **entire NFT collection**148 from that contract.149- **Blast radius:** **every NFT** in that collection — all of them, transferable150 at will, until revoked.151- **Recognize:** tx with `data` `0xa22cb465`; wallet shows "Approve all" /152 "Set approval for all"; `approved = true`.153- **Safe:** to a major, verified marketplace you're actively listing on.154 **Dangerous:** requested by a **"mint" / "claim" / "airdrop"** flow (a mint155 never needs operator rights over your existing NFTs), or to an unknown156 operator → 🟠/🔴.157158### 6. `eth_sign` — raw-hash blind signature159- **Does:** signs an **arbitrary 32-byte hash** with no human-readable context.160 An attacker can craft that hash to authorize **any** transaction or message.161- **Blast radius:** **unbounded** — effectively a blank check.162- **Recognize:** `method: "eth_sign"`; wallets warn with red banners like163 *"Signing this message can be dangerous"* / *"this could let someone control164 your account."*165- **Verdict: NEVER sign `eth_sign`.** No legitimate modern dApp requires it. Its166 presence is itself a 🔴 red flag. (This differs from the safe, structured167 `personal_sign`/`signTypedData` — but see below.)168169### 7. `personal_sign` / `signTypedData` — disguised intents170- **Does:** normally benign (login / "Sign-In with Ethereum" / message171 acknowledgement). **But** attackers stuff a **disguised permit, order, or172 approval** into the payload.173- **Blast radius:** whatever the payload actually authorizes — for a hidden174 Permit/Permit2/order, that's your tokens.175- **Recognize:** read the **decoded message**. A real login is human-readable176 ("Sign in to … nonce …"). Treat as dangerous any typed-data with177 `Permit`/`PermitSingle`/order structs, a `spender`/`seller`, `value`/`amount`,178 or unreadable hex.179- **Safe:** a clearly human-readable login/nonce with no spend authorization.180 **Dangerous:** any spend/transfer/approval semantics hiding inside a "sign-in".181182### 8. EIP-7702 authorization / delegation (set EOA code)183- **Does:** authorizes your **EOA** (your normal wallet address) to **delegate184 its code to a contract** — the account now executes that contract's logic.185- **Blast radius:** **the entire account.** A malicious delegate can include a186 fallback that **auto-forwards any incoming balance in the same block**, so the187 wallet drains itself on every deposit. This is not a single token — it's the188 whole address.189- **Recognize:** an **authorization / "set code" / "delegate" / upgrade-account**190 request (EIP-7702 `authorizationList` with `chainId`, an `address` to delegate191 to, and a `nonce`); wallet language about "smart account" / "delegate" /192 "upgrade".193- **Critical rule:** an **unknown or unverified delegation target = treat the194 wallet as FULLY COMPROMISED**, not "just revoke it." Over **90% of observed195 7702 delegations are malicious.** Redelegating to a safe address may not undo196 what a hostile delegate already armed — **move assets to a fresh wallet** (see197 Step 6). Legitimate 7702 (e.g. a known wallet's batching/gas-sponsorship198 upgrade) delegates to a **verified, audited** implementation you chose.199200---201202## Step 4: Wallet Approval Audit203204When given an approval list (revoke.cash / Etherscan export), enumerate **every205active grant** and flag each of these:206207- **Unlimited allowances** — any ERC-20 allowance at `uint256` max → 🟠 (🔴 if208 the spender is unverified). Recommend reducing to needed amount or revoking.209- **Unknown / unverified spender** — spender contract is unverified on the block210 explorer, has no recognizable name, or you can't tie it to a dApp you use → 🔴.211- **Stale approvals** — grants to contracts you no longer use (old DEX, dead212 farm). Even "safe" ones are standing risk if that contract is later exploited →213 🟡, revoke.214- **`setApprovalForAll` grants** — list every NFT-collection operator approval;215 flag any to a marketplace you no longer use or don't recognize → 🟠/🔴.216- **Permit2 allowances** — surface Permit2 `amount`/`expiration` per token;217 flag full-balance amounts or long expiries → 🟡/🟠.218- **EIP-7702 delegations** — does the EOA have delegated code? If the target is219 unknown/unverified → 🔴 **compromised** (Step 6 fresh-wallet path), not a220 routine revoke.221222Also screen the wallet's **history and surroundings**:223224- **Address poisoning** — dust or **$0 transfers from a lookalike vanity225 address** (matching first/last characters of an address you really use),226 planted so you later **copy the wrong address** from history. Warn the user to227 never copy a destination from tx history; verify the full address.228- **Drainer-kit delayed draining** — off-the-shelf drainer kits (Inferno/229 Pink-style) frequently **wait days** after the malicious signature before230 pulling funds. *"Nothing happened yet"* is **not** safety — if a bad signature231 or approval exists, treat it as live and revoke/move now.232233---234235## Step 5: Red-Flags Quick Scan236237Any one of these flips the review toward ⛔ / 🚨:238239- **Unlimited approval to an unverified / random contract.**240- **ANY `eth_sign` request** — never legitimate; refuse outright.241- **A Permit2 signature on a site you didn't intend** (anything that isn't the242 protocol you deliberately chose) — full-balance blast radius.243- **`setApprovalForAll` requested by a "mint" / "claim"** — mints never need244 operator rights over your existing NFTs.245- **Urgency / countdown / FOMO** — "limited time", "claim before it's gone",246 weekend "limited mint".247- **Blind signing — no human-readable decode, no simulation/preview** of what248 changes. Missing preview is itself a warning.249- **Lookalike domain** — extra hyphen, swapped letters, non-Latin/punycode250 characters, `.app`/`.xyz` clone of a real `.org`.251- **Dust from a near-identical address** in history (address poisoning).252- **EIP-7702 delegation to an unknown contract** → assume compromise.253- **"Free airdrop / claim / giveaway / mint" sites** — the dominant drainer lure.254- **Delivery via Discord DM, hacked/large X account, or fake support**255 (fake "MetaMask"/"Coinbase"/"Ledger" help) — legitimate support never DMs you256 to sign.257258---259260## Step 6: Output Format261262Lead with a **verdict banner**, then the findings, then remediation.263264### Verdict banner (pick one)265266- ✅ **LIKELY SAFE TO SIGN** — recognized intent, scoped/finite, verified267 spender, human-readable, on the intended site.268- ⚠️ **CAUTION — VERIFY FIRST** — plausible but with unconfirmed elements269 (verify domain, reduce to finite, confirm the spender) before signing.270- ⛔ **DO NOT SIGN** — a dangerous pattern is present (unlimited to unverified,271 Permit2 on the wrong site, disguised permit, mint asking `setApprovalForAll`,272 any `eth_sign`).273- 🚨 **WALLET MAY BE COMPROMISED — ACT NOW** — an unknown 7702 delegation, or a274 live drainer approval/permit already signed with funds still at risk. Go275 straight to the fresh-wallet remediation.276277### Findings table278279| # | Item | Type | Blast radius | Severity |280|---|---|---|---|---|281| 1 | … (token/spender/site) | unlimited approve / Permit2 / 7702 / … | one token / whole NFT collection / all Permit2 tokens / entire EOA | 🔴/🟠/🟡/🟢/ℹ️ |282283For **each finding**, state **"what this grants"** in one plain sentence, then a284**recommendation** (sign / don't sign / reduce to N / revoke / move funds).285286### Remediation playbook287288- **Revoke** standing approvals via **revoke.cash** or the **Etherscan Token289 Approval Checker** — **per chain** (each revoke costs gas; do the highest-290 blast-radius ones first: unlimited, `setApprovalForAll`, Permit2).291- **Approve only what's needed** going forward — set finite caps, not unlimited.292- **If a malicious EIP-7702 delegation or a live drainer approval/permit is293 found and funds remain → move assets to a FRESH wallet immediately.** A294 compromised key or hostile delegation can't always be safely "cleaned";295 transfer assets out (to a brand-new seed you generate offline) **before**296 attempting any revoke, and assume the old address is burned.297- **Use a hardware wallet** and enable **clear signing (ERC-7730)** so you read298 exactly what you sign instead of a blind hash.299- **Burner / vault split** — a **vault** wallet that never touches experimental300 sites and holds the bulk of funds, and a **burner/spending** wallet with301 limited funds for minting and new dApps.302- **Simulate** transactions (Tenderly / wallet preview) before signing; **no303 preview = warning.**304- **Verify domains** by typing them yourself or using a bookmark — never via a305 DM/ad/search link. Type seed phrases **nowhere online**; keep them offline.306- **2FA via an authenticator app**, not SMS, on every exchange/email tied to307 your crypto.308309### Disclaimer (always include)310311> **Educational security guidance — not financial, legal, or investment advice,312> and not a guarantee of safety.** On-chain risk is real and transactions are313> **irreversible**; this review reasons only over the information you provided314> and cannot see live chain state. A "looks safe" here is not a warranty —315> verify the spender, the domain, and the decoded payload yourself. **If you316> believe your wallet is compromised, act immediately** (move funds to a fresh317> wallet) and consult a qualified security professional.318319---320321## Related Viprasol Skills322323- **`smart-contract-audit`** — audit the Solidity/EVM contract *behind* a324 spender or 7702 delegation target for vulnerabilities and backdoors.325- **`defi-protocol-review`** — assess whether the protocol asking for an326 approval is itself trustworthy (admin keys, audits, oracle/TVL risk).327328*Not affiliated with or endorsed by Anthropic.*