Why a wallet can be drained “without a signature”
Goal of this guide: explain how permissions work
(approval is the act of granting rights, allowance is the recorded spending limit),
break down the main
EVM is a group of compatible blockchain networks that use the same smart-contract execution rules,
where token and NFT management is built around a permission system.
In these networks approve, allowance and
The main vulnerability here is the expectation that every spend will require a separate signature. In a wallet interface the signature looks like an ordinary step (“allow”, “connect”, “confirm for swap”), so the user confirms not a transfer, but a grant of rights that is stored in the contract and used later without another confirmation window.
An unnecessary allowance
(a limit recorded in the contract that defines how many tokens may be spent)
for a stablecoin or an active
If you assess DeFi risk more broadly than approvals, add separate attack surfaces to your checklist: dApp frontends, bridges, MEV, keys and operational mistakes. DeFi security guide: threat map and checklist .
Approval phishing uses permission grants through approve/permit
(creating or changing an allowance)
or

One approve/permit signature or
What approval phishing is and why its “honesty” is dishonest
Key terms in this section:
-
Spender is the smart-contract address allowed to spend the owner’s ERC-20 tokens
within an allowance through
transferFrom . -
Operator is an address that has received the right to transfer the owner’s NFTs through
setApprovalForAll , without a limit on the number of collection tokens. - Allowance is a value in an ERC-20 contract that defines the maximum number of tokens the spender may spend.
- Revoke is a transaction that resets an allowance or disables an operator, ending the right to spend or transfer assets.
Approval phishing uses normal permission mechanisms: the grant of rights looks legitimate, does not cause an immediate loss of funds and therefore is often not perceived as a risk at the moment of signing.
Approval phishing is an attack in which a user is persuaded to grant a permission (approval/allowance) to manage tokens or NFTs, and that right is then used to withdraw assets. The dangerous action is disguised as a familiar interface step: “confirm for swap”, “allow for mint”, “sign for claim”, “grant access for deposit”.
Unlike key theft, the attacker does not need the private key and does not need a direct transfer of funds. It is enough for the user to once grant a specific address the right to spend assets: a spender for ERC-20 tokens or an operator for NFTs. After that, the withdrawal is performed without new wallet windows and without repeated confirmations by the owner.
At the blockchain level, the transactions look valid: the user really changed the contract state and granted rights to a specific address. That is why the wallet is not formally “hacked”: assets leave through previously granted permissions, not through a bypass of the signature.
Approve usually does not transfer funds immediately. It records an allowance limit in the token contract, after which the spender can call
While the balance has not changed, the signature is often perceived as safe. With unlimited approval or setApprovalForAll, an attacker can withdraw current assets and any future deposits until the allowance is reset or the operator status is disabled.
In simple terms: approve is not a transfer, but a grant of spending rights to a specific address. Approval phishing means the user is tricked into granting that right to an attacker-controlled address while it is presented as a normal swap, mint or claim step.
Approval phishing works through valid permissions. The danger appears after the signature, when an active spending right is used without the owner’s participation.
Permissions in EVM are records of rights in contracts, not one-time actions; that is why approve can remain active for months and be used without a repeated signature.
How permissions work in EVM: allowance, spender and “infinite approve”
An EVM permission is a state record in a token or NFT contract that connects your address with a specific spender/operator address. This record defines who can spend tokens through
- ERC-20: approve → allowance → transferFrom
- The user calls approve(spender, amount) and specifies the spender address.
- The token contract stores the allowance limit — the maximum number of tokens the spender can spend.
- The spender calls transferFrom and spends tokens without new signatures until the allowance becomes 0 or is exhausted.
- The contract checks allowance during
transferFrom ; it does not request the owner’s signature for every spend.
- Allowance is tied to owner → spender → token
- The permission exists only for a specific token and a specific spender.
- An approve for USDT does not grant access to USDC and does not extend to other contracts.
- Every new token or new spender requires a separate approve.
- Unlimited approval is the maximum allowance value
- With unlimited approve, the allowance stores the maximum numeric value.
- The spender receives the right to spend tokens from that contract within this value, including future deposits to the address.
- The permission remains active until a revoke transaction, even if the service is no longer used.
- NFT: setApprovalForAll is operator status without a limit
- setApprovalForAll(operator, true) enables operator status for the owner’s entire NFT collection.
- This is not a limit by quantity or value: the right remains until setApprovalForAll(operator, false) is sent.
- If the operator is compromised, NFTs can be withdrawn without new owner confirmations.
Unlimited approve for ERC-20 increases the maximum amount that can be spent through
EVM permissions are long-lived rights records in contracts. One approve can work for months, unlimited increases the available spending limit, and
A permit signature (for example EIP-2612) gives an application the right to set allowance through a signed message; the application then uses that signature in a transaction that grants rights and performs the action in one call.
Permit, Permit2 and message signatures: how permissions are granted without a separate approve and why attackers use this
In addition to ordinary approve, EVM has ways to grant permission without a separate transaction. The user simply signs a message, and the application uses that signature in its own transaction, which both grants the spending right and performs the action — swap, deposit or claim. These mechanics are called permit and extensions such as Permit2.
From a UX point of view, this looks like fewer steps: there is no separate approve transaction and no gas is required for a separate approve call. The technical consequence is the same: a spending right appears in the contract, and that right may remain active beyond a single operation if the signature parameters set a broad limit or a long expiration.
The two confirmation types users most often confuse:
- Transaction (on-chain): approve / revoke / transfer — sent to the network, requires gas and changes contract state.
- Message signature (off-chain): permit and similar mechanics — no gas is needed at signing time, but they let an application install the same access rights.
| ⚙️ Mechanism | 🧾 What you grant | 📍 Where it appears | ⚠️ Key risk |
|---|---|---|---|
| Approve (ERC-20) | Token spending limit for a spender | DEX, lending, farming, bridges | Unlimited allowance remains active until revoke |
| Permit (EIP-2612 and analogues) | Permission through a signature without a separate approve | “One-click” swaps, aggregators, DeFi interfaces | The signature looks “safe” but sets real rights |
| SetApprovalForAll (NFT) | Global access to the entire collection | Marketplaces, mints, gaming dApps | NFTs can be transferred without repeated confirmations |
Key nuance: approve and permit lead to the same result — a specific address receives the right to manage the owner’s assets. The confirmation form differs: an on-chain transaction or a message signature that is later used inside a transaction.
Pre-sign checklist (30 seconds): a quick filter to see whether a signature grants spending rights.
- What is being confirmed? Permit or approve means an access grant.
- Who receives access? Look at the spender or operator in the parameters, not at the site design.
- What is the limit? Unlimited on liquid tokens increases the available spending amount.
- Is there setApprovalForAll? For NFTs this is full operator status over the collection.
- Is there urgency? Time pressure is often used to make people sign without checking parameters.
Permit and “gasless signatures” change only the form of confirmation. A message signature can install access rights to tokens or NFTs just like approve, so signature parameters must be read as permission grants.
In typical approval phishing schemes, the user is led to sign approve/permit or
Typical approval phishing schemes: how you are led to the “right” signature
These schemes use familiar interfaces and standard workflows, which makes the grant of permissions look like an ordinary service step.
Almost all attacks follow the same logic: first the user is brought to a page that looks like a dApp interface, then the page requests a signature that grants a spending right or operator right, and after that the active permission is used to withdraw assets without new confirmations.
The key feature is the absence of a direct request to send a transfer. Instead of a transfer, the site requests approve/permit or
- Clone of a popular service
- A fake domain or advertising link leads to a visually similar copy of a DEX or marketplace.
- The interface requests approve “for swap” or
setApprovalForAll “for NFT listing”. - The signature parameters contain a spender/operator that does not belong to the real service.
- Compromise of official channels
- A link is posted in Discord, Telegram or X on behalf of the project or a moderator.
- Urgency triggers are used: “contract bug”, “mint migration”, “last chance”.
- The link leads to a page that requests approve/permit for the attacker’s address.
- Social engineering through “support”
- The attacker sends a private message pretending to be service support.
- A signature is requested under the pretext of “canceling a stuck transaction”.
- In practice, the user signs a permit or grants approve to a third-party address.
- Substitution of the signature meaning
- The wallet window displays a technical call without clear explanation from the interface.
- The user confirms without checking the spender/operator address and the limit.
- The risk is highest when the interface does not show the spender, limit or permission type.
Example: a user connects a wallet to an “airdrop” page, clicks Claim and signs an unlimited approve for a stablecoin. The balance does not change, but later, when funds arrive, the spender withdraws tokens through
These attacks do not require an immediate withdrawal. The attacker can wait for the balance to grow or for liquidity to arrive and then use the active permission.
Typical approval phishing schemes disguise a grant of rights as familiar actions. While allowance or operator status is active, the attacker can use it at any moment without new owner confirmations.
Allowance and
Common user mistakes: why approvals accumulate and become a threat
The danger of approvals is rarely felt at the moment of signing because approve usually does not change the balance. The risk appears later, when an active permission is used for spending, and becomes stronger if such permissions remain across several networks and several tokens.
The most common mistake: unlimited approvals for stablecoins and liquid tokens. At the moment of signing this looks like fewer steps, but technically it means a large allowance that lets the spender spend tokens through
The same logic applies to
A separate class of mistakes comes from trusting the brand and visual design. The user focuses on the domain, logo or layout, but permission is always granted to a specific address — spender or operator. If the interface is substituted, the design does not change the address in the signature parameters.
Another common mistake is considering the issue closed after revoke in one network. Approvals are isolated by network: allowance in Ethereum and allowance in Arbitrum are different records in different contracts, so a permission may remain active on another network.
If you move liquidity between networks, check approvals after cross-chain operations: bridges and routers often require approve for a separate spender in each network. Crypto bridges: how they work and which are safer.
Gasless signatures create additional confusion. Permit and similar mechanics are perceived as “soft” confirmations, but the result is the same: the application receives the ability to install a permission that is then used for spending.
Mistakes become more dangerous when one wallet is used at the same time for storage, active trading and experiments. In that mode, one unnecessary spender/operator creates access to assets that were not part of the original operation.
The main threat of approvals is active permissions that remain in contracts after a task is complete. Unlimited allowance, an enabled NFT operator and permissions across several networks increase the amount of assets available for spending without new confirmations.
Permissions must be checked separately for each network: allowance and operator lists in Ethereum do not match Arbitrum, Optimism, Polygon or BSC, because rights records are stored in contracts on the specific network.
Where to check permissions: what exactly to inspect and in what order
Permission review is a sequence of steps by network and asset type. ERC-20 tokens and NFTs use different access mechanics, so they must be analyzed separately and closed in priority order: unknown addresses and broad limits first, then the remaining working permissions.
- Identify the network with the most activity
- Permissions are not “global”: Ethereum, Arbitrum, Optimism, Polygon and BSC have separate approval lists.
- Start with the network where liquidity is concentrated and where the latest transactions happened.
- Check ERC-20 approvals and reduce what is unnecessary
- Priority goes to unknown spenders and unlimited allowance on stablecoins and liquid tokens.
- Remove unused permissions and reduce limits to the amount needed for the current operation.
- Check NFT approvals separately
- Pay special attention to
setApprovalForAll for marketplaces and gaming dApps. - Keep an operator active only for the period when it is truly needed.
- Pay special attention to
- Verify addresses you leave active
- Match spender/operator addresses with trusted services by the address in the signature or explorer.
- If an address is not recognizable, reset the allowance or disable the operator and grant a new permission only when necessary.
| Approach | What it checks | Strong side | Limitation |
|---|---|---|---|
| Network blockchain scanner | ERC-20 allowance and often NFT approvals | Network data, without trusting a dApp interface | You need to switch networks and analyze addresses |
| Revoke services | Token and NFT permissions in the selected network | List + button to reset allowance/disable operator | Coverage depends on the network and integrations |
| Wallets with simulation | Spender, limits, warnings before signing | Shows which address will receive rights before confirmation | Different depth of approval display |
What to look for in a permission list
- Unknown spender or operator. If the address is not recognizable, it is a revoke candidate.
- Unlimited allowance on liquid assets. A large allowance increases the available spending amount.
- Permissions in L2s and sidechains. Approvals may remain active in networks where you have not transacted for a long time.
- NFT operators without a current need. An active operator can transfer NFTs without new confirmations.
- Proxy contracts and upgrades. Approve is tied to the spender address, so an old permission remains active even if the logic changes through an upgrade.
Review logic: first reset allowances for unknown addresses and remove unlimited permissions on sensitive tokens, then reduce the remaining limits to the amount needed for current operations.
Permission review should match how permissions are stored: separate networks, separate tokens, separate spenders/operators. Prioritizing unknown and unlimited permissions closes the main scenarios for spending without new confirmations.
Revoke is a transaction that sets allowance to 0 for the owner→spender→token pair or switches
How to revoke permissions correctly: tokens, NFTs and common mistakes
Revoke is an on-chain transaction that changes allowance or disables an NFT operator. As a result, the contract records a new state: a specific address no longer has the right to manage your assets. Revoke stops future spending, but does not reverse transactions that have already been executed.
Step-by-step revoke algorithm for ERC-20
- Identify the network. Approvals are isolated by network: Ethereum, Arbitrum, Optimism and other L2s have separate permission lists.
- Find the token and spender. Check the token contract address, token name and current allowance limit, especially for stablecoins and liquid assets.
- Perform revoke. The standard option is setting allowance to 0 through approve(spender, 0) or using a revoke button in a service.
- Check the result. Make sure the allowance became 0 and the permission is no longer displayed as active.
Step-by-step revoke algorithm for NFTs
- Open the collection operator list. Look for active
setApprovalForAll entries and related operator addresses. - Disable the operator. The status must be switched to false.
- Repeat for key collections. Check collections with the highest value and liquidity first.
Common mistake: revoke is done in one network while allowance or operator status remains active in another. If you used bridges, aggregators and multi-network dApps, check approvals in every network separately.
ERC-20 nuance: some tokens require the sequence approve(spender, 0) before setting a new allowance. In those cases, revoke starts by resetting the limit.
Revoke changes the rights record in the contract: allowance becomes 0 or the operator is disabled. For revoke to really close access, it must be performed in the correct network and for the correct token→spender or collection→operator pair.
If you granted approve/permit or
If you already granted a dangerous approve: a quick damage-reduction plan
In this situation, the order of actions matters: first move assets away from active permissions, then reset allowance and disable operator, and only after that investigate the source of the signature.
If
- Move assets to a “clean” address. A new wallet with a new seed phrase breaks the connection with current approvals because allowance and operator are tied to the old owner address.
- Revoke permissions on the compromised address. Reset allowance for stablecoins and liquid tokens first, then for the remaining tokens.
- Check NFT permissions. Disable
setApprovalForAll for operators that are not needed. - Disconnect dApp sessions in the wallet. This does not change allowance, but removes active site sessions that may request another signature.
- Isolate the environment. If there is a risk of a malicious extension or site substitution, use another browser or device.
Do not agree to “test transfers”, “security checks” or “fund recovery” suggested by strangers. Such requests are often used to obtain a new signature or direct transfer.
After a dangerous permission has been granted, the priority is to reduce the amount of assets reachable through allowance/operator and then reset those rights with revoke transactions. While the rights remain active, spending can happen without new confirmations.
Preventing approval phishing comes down to controlling two parameters: who receives the right (spender/operator) and how large or broad that right is (allowance or
Prevention: how to grant permissions without becoming an easy target
Approval phishing prevention is built around permission management: separating wallet roles, limiting allowance and disabling operator after the task is complete.
Most losses are tied to active permissions that remain in contracts after an operation is finished: unlimited allowance, an enabled NFT operator and the habit of confirming signatures without checking the address. These rights records allow spending without new confirmations until revoke.
Separating wallet roles
Using one address for storage, trading and experiments makes any approve critical for the entire balance on that address. Separating addresses limits the amount of assets exposed through allowance or operator. If you choose a “storage” wallet for the long term, start with a hardware crypto wallet review and set up cold storage before active DeFi work.
🧩 Basic three-address setup
- Storage (long term): main capital, minimum dApp interactions, no active approvals.
- Operational address: regular DeFi activity, limited balance, scheduled allowance and operator review.
- Experimental address: airdrops, NFTs, new projects; risk is limited to the amount stored on it.
Reducing the scope of every permission
Even when working with trusted services, consider the scenario of a spender/operator error or compromise. For ERC-20, the scope of the right is defined by allowance; for NFTs, the scope is defined by
- Use exact limits. Allowance defines the maximum number of tokens a spender can spend.
- Reset allowance after the task is complete. This ends the spending right through
transferFrom . - Check the spender address. Permission is granted to the address in the signature parameters, not to a “site”.
- Disable setApprovalForAll after the task. Operator should not remain active after listing or a gaming session.
- Do not confirm because of urgency. Urgency is often used so that the signature is not inspected.
Review mode: when to check approvals
- After a one-off operation. If the service is not used regularly, reset allowance or disable operator after the operation is complete.
- For an operational DeFi address. With constant activity, review approvals once every one to two weeks and remove unnecessary permissions.
- For an experimental address. For new dApps and airdrops, check and close permissions after every session.
Working model: approve/permit grants a right to a specific address, allowance defines the limit, revoke changes the limit to 0 or disables the operator.
Approval prevention is active permission management: address separation, exact allowance limits and disabling operator after the task reduce the amount of assets available for spending without new confirmations.
Approve lets protocols call
Approve as a mechanism: strengths and built-in risks
Approve is a foundation of DeFi infrastructure: it lets protocols perform operations through
The approve mechanism is a trade-off between keeping assets on your own address and automating protocol actions. Assets remain on your address, but the contract receives the right to spend them within the allowance set in approve.
✅ Strengths of approve
- Assets remain on the owner’s address until they are spent through
transferFrom . - Protocols can perform operations without a signature for every step by using allowance.
- Allowance makes it possible to limit the maximum spending amount for a specific spender.
- Permissions are verifiable on-chain and can be reset with a revoke transaction.
❌ Built-in risks of approvals
- A permission remains active until revoke and does not depend on closing a site or disconnecting a wallet.
- Unlimited allowance increases the amount of tokens available for spending if the spender is compromised.
- If approve is signed without checking the spender and limit, the right may be granted to the wrong address.
SetApprovalForAll for NFTs gives an operator the right to transfer the whole collection with one action.
Approve is an infrastructure mechanism for managing rights. It is convenient because transfer is executed through allowance without repeated signatures, and risky because an active permission works until revoke and can be used for spending later.
Cases and lessons: why a “correct contract” can still become a problem
Even when working with legitimate services, active approvals create risk: a vulnerability, upgrade or frontend substitution becomes dangerous if allowance is already recorded or operator is enabled in the contract.
The key property of approvals is the absence of a “lifetime”. If a permission has been granted, the contract does not need to request approve again: it uses the rights already recorded. Therefore the risk depends not only on the current service, but also on the list of approvals accumulated on the address.
🔓 Case 1: vulnerability in a legitimate protocol + unlimited approvals
A user grants unlimited approve to a protocol, and later a bug is found in the spending logic that lets the contract spend more tokens than expected.
- The contract already has the spending right through allowance, so the attack does not require a new owner signature.
- Unlimited allowance increases the spending amount up to the token balance on the owner’s address.
- Users who do not make new transactions remain vulnerable until the allowance is reset.
Unlimited approve turns a protocol bug into a risk for the entire token balance on the address. Exact allowance limits maximum spending, and revoke ends the spending right.
🧩 Case 2: a proxy-contract upgrade changes access behavior
Upgradeable contracts keep the same address, but the code at that address can change after an upgrade or governance compromise.
- Approve is tied to the spender address, not to a specific code version.
- After an upgrade, new code may use allowance differently than the owner expected.
- Old allowance remains active until it is reset by a transaction.
When protocols upgrade, old approvals should be reviewed because allowance remains active on the same spender address.
🧠 Case 3: frontend substitution while the brand stays familiar
The user visits a familiar site, but the interface is substituted through DNS, ads, CDN or malicious extensions.
- The visual appearance of the interface matches what the user expects.
- Approve or permit is granted to an address that is not the service contract.
- Checking spender/operator in the signature reveals the substitution; brand and design do not.
Rely on the spender/operator address and allowance limit in the signature, not on the domain and page design.
🛰️ Case 4: aggregators and routers as a broad access gateway
Aggregators and routers use one spender for many routes and protocols.
- One spender address serves many scenarios and many tokens.
- If the spender is compromised, the risk spreads to everyone who granted it allowance.
- Unlimited allowance increases the amount that can be spent through this address.
For routers, the allowance limit defines the maximum spending amount, and regular revoke removes old permissions that are no longer needed.
🖼️ Case 5: setApprovalForAll for NFTs remains active for years
- This is operator status, not a limit by number of NFTs.
- Even without activity, the operator remains enabled in the collection contract.
- Compromise of the operator makes it possible to transfer NFTs without a new owner signature.
Disabling
An incident becomes possible when an allowance is already recorded or an operator is enabled in the contract. At that moment, spending can be executed without a new owner signature.
In practice, incidents happen because permissions remain after completed operations. Regular review and disabling unnecessary allowances and operators limit the amount of assets available for spending without a new signature.
The FAQ helps clarify which signatures grant rights, how revoke works and why spending can happen without repeated confirmation.
FAQ about approval phishing, approve and revoke
Why do people say “drained without a signature” if I did sign something?
The signature was for granting rights, not for transferring funds. After approve, permit or
Is unlimited approve always a mistake?
Unlimited approve records a very large value in allowance. This increases the maximum number of tokens the spender can spend through
Can revoke return stolen funds?
No. Revoke changes contract state only for the future: allowance becomes 0 or the operator is disabled. Transactions that have already been executed are not reversed.
Does deleting the wallet or “disconnecting the site” remove approvals?
No. Permissions are stored on-chain inside token and NFT contracts. Disconnecting a site or deleting an app does not change allowance or operator status in the contract.
Where exactly is approve stored?
In smart-contract state. For ERC-20 this is the allowance(owner, spender) record; for NFTs it is approvals and operators in the collection contract.
Can approve be limited to a specific amount?
Yes. The approve call passes the amount parameter, and this value defines allowance. The spender cannot spend more than the current allowance permits.
Which is more dangerous: approve for a token or setApprovalForAll for an NFT?
Usually
Do approvals need to be checked in L2s and sidechains?
Yes. Each network stores its own rights records in its own contracts. Allowance in Ethereum and allowance in Arbitrum are different values, so checking only one network does not show permissions in other networks.
Does a hardware wallet protect against approval phishing?
A hardware wallet protects the private key and signing process from theft on the device, but it does not change the meaning of the action being signed. A dangerous approve/permit or
The FAQ comes down to one verifiable difference: a signature may grant rights (approve/permit/
One mistaken approve/permit or
How to protect yourself from approval phishing and keep permissions under control
Permissions are the basis of DeFi mechanics, but allowance and operator status are exactly what allow assets to be withdrawn without a repeated signature if the right was granted to an unnecessary address.
Approval phishing is abuse of legitimate rights. One approve/permit or
To avoid leaving active rights on an address, keep control through concrete actions:
- Check the access address. The important part is spender/operator in the signature and in the approvals list, not the brand or design.
- Limit allowance. Set a task-specific limit instead of unlimited and reset allowance when the right is no longer needed.
- Disable operator for NFTs. Do not leave
setApprovalForAll enabled after the action is complete. - Check all networks. Allowance and operator are stored separately in each network, so review every network where a dApp was used.
- Separate addresses by role. The balance on an address defines the maximum amount that can be spent through active rights on that address.
Treat approvals as active access rights recorded in contracts. Minimal allowance limits, disabled operators and review across all networks reduce the amount of assets available for spending without a new signature.