ERC-20 Token Approval Checker: Find and Revoke Risky Allowances
A token approval checker reads the allowance stored by an ERC-20 token contract for one wallet owner and one spender, then helps the owner decide whether to keep, reduce, replace, or revoke that permission. The decisive facts are the exact network, token contract, owner address, spender address, current allowance, token decimals, spender behavior, and any separate permit or operator system involved. Disconnecting a wallet from a website does not change this on-chain allowance, and an old permission can remain capable of spending tokens deposited long after the original swap, bridge, mint, or claim.
TL;DR
- An ERC-20 allowance belongs to one owner, one token contract, and one spender on one network. Change any one of those fields and you are checking a different permission.
- Connecting a wallet only exposes selected account and network information to the application. It does not automatically grant token-spending authority.
- An approval transaction changes state inside the token contract. A spender can later call transferFrom within the recorded allowance if the token implementation permits it.
- Disconnecting from a dapp removes the local website session. It does not set the token allowance to zero or cancel an unused signed permit.
- Checking allowance with a read-only call does not require gas. Revoking or changing allowance is an on-chain transaction and normally requires the native gas token for that network.
- Zero means the spender has no standard ERC-20 allowance for that token-owner pair. A zero result does not cover NFT operators, Permit2 sub-permissions, smart-wallet modules, or unconsumed signatures.
- An exact allowance limits the amount available through transferFrom, but it remains risky when the spender should have no access or when the wallet later receives more of the token within that limit.
- An unlimited allowance is commonly represented by the maximum uint256 value. It can expose the wallet's current and future token balance while the spender remains authorized.
- Revocation usually calls approve with an amount of zero. Some nonstandard tokens require a zero-first sequence before setting a new nonzero amount.
- Review approvals after swaps, bridges, claims, mints, unfamiliar signatures, contract incidents, and wallet migrations. Scan risky spenders and decode the original approval or transferFrom transaction.
A wallet can show no outgoing ERC-20 transfer in the approval transaction while the spender gains continuing transferFrom authority. The security consequence is stored in the token contract's allowance mapping and may become visible only when the spender uses it later.
For deeper background on permission models and common attack paths, review Wallet Approvals Explained and Crypto Approval Risks. This guide stays focused on the operational task: identify the exact spender, read the live ERC-20 allowance, and remediate it correctly.
What token approval and allowance mean
ERC-20 tokens maintain balances and spending permissions inside each token contract. The token holder is usually described as the owner. A second address, described as the spender, can receive permission to move a specified amount from the owner's balance through transferFrom.
The allowance is not stored in the wallet application, browser, exchange account, or dapp session. It is stored by the token contract for a specific owner-spender pair. A standard read asks the token contract for allowance(owner, spender), and the returned integer represents the remaining approved amount under that token's decimals and implementation.
The owner
The owner is the address whose ERC-20 balance can be spent through the allowance. It can be an externally owned wallet, multisig, smart account, vault, treasury, router, or another contract. The permission belongs to the owner address, not to the human identity or wallet brand used to access it.
The token contract
Each ERC-20 token contract maintains its own balance and allowance state. Approving a spender for one USDC contract does not approve every token named USDC, and approving a token on Ethereum does not create the same approval on Base, Arbitrum, BNB Chain, Polygon, or another network.
Always use the complete token contract address. Names, tickers, logos, and wallet labels can be copied or can refer to bridged and native versions with different contracts.
The spender
The spender is the address that can use transferFrom according to the allowance. It might be a decentralized exchange router, bridge, staking vault, lending protocol, payment contract, marketplace, Permit2 contract, smart-wallet module, malicious drainer, or ordinary address.
The dapp website domain is not the spender address. The interface may route approvals through another contract, and that contract may be upgradeable or controlled by administrators who can change its future behavior.
The allowance amount
The allowance is a raw integer. To display it correctly, a checker reads the token's decimals and scales the integer. For a six-decimal token, a raw allowance of 1000000 represents one token. For an eighteen-decimal token, the same raw integer represents a tiny fraction.
approve and transferFrom perform different actions
approve(spender, amount) sets the spender's allowance according to the token implementation. transferFrom(owner, recipient, amount) attempts to move tokens using authority granted to the caller. A spender can direct the transfer to itself or another recipient.
Remaining allowance can decrease after spending
Standard transferFrom behavior checks that the spender has sufficient allowance and reduces it by the amount spent, except where an implementation intentionally treats a sentinel such as the maximum uint256 value as non-decreasing. Token behavior can vary, so verify the live allowance after material use.
Approval is token-specific permission
An ERC-20 allowance does not directly authorize native ETH movement, NFT transfers, arbitrary smart-contract execution, or control of the wallet itself. Those risks can arise through separate signatures, NFT operator approvals, smart-wallet modules, compromised keys, or contract interactions.
function allowance(address owner, address spender)
external view returns (uint256);
function approve(address spender, uint256 amount)
external returns (bool);
function transferFrom(address owner, address recipient, uint256 amount)
external returns (bool);
Wallet connection versus approval versus permit signature
Wallet prompts can look similar while producing very different authority. Separate connection, transaction, and message-signature requests before approving anything.
Wallet connection
Connecting a wallet normally lets a website request the selected address, active network, and permission to send future signing requests. The connection itself does not write an ERC-20 allowance to the blockchain and does not give the website a private key.
A connected application can still ask the wallet to sign dangerous transactions or messages. Connection is not harmless in every practical sense, but it is not the same state transition as approve.
Approval transaction
An approval is a blockchain transaction sent to the token contract. The calldata identifies the spender and amount. Once confirmed, the token contract records the allowance. This transaction requires gas because it changes on-chain state.
The wallet should show the token contract as the transaction target and expose the spender and amount through simulation or decoded details. Verify both addresses rather than trusting a button labeled enable trading.
Permit signature
ERC-2612 permit lets a token owner sign typed data that authorizes an allowance. The owner does not have to submit the approval transaction personally. A relayer or spender can later send the signature to the token contract and pay the gas.
A permit includes fields such as owner, spender, value, nonce, deadline, and domain information tied to the token contract and chain. The signature can be dangerous even though signing it does not immediately cost gas or appear as an on-chain transaction.
Personal signatures and typed data
EIP-712 typed data can display structured fields, but readable formatting does not guarantee safe intent. Verify the domain, chain ID, verifying contract, spender, amount, expiration, nonce, and primary type. A message can authorize a transfer, order, permit, session, or protocol action without using the standard ERC-20 approve function.
Transaction signatures change state when included
A normal approval transaction is broadcast and included before the allowance changes. A permit signature can remain off-chain until someone submits it. This difference affects incident response because an unused signature may remain executable while its deadline and nonce remain valid.
| Action | Immediate on-chain change | Gas paid by owner | Main security question |
|---|---|---|---|
| Connect wallet | Normally none. | No. | Which address and network can the site see, and what requests can it present next? |
| ERC-20 approve transaction | Token contract records an allowance. | Normally yes. | Which spender receives how much continuing authority? |
| ERC-2612 permit signature | None until submitted on-chain. | Not necessarily. | Who can submit the signature, for what amount, before which deadline, on which domain? |
| transferFrom transaction | Tokens move if authority and balance permit. | Usually paid by the spender or transaction sender. | Which allowance or signature authorized the movement, and where did the tokens go? |
Why disconnecting from a dapp does not revoke permission
Disconnecting usually removes the site's local authorization to see the account or request actions through that wallet session. It may delete a connection record in the wallet and browser. It does not send a transaction to every token contract the wallet previously approved.
On-chain allowance survives the website session
The token contract does not know whether the user closed a browser tab, cleared cookies, removed a WalletConnect session, uninstalled an extension, or disconnected the domain. Its allowance mapping remains unchanged until a valid state-changing transaction modifies it.
Removing the dapp from wallet settings is still useful
Disconnecting reduces nuisance prompts and limits future requests through that session. It is good wallet hygiene, but it solves a different problem from on-chain permission cleanup.
Revocation must reach the token contract
Standard ERC-20 revocation sets the spender's allowance to zero through the token contract. The transaction must be signed by the owner and confirmed on the correct network.
Permit signatures create a separate problem
An unused permit signature can remain valid until its deadline if its nonce remains current. Setting the current allowance to zero does not necessarily consume that unused permit nonce. If a permit may have leaked, investigate the token's nonce and cancellation options, the exact signed message, and whether moving funds to a clean wallet is necessary.
Compromised keys cannot be repaired by revocation alone
If an attacker has the wallet's private key or recovery phrase, the attacker can sign new approvals and transfers. Move assets to a wallet controlled by uncompromised keys and do not rely only on permission cleanup.
How to find the token contract and exact spender address
The most common approval-checking mistake is choosing the right token symbol but the wrong contract, spender, network, or owner. Build the complete four-part identity before trusting the result.
Confirm the owner address
Copy the complete wallet or smart-account address whose permission you want to inspect. If the wallet interface supports multiple accounts, verify the active address. A hardware wallet account, browser account, multisig, and smart account can each hold separate allowances.
Confirm the network
Ethereum and other EVM chains can use the same hexadecimal owner and spender addresses while maintaining separate token contracts, code, balances, and allowance state. Select the chain where the original interaction occurred.
Confirm the token contract
Open the original transaction or a trusted token listing and copy the complete token address. Compare name, symbol, decimals, verification, holder activity, and transfer history. Do not infer the address from the logo alone.
Extract the spender from the approval transaction
Decode the original approve transaction and read the first function argument. The outer transaction target is usually the token contract, while the spender appears inside calldata. Confusing those two addresses leads to checking the token contract as its own spender.
Extract the spender from an Approval event
Standard tokens emit an Approval event containing owner, spender, and value. Event data can corroborate the calldata and state change. Nonstandard tokens may behave differently, so the live allowance remains the decisive current-state check.
Identify the contract behind a dapp label
A decentralized exchange may use several routers across versions and networks. A bridge may use token-specific gateways. An aggregator may approve Permit2 rather than the final pool. Match the exact contract used in the transaction instead of checking a brand's best-known address.
Determine whether the spender is upgradeable
A proxy spender can retain the same address while its implementation changes. Review its implementation, administrator, upgrade history, and current verification. A safe contract at approval time can become riskier after an upgrade.
Check whether code exists at the spender address
A spender can be an externally owned address, a deployed contract, or an address where code may be deployed later. ERC-20 approval logic generally treats the spender as an address and does not require deployed code.
CREATE2 can make a future contract address predictable before deployment. When a wallet has approved an address that currently has no code, do not assume the permission is permanently harmless. The CREATE2 Security Guide explains deterministic deployment, counterfactual addresses, and the evidence needed to evaluate that risk.
Exact allowance identity checklist
- Owner address whose balance is exposed.
- Network where the approval exists.
- Exact ERC-20 token contract.
- Exact spender address from calldata, events, protocol documentation, or live state.
- Current allowance returned by the token contract.
- Token decimals used to display the amount.
- Spender code, proxy implementation, administrator, labels, and transaction history.
- Separate Permit2, permit-signature, NFT, and smart-account permissions where applicable.
Check the exact token-spender allowance
Select the correct network, enter the wallet owner, token contract, and spender, then read the current allowance before deciding whether to keep, reduce, or revoke it.
Step by step: connect the correct wallet and network, then check one token-spender pair
The process below keeps the query narrow. It checks one ERC-20 allowance relationship rather than assuming that a generic connected-app list represents every on-chain permission.
Select the network
Choose the chain where the token, spender, and original approval transaction exist.
Choose the owner
Connect or enter the exact wallet or smart-account address whose allowance you are checking.
Enter the token contract
Use the complete ERC-20 contract address, then verify symbol and decimals.
Enter the spender
Copy it from the approval calldata, event, protocol documentation, or decoded transaction.
Read the allowance
Use a read-only call to retrieve the current raw value and convert it with token decimals.
Assess the spender
Review code, proxy status, administrator, labels, history, purpose, and whether access is still needed.
Choose remediation
Keep a justified exact amount, reduce it, or set the allowance to zero.
Verify confirmation
After the transaction confirms, read the allowance again and save the transaction hash.
Read-only checking does not require a transaction
allowance is a view function. A checker can call it through an RPC endpoint without changing state. Connecting a wallet may make address selection easier, but a user can also inspect a public owner address without controlling it.
Do not sign a message merely to display public allowance state
A tool may request a wallet connection to select the address, but it should not need a seed phrase or arbitrary typed-data signature to read a public allowance. Treat unexpected signing requests as separate actions requiring review.
Verify token metadata against the contract
The checker should display the token address, symbol, decimals, and network. If metadata fails or conflicts with the expected token, stop and verify the contract manually.
Interpret the result in token units
The raw allowance can contain dozens of digits. Convert with decimals, but preserve the raw value for detecting maximum integer approvals and nonstandard behavior.
Review the spender before revoking or keeping
Confirm whether the spender is still used by an active position, bridge withdrawal, recurring payment, vault, trading router, or account abstraction workflow. Revoking may break future automation, while keeping unnecessary access creates exposure.
Simulate the remediation transaction
Before signing, confirm that the transaction target is the token contract, the spender is the intended address, and the new amount is zero or the exact chosen limit. Do not approve a second unknown contract to solve an approval problem.
Recheck after confirmation
Wallet interfaces can show submitted while the transaction is pending, replaced, or failed. Read the allowance again after confirmation. The current token-contract state is the final evidence.
How to interpret zero, exact, large, and unlimited allowances
The numeric allowance is only the beginning. Risk depends on spender quality, wallet balance, future deposits, token value, contract upgradeability, expiration systems, and whether the permission is still necessary.
Zero allowance
Zero means the spender has no standard ERC-20 allowance for that owner-token pair at the time of the read. It is the expected result after a successful standard revocation.
Zero does not prove the wallet has no other permissions. Another spender may be approved. Permit2 may have a downstream permission. An unused permit signature may exist. NFTs and smart accounts use different authorization systems.
Exact allowance
An exact allowance matches a planned amount, such as 250 tokens for one deposit. This limits the spender relative to an unlimited value, but the remaining amount can still be used later.
If the application spends only part of the allowance, check the remainder. Some tokens and protocols reduce the value after transferFrom, while maximum sentinel allowances may remain unchanged.
Large allowance
A large finite allowance can be practically equivalent to unlimited when it far exceeds the wallet's expected holdings. Compare it with current balance, historical balance, future deposit plans, token price, and protocol need.
Unlimited allowance
Many applications request the maximum uint256 value, a 256-bit integer with every bit set. This value is vastly larger than realistic token supply and is treated as unlimited for practical risk analysis.
Unlimited approval reduces repeated approval transactions and gas costs, but it gives the spender durable access to current and future balances of that token. Exposure can persist for years if the user never revisits the permission.
Allowance larger than total supply
The token contract can store an allowance greater than current total supply or wallet balance. transferFrom remains limited by actual balance and token behavior, but future deposits can become spendable while the allowance remains.
Allowance displayed as scientific notation or infinity
Interfaces may abbreviate large values. Open the raw amount when possible. A rounded display can hide the difference between a high exact limit and the maximum uint256 sentinel.
Allowance does not measure contract safety
An exact allowance to a malicious spender can be more dangerous than an unlimited allowance to a deeply reviewed contract when the exact amount is still valuable. Amount and spender risk must be analyzed together.
| Allowance state | Practical meaning | Main risk | Typical action |
|---|---|---|---|
| Zero | No standard ERC-20 transferFrom allowance for this exact pair. | Other spenders or permission systems may remain. | Verify other approvals and preserve the revocation hash. |
| Exact amount | Spender can use up to the remaining finite amount. | Unused remainder persists and future deposits can be exposed within the limit. | Keep only when needed, otherwise reduce or revoke. |
| Large finite amount | Allowance exceeds ordinary planned use. | Can function like unlimited relative to wallet holdings. | Replace with a justified exact amount or zero. |
| Maximum uint256 | Effectively unlimited approval. | Current and future balances remain available to the spender. | Revoke after use or retain only with explicit risk acceptance. |
| Unexpected nonzero | A permission exists that the owner did not expect. | Phishing, forgotten use, compromised interface, or misunderstood routing. | Decode origin, assess spender, revoke, and scan wallet exposure. |
How approvals can drain future deposits after the original interaction
An allowance is not reserved against the wallet's current balance. It is permission to spend up to the remaining amount whenever sufficient balance exists and the token's transferFrom conditions are satisfied.
Empty wallet does not remove the allowance
A wallet can hold zero tokens today and still have an unlimited approval. If the wallet later receives that token, the spender can become capable of transferring it immediately.
Returning to a compromised wallet recreates exposure
Users sometimes move remaining funds out after an incident and later send tokens back because the wallet appears empty and inactive. Old allowances, delegates, or signatures can make the new deposit vulnerable.
Spender compromise can occur after approval
The spender may have been legitimate when approved. A later exploit, admin-key compromise, proxy upgrade, malicious module, or dependency failure can turn the stored permission into a loss path.
Upgradeability extends the time horizon
A proxy spender can change logic while preserving its address and every user's allowance. Review implementation changes and administrator controls when deciding whether an old approval is still justified.
Allowance can support repeated authorized pulls
Recurring-payment, vault, lending, and router designs can intentionally call transferFrom more than once. The allowance does not necessarily belong to one transaction unless the amount is exhausted or the protocol adds separate constraints.
Drainers search for existing permissions
Approval-phishing campaigns can trick users into authorizing malicious spenders. Attackers can monitor balances and call transferFrom when valuable tokens arrive. The Wallet Drainers and Approval Phishing guide explains these attack flows, signature traps, and incident-response priorities.
Revocation after loss prevents only future standard use
Setting allowance to zero cannot reverse completed transfers. It can prevent additional transferFrom use through that allowance after confirmation. Preserve the spender, recipient, transaction hashes, and wallet evidence for investigation.
ERC-20 approval lifecycle
The approval lifecycle begins with owner authorization, continues as persistent state in the token contract, and ends only when the allowance is consumed, replaced, revoked, or otherwise invalidated by token-specific logic.
Owner authorizes
The wallet selects an exact token contract, spender, amount, and network, then signs an approval or permit.
Token records allowance
The ERC-20 contract stores permission for that owner-spender pair.
Spender gains capability
The approved address can attempt transferFrom within allowance and available balance.
Exposure persists
Disconnecting or emptying the wallet does not remove the stored allowance.
Allowance can be used
A transferFrom transaction moves tokens and may reduce the remaining value.
Owner remediates
Set the allowance to zero or a justified exact amount, then recheck state.
Review related permissions
Inspect Permit2, signatures, NFT operators, smart-wallet modules, spender upgrades, and wallet risk.
Revoke versus reduce to an exact amount
Revocation removes the standard allowance for the exact pair. Reduction preserves limited access. The correct choice depends on whether the spender still has a legitimate operational purpose.
Revoke when access is no longer needed
Set the allowance to zero after a one-time swap, completed bridge deposit, finished mint, abandoned protocol, suspicious prompt, compromised dapp, or spender incident when no continuing transferFrom authority is required.
Reduce for active recurring use
A recurring payment, automated vault, active position, or regularly used router may require allowance. Replace an excessive value with the smallest practical amount and revisit it after use.
Exact amount is not a universal guarantee
A spender can use the full exact amount. If the amount itself is material, verify the spender and transaction conditions. Exact approval reduces maximum exposure but does not make malicious access safe.
Zero-first token behavior
The ERC-20 standard notes a transaction-ordering concern when changing a nonzero allowance directly to another nonzero value. Some token implementations require the current allowance to be set to zero before accepting a new nonzero allowance.
When a token requires zero-first behavior, wait for the zero transaction to confirm before submitting the replacement amount. Do not leave two conflicting pending allowance changes without understanding nonce and ordering.
Changing allowance can expose an ordering race
If an owner changes a nonzero allowance to another nonzero value, a spender observing the pending transaction may try to use the old allowance before the update confirms and later use the new allowance. Setting zero first reduces this specific transition risk, although it requires another transaction and gas.
Revocation transaction must target the token contract
The standard revoke action is an approve call to the token contract with the same spender and a zero value. Verify the token and spender again before signing. A malicious site can present a new approval while claiming to revoke an old one.
Recheck live allowance
After confirmation, call allowance again. A successful-looking wallet notification is not enough if the transaction failed, was submitted on the wrong chain, or targeted the wrong token.
Revoking can interrupt active services
A bridge claim, recurring payment, limit order, vault rebalance, or protocol action may fail after revocation. Decide whether the service still needs authority, and reapprove only when a legitimate transaction requires it.
Set allowance to zero
Best when the spender is unused, unknown, compromised, obsolete, or unnecessary for an active position.
Set a justified exact amount
Best when a trusted active workflow still requires transferFrom and the amount can be constrained meaningfully.
Gas fees, failed revocations, and chain mismatch mistakes
Reading allowance is free to the user because it is a read-only query. Changing allowance modifies token-contract state and must be included in a blockchain transaction.
Why revocation requires gas
Validators and nodes execute the approve call, verify the owner's transaction signature, update storage, and include the result in a block. The owner normally pays the network fee in ETH or the native gas asset used by the selected EVM chain.
Revocation does not send tokens
A standard zero approval changes permission state. It does not transfer the ERC-20 balance to the spender or revocation tool. The transaction can still require gas even though no token amount moves.
Insufficient gas token
A wallet can hold the ERC-20 token but lack enough native asset to revoke. Send only enough gas asset through a trusted route, then confirm the network and transaction before signing.
Wrong-chain revocation
Revoking on Ethereum does not change an allowance on Base, Arbitrum, BNB Chain, Polygon, or another network. The owner and spender addresses may look identical across chains, which makes this error easy to miss.
Wrong token contract
A bridged token, native token, counterfeit token, and older deployment can share a symbol. Revoking the wrong contract leaves the intended allowance unchanged.
Failed transaction
A revocation can fail because the token is nonstandard, paused, blocked, proxy logic changed, gas estimation was wrong, the wallet used the wrong account, or the calldata targeted an unsupported method. Decode the failure before retrying.
Pending and replacement transactions
A low-fee revocation can remain pending. A wallet may speed it up by submitting a replacement with the same nonce and a higher fee. Confirm which hash was ultimately included and read allowance after final confirmation.
Malicious front-end substitution
A compromised site can claim to revoke while asking the wallet to approve a different spender or sign a permit. Verify the transaction target, spender parameter, and zero amount in the wallet simulation.
Tokens with unusual approval behavior
Some tokens return no boolean, require zero-first updates, apply custom access controls, use proxy implementations, or implement nonstandard allowance logic. A generic checker should expose raw state and transaction evidence rather than assuming perfect ERC-20 compliance.
Before signing a revocation
- Confirm the owner account in the wallet.
- Confirm the network and native gas balance.
- Confirm the transaction target is the exact token contract.
- Confirm the spender parameter is the address being revoked.
- Confirm the new allowance amount is zero.
- Reject unrelated message-signature or approval requests.
- After confirmation, read the allowance again.
Permit2, signed permissions, NFT operators, and the limits of an ERC-20 allowance checker
A standard allowance checker reads allowance(owner, spender) on one ERC-20 token. Modern permission systems can add additional layers that require separate inspection.
Permit2 base approval
Permit2 is a shared permission contract. A user can grant an ERC-20 allowance from the token contract to the Permit2 contract, then use Permit2 permissions or signatures to authorize downstream applications.
A standard token allowance checker can show the token-to-Permit2 approval when Permit2 is entered as the spender. It does not automatically show every downstream Permit2 spender, amount, expiration, or nonce.
AllowanceTransfer permissions
Permit2's AllowanceTransfer model supports permissions with specified amounts and expiration times. Review the token, owner, downstream spender, amount, expiration, and nonce inside Permit2 in addition to the base ERC-20 approval granted to the Permit2 contract.
SignatureTransfer permissions
Permit2's SignatureTransfer model supports signature-based transfers intended for one-time use. The risk can exist in an unconsumed signed message even when no ordinary downstream allowance appears. Verify spender, token, amount, recipient constraints, nonce, and deadline.
ERC-2612 permits
A valid permit signature can create an allowance when submitted. An allowance checker sees the result after submission but cannot discover every signed permit that remains off-chain. If the wallet signed an unexpected permit, decode the message and investigate whether its nonce can be invalidated.
NFT single-token approvals
ERC-721 approve grants another address authority over one token ID. This state is read with getApproved(tokenId), not the ERC-20 allowance function.
NFT and multi-token operators
ERC-721 and ERC-1155 setApprovalForAll can authorize an operator across an owner's collection assets. These permissions are checked with isApprovedForAll and can expose every relevant NFT or token ID in the contract.
Smart-account modules and session keys
Smart contract wallets can authorize modules, plugins, guards, session keys, delegates, or batched execution policies. These systems may move tokens without relying on a direct ERC-20 allowance from the owner to the final application.
Native ETH permissions do not use ERC-20 allowance
Native ETH has no ERC-20 allowance mapping. ETH can move through signed transactions, smart-account authority, contract execution, bridge deposits, and wrapped-ETH token flows.
Token-specific extensions
Some tokens support temporary approvals, expiring approvals, proprietary authorization, blacklist controls, transfer hooks, or account restrictions. Identify the deployed token standard and implementation before concluding that one allowance field captures every spending path.
| Permission system | Standard ERC-20 checker coverage | Additional evidence | Remediation focus |
|---|---|---|---|
| ERC-2612 permit | Shows allowance after permit is submitted. | Signed typed data, nonce, deadline, domain, and submission status. | Revoke live allowance and address any still-valid unused signature. |
| Permit2 | Can show token approval to Permit2. | Permit2 downstream spender, amount, expiration, nonce, and signature state. | Revoke downstream permission and base approval as appropriate. |
| ERC-721 approval | Not covered by allowance(owner, spender). | Collection, token ID, getApproved, and owner. | Clear the token-specific approval. |
| ERC-721 or ERC-1155 operator | Not covered. | isApprovedForAll(owner, operator). | Set operator approval to false. |
| Smart-account module | Not covered directly. | Installed modules, policies, session keys, guards, and executor permissions. | Disable or remove the wallet-level authority. |
Approval cleanup schedule after swaps, bridges, mints, and claims
Permission cleanup should be tied to wallet activity and protocol risk, not only a calendar reminder. High-risk events justify immediate review, while active trusted protocols may be reviewed on a recurring schedule.
After a one-time swap
Check whether the router used the full allowance. Revoke a remaining approval when you do not expect to use that exact router and version again soon. If you keep access, prefer an amount that matches realistic use.
After a bridge action
Determine whether the bridge still needs source-chain allowance for a pending retry or additional deposit. Destination claims usually do not require the same source-token allowance. Revoke after the workflow is complete when continued access is unnecessary.
After a mint or claim
Free claims can still request token approvals or typed-data signatures. Check the transaction and any message signed before or after the mint. NFT operator permissions require a separate review.
After a failed interaction
A failed swap or deposit may have been preceded by a separate successful approval transaction. The failed application call does not automatically remove that allowance. Check the token-spender pair directly.
After a phishing warning or suspicious prompt
Review recent approvals, Permit2 permissions, NFT operators, signed permits, and transactions. Revoke confirmed unwanted authority, move valuable assets when compromise is possible, and avoid interacting through the suspicious site again.
After a protocol exploit or admin compromise
A protocol can be paused while its spender approvals remain. Follow verified incident communication, but independently check the exact approved addresses and upgradeable implementations. Revoke unnecessary access before depositing new tokens.
Before reusing an old wallet
Review allowances before sending new funds to a dormant wallet. Old unlimited approvals are particularly dangerous because they can expose deposits immediately.
Before moving long-term holdings into an active wallet
A wallet used for frequent dapp interactions accumulates approvals and signatures. Keep long-term holdings separate or complete a full permission review before increasing balances.
Monthly and quarterly review
Active trading wallets benefit from a monthly review. Lower-activity wallets can use a quarterly review and event-driven checks. High-value treasuries should monitor allowance changes continuously and require policy-based limits.
Approval cleanup checklist
- List high-value tokens on every actively used EVM network.
- Review each nonzero allowance and exact spender.
- Prioritize unlimited, unknown, obsolete, upgradeable, and recently exploited spenders.
- Check Permit2 downstream permissions and unused signed messages.
- Check NFT single-token approvals and operator approvals separately.
- Decode unexplained approval and transferFrom transactions.
- Scan unknown spender and recipient wallets with the Wallet Risk Scanner.
- Revoke or reduce, wait for confirmation, and verify live state.
- Save transaction hashes and the reason for permissions intentionally retained.
How to continue into wallet-risk and transaction analysis
An allowance result answers how much one spender can spend from one token-owner pair. It does not explain how the approval originated, whether the spender has already used it, or where transferred tokens went.
Decode the approval transaction
Use the EVM Transaction Decoder to confirm the token contract, spender, amount, sender, status, block, fees, proxy path, and any permit or batched action surrounding the approval.
Decode transferFrom use
When tokens moved unexpectedly, identify the transaction sender, owner whose tokens were spent, recipient, amount, spender authorization, internal calls, and final token flows. The outer sender may be a bot or drainer using an allowance granted earlier.
Scan the spender
Review whether the spender is a contract or wallet, how old it is, who funded related deployment, which tokens it interacts with, whether it is upgradeable, which administrators control it, and whether suspicious transfer patterns appear.
Scan the recipient
A malicious spender can direct funds to another address. Follow the actual token recipient and later transfers. Labels and wallet clusters should be treated as evidence with confidence, not automatic identity proof.
Check wallet-wide exposure
One suspicious allowance can indicate broader signing risk. Review recent token approvals, NFT operators, typed-data signatures, contract interactions, and unexpected network activity across the same wallet.
Preserve incident evidence
Save owner, network, token, spender, raw allowance, displayed amount, approval hash, transferFrom hash, recipient, block, timestamp, wallet prompt screenshots, and revocation hash. This creates a defensible timeline when interfaces and labels later change.
Connect permission state to transaction and wallet evidence
Decode how the approval was created, identify whether it was used, scan material counterparties, and save the evidence before continuing to use the wallet.
Hardware signing and wallet separation
Approval cleanup reduces stored contract permissions. It does not eliminate malicious signing requests or protect a recovery phrase stored on an exposed device. Separate active interaction from long-term custody.
Use a limited-balance interaction wallet
Keep only the assets needed for current swaps, bridges, claims, and protocol activity. If a spender or signature is compromised, the available loss is constrained.
Keep long-term holdings away from routine dapps
A storage wallet should have few approvals, minimal browser exposure, and a narrow transaction history. Transfer only the amount needed to an interaction wallet rather than granting broad permission over the long-term balance.
Hardware wallets protect keys, not transaction meaning
A hardware wallet such as Ledger can keep signing keys isolated from the browser or phone used to access a dapp. It cannot make an unlimited approval safe or guarantee that the displayed spender belongs to the intended protocol.
Verify the network, token contract, spender, amount, and transaction type before approving on the device. When the device cannot display enough detail, use wallet simulation and an independent decoder before signing.
Do not migrate compromised permissions into a new workflow
Moving tokens to a clean wallet removes their exposure to allowances stored under the old owner address. Do not import the same compromised recovery phrase into a new wallet application and assume the address is clean.
Use policy for treasury approvals
Multisigs and treasuries should document approved spenders, maximum amounts, expiration or review dates, required signers, emergency revocation, and monitoring. Unlimited allowances should require explicit justification and continuous review.
Worked examples: checking and remediating real approval patterns
Example one: forgotten unlimited router approval
A wallet used a decentralized exchange eighteen months ago. The token approval checker returns the maximum uint256 value for the router. The wallet currently holds no tokens, but the owner plans to deposit a large amount next week.
The risk is not zero because the allowance applies to future deposits. The owner confirms that the router version is no longer used, submits approve(router, 0), waits for confirmation, and reads the allowance again before funding the wallet.
Example two: exact vault allowance with active position
A wallet has a finite allowance of 2,000 tokens to a vault. The active position periodically pulls up to 100 tokens under an automation policy. Revoking immediately would stop the workflow.
The owner reviews the vault, proxy implementation, administrator, and operational need. The allowance is reduced to a smaller amount that covers the next cycle, and the wallet schedules another review after execution.
Example three: disconnected dapp, allowance still active
The owner removes a site from connected-app settings and assumes the risk is gone. A direct allowance query still returns an unlimited value because no token-contract transaction changed it.
The owner revokes through a trusted interface, verifies the token and spender in the wallet simulation, and confirms a zero allowance on-chain.
Example four: failed swap after successful approval
The owner sends an approval transaction, then the swap fails because the minimum output cannot be met. The failed swap reverts its own state changes, but the earlier approval remains confirmed.
The owner no longer plans to trade through that router, so the remaining allowance is revoked. The approval and failed swap hashes are stored together to preserve the sequence.
Example five: wrong-chain cleanup
A user sees a familiar spender on Ethereum and revokes it, but the original approval was on Arbitrum. The Ethereum allowance becomes zero while the Arbitrum allowance remains unlimited.
The owner selects Arbitrum, confirms the token contract and spender used in the original transaction, pays gas on that network, and verifies the correct state after confirmation.
Example six: Permit2 layered permission
A token allowance checker shows an unlimited approval from the token to the Permit2 contract. The user also has a Permit2 AllowanceTransfer permission granting a downstream router a finite amount until a future expiration.
Revoking only the downstream permission reduces the router's Permit2 access but leaves the base token approval to Permit2. Revoking only the token-to-Permit2 approval blocks use of the base allowance but does not explain which signed messages or downstream permissions existed. The owner reviews both layers and chooses remediation based on future use.
Example seven: unused permit signature after zero allowance
A wallet signed an ERC-2612 permit on a suspicious page, but the signature has not appeared on-chain. The current allowance is zero, which looks reassuring.
The signed permit may still be executable before its deadline if the nonce remains current. The owner preserves the signed fields, checks token-specific nonce and invalidation options, moves the token balance when risk is material, and does not assume that a zero current allowance cancels the off-chain signature.
Example eight: token approval to an address with no code
The spender address currently has no runtime bytecode. The user assumes an externally owned account cannot use contract automation and ignores the approval.
The address may still be controlled by a private key, or it may be a deterministic future deployment address. The owner cannot justify the permission and revokes it rather than relying on the absence of current code.
Example nine: malicious revocation page
A search result leads to a page that claims the wallet has a dangerous allowance. The page asks for an unlimited approval to a new contract before it can revoke anything.
A legitimate standard revocation does not require granting a new spender authority. The owner closes the page, checks the pair through a trusted read-only tool, and signs only the zero approval directed to the original token contract.
Example ten: NFT operator mistaken for ERC-20 allowance
A wallet's ERC-20 checks all return zero, but an attacker can still transfer NFTs because the wallet granted setApprovalForAll to an operator.
The ERC-20 result was accurate but incomplete for the broader wallet question. The owner reviews ERC-721 and ERC-1155 operator permissions and revokes the malicious operator separately.
How to read confirmed, observed, inferred, and unresolved findings
Allowance analysis combines direct token-contract state with contract and wallet interpretation. Keep evidence quality visible.
Direct on-chain permission state
Network, token, owner, spender, raw allowance, approval transactions, and confirmed revocations can be established directly.
Spending and contract behavior
transferFrom use, recipient flows, proxy upgrades, allowance changes, and spender interactions can be observed from transactions and state.
Purpose and entity interpretation
Router, drainer, treasury, bot, compromised contract, or beneficial-owner labels require contextual evidence.
Permission outside visible state
Unused signatures, unknown modules, unverified spenders, proprietary token logic, or missing historical data can remain uncertain.
Confirmed nonzero allowance is a capability
It proves that the token reports transferFrom authority for the pair. It does not prove the spender will use it maliciously or that the application remains safe.
Observed transferFrom use proves activity, not original intent
The owner may have intended a protocol action, misunderstood a signature, used a compromised front end, or been phished. Compare the spending transaction with the original approval and wallet prompt.
Spender labels need exact addresses
A familiar protocol name can have several router versions, proxies, and network deployments. Preserve the complete spender address and label source.
Unresolved signatures require conservative treatment
A checker cannot discover every message stored by an attacker. If a dangerous typed-data signature may exist, use its nonce, deadline, domain, and token-specific cancellation behavior to decide the response.
Common mistakes when checking and revoking token approvals
Checking the token contract as the spender
The approval transaction target is usually the token contract. The spender is an argument inside calldata and the Approval event.
Using only the dapp name
Protocols can use several spenders across chains and versions. Check the exact address used in the original transaction.
Disconnecting instead of revoking
Removing the website connection does not modify the token contract's allowance mapping.
Assuming an empty wallet is safe
Old allowances can apply to future deposits. Review permissions before refunding a dormant wallet.
Checking the wrong network
Allowance state is chain-specific even when owner and spender addresses look identical.
Trusting token symbols
Use the complete token contract. Native, bridged, old, and counterfeit tokens can share symbols.
Ignoring decimals
Raw integers must be converted using the exact token's decimals. Preserve the raw value for detecting maximum approvals.
Calling every large number unlimited
Maximum uint256 is the common unlimited sentinel. A different large finite amount can still be high risk but should be described accurately.
Revoking through an unknown site
A malicious site can present a new approval or permit while claiming to revoke. Verify target, spender, and zero amount in the wallet.
Ignoring Permit2
The base token allowance and downstream Permit2 permissions are separate layers that may both require review.
Ignoring unused permits
A zero current allowance does not necessarily invalidate an unsubmitted permit signature whose nonce and deadline remain valid.
Assuming zero ERC-20 allowance means no wallet permissions
NFT operators, smart-account modules, delegates, and signatures use other state and verification methods.
Revoking every active protocol blindly
Revocation can interrupt recurring or pending operations. Understand whether the spender still has a necessary function.
Reducing allowance without zero-first handling
Some tokens require the old allowance to be zero before accepting another nonzero amount. Follow token behavior and wait for confirmation.
Failing to verify the result
A submitted or failed transaction does not prove the allowance changed. Read live state after confirmation.
Conclusion: identify the exact permission, then remove unnecessary authority
An ERC-20 token approval checker should begin with four exact values: network, owner, token contract, and spender. The allowance belongs only to that combination. A familiar token symbol, dapp name, or wallet connection is not precise enough.
Connecting a wallet does not create an allowance. An approval transaction changes token-contract state, while a permit signature can authorize a later state change without an immediate transaction from the owner. Disconnecting the website does not revoke either form automatically.
Zero, exact, large, and unlimited allowances represent different amounts of authority, but spender quality and future balance exposure matter just as much as the number. An empty wallet with an unlimited approval can become exposed as soon as tokens return. An exact approval to a malicious spender can still produce a material loss.
Standard revocation normally sets allowance to zero. Reducing to an exact amount can preserve a legitimate active workflow. Some tokens require a zero-first sequence before a new nonzero value, and every remediation should be verified by reading live state after confirmation.
Use the Approval Allowance Checker for the exact pair, the approval-risk and wallet-permission guides for threat context, the CREATE2 guide for future-address risk, the drainer guide for phishing incidents, and the EVM Transaction Decoder to trace how authority was created or used.
A standard ERC-20 allowance review is one layer of wallet security. Permit2 permissions, unused typed-data signatures, NFT operators, smart-account modules, compromised keys, and contract upgrades can create separate exposure. The practical goal is not to revoke everything without context. It is to retain only permissions that are necessary, narrowly scoped, understood, and monitored.
Maintain a verifiable wallet-permission record
Check exact allowances, save remediation transactions, monitor material spenders, and preserve evidence across swaps, bridges, claims, incidents, and wallet migrations.
FAQs
Does disconnecting my wallet revoke approvals?
No. Disconnecting removes the website or session connection from the wallet interface. It does not send a transaction to the ERC-20 token contract, so existing allowances remain until changed on-chain.
Does checking an allowance cost gas?
No. The standard allowance function is read-only and can be queried through an RPC endpoint without changing blockchain state. Revoking or changing the allowance is a transaction and normally costs gas.
What is an unlimited approval?
An unlimited approval commonly uses the maximum uint256 value. It is vastly larger than realistic balances and can expose the wallet's current and future holdings of that token while the spender remains authorized.
Should I revoke every approval?
Not automatically. Revoke permissions that are unused, unknown, obsolete, compromised, or unnecessarily broad. An active protocol may require a limited allowance, but it should be justified and reviewed.
Why does a revoke transaction require gas?
Revocation changes storage inside the token contract. Validators execute and include the transaction, so the owner normally pays the network fee in the chain's native gas asset.
What information do I need to check an allowance?
You need the network, owner address, exact ERC-20 token contract, and exact spender address. The token contract returns the current allowance for that pair.
How do I find the spender address?
Decode the original approval transaction and read the spender argument, inspect the Approval event, or verify the exact contract in official protocol documentation. The spender is usually not the token contract itself.
What does a zero allowance mean?
It means the exact spender has no standard ERC-20 transferFrom allowance for that owner and token at the time of the query. Other spenders and permission systems can still exist.
Can an approval drain tokens deposited later?
Yes. Allowance can remain while the wallet balance is zero. If tokens are deposited later, the spender may be able to transfer them within the remaining allowance.
How do I revoke an ERC-20 approval?
Submit an approve transaction to the token contract with the same spender and an amount of zero, then wait for confirmation and read the allowance again.
Should I reduce an allowance instead of revoking it?
Reduce it when a trusted active workflow still requires limited transferFrom access. Revoke it when the spender no longer needs any authority.
Why do some tokens require setting allowance to zero first?
Some nonstandard token implementations reject a direct change from one nonzero value to another. The zero-first sequence also addresses a known transaction-ordering concern when replacing an existing allowance.
Why did my revocation fail?
Possible causes include the wrong network, insufficient gas asset, nonstandard token behavior, proxy changes, incorrect owner, wrong calldata, paused token logic, or an underestimated gas limit. Decode the failure before retrying.
Does revoking on Ethereum revoke the same approval on Base or Arbitrum?
No. Each network has separate token contracts and allowance state. Perform the check and remediation on the network where the approval exists.
Does an ERC-20 allowance checker show Permit2 permissions?
It can show the token's base allowance to the Permit2 contract when Permit2 is the spender. Downstream Permit2 permissions, expirations, nonces, and signatures require separate inspection.
Does revoking allowance cancel an unused permit signature?
Not necessarily. An unused permit can remain executable before its deadline if its nonce remains valid. Investigate token-specific nonce invalidation and move funds when a leaked signature creates material risk.
Does a token approval checker show NFT approvals?
No. ERC-721 token approvals and ERC-721 or ERC-1155 operator permissions use different functions such as getApproved and isApprovedForAll.
Can a spender with no contract code be risky?
Yes. It can be an externally controlled address or a deterministic address where code may be deployed later. Revoke permissions that cannot be justified rather than relying only on current code absence.
Can a hardware wallet prevent risky approvals?
A hardware wallet protects signing keys, but it cannot guarantee that the spender or amount is safe. Verify transaction details and use independent decoding before approving.
Does revocation recover tokens already transferred?
No. Revocation can prevent future standard transferFrom use after confirmation. It does not reverse completed blockchain transactions.
References and further learning
The following official standards and reputable security resources provide additional context on ERC-20 allowances, revocation, typed-data permits, Permit2, and approval management.
- ERC-20 Token Standard
- ERC-2612 Permit Extension
- EIP-712 Typed Structured Data
- Ethereum.org: How to Revoke Smart Contract Access
- Etherscan: Token Approval Checker Guide
- OpenSea: Managing and Revoking Token Permissions
- Uniswap Developers: Permit2 Overview
- Uniswap Permit2 Source Repository
This TokenToolHub guide is educational research only. It is not investment advice, legal advice, incident-response assurance, or a guarantee that a wallet, token, spender, permit, or protocol is safe. Verify the network, owner, token contract, spender, allowance, decimals, transaction calldata, signature domain, contract code, proxy administration, and confirmed post-remediation state before acting.