A user connects their wallet to a decentralized application, approves a token swap, and the transaction succeeds. Weeks later, they discover that the dapp contract has drained their balance without further permission. The wallet showed an approval screen, the user signed it, and the blockchain recorded the action—yet the experience felt like a single transaction rather than a grant of unlimited spending authority. This disconnect between what appears on screen and what the blockchain actually permits is one of the most consequential security gaps in self-custodial cryptocurrency management.
Token approvals are a necessary mechanic in Ethereum and EVM-compatible networks. Without them, users would need to send tokens directly to a contract’s address, which most modern decentralized applications cannot receive. Instead, the protocol uses a two-step model: the user approves a spender to transfer tokens up to a specified amount, and then the dapp uses that allowance to move funds. The problem is that most approvals grant unlimited spending authority by default, and most users do not understand what they are signing or how to revoke that permission afterward. Understanding this mechanism is essential for safe wallet use, whether you are trading on decentralized exchanges, providing liquidity, or staking tokens.
How ERC-20 approvals function at the contract level
The ERC-20 standard, which defines most tokens on Ethereum and EVM-compatible networks, includes an approve function. When you call this function, you specify two parameters: the spender contract address and an allowance amount. The contract then records that the spender is permitted to transfer up to that amount on your behalf, without requiring your signature on each individual transfer. This separation between approval and spending exists because it is impractical for a contract to request your signature every time it needs to move funds.
Once the allowance is recorded, the spender contract can call the transferFrom function to move tokens from your wallet to any destination it chooses, up to the approved amount. This happens without a second signature from you. The contract must have been designed correctly, the spender address must be legitimate, and no malicious code must execute after you approve. If any of those conditions fail, your tokens can be transferred without further confirmation.
In practice, most decentralized applications set the allowance to an extremely high number—often the maximum value representable in the Ethereum virtual machine, approximately 10^77. This is called an unlimited approval. The intent is convenience: the user approves once, and the dapp can spend from that allowance indefinitely without requesting new permissions. The security implication is severe. If the contract has a vulnerability, is compromised, or later adds a malicious withdrawal function, that entire allowance becomes accessible. Many high-value exploits in DeFi have depended on this mechanism: users approved contracts that initially seemed safe, and later versions or hidden code paths drained the approved amounts.
Why MetaMask displays the approval but not the risk
When you connect a MetaMask wallet to a decentralized application and interact with a token swap or liquidity provision, the app typically requests an approval. MetaMask shows an approval screen that displays the token name, symbol, and a statement about what you are approving. However, the display does not clearly distinguish between a safe, limited approval and a risky, unlimited one. Both appear as simple confirmation dialogs, and the allowance amount is often too large to read or parse visually.
This presentation problem exists because MetaMask is designed to support many applications with varying approval models. Some dapps request a specific amount tied to a single transaction. Others request unlimited allowances for convenience. The wallet displays what the blockchain transaction actually specifies, but users routinely interpret the approval as a necessary step in the current action rather than as a separate grant of authority. The approval confirmation page may say “Unlimited,” but the word “approval” itself can be misunderstood as meaning “go ahead with this trade,” not “let this contract spend any amount of this token indefinitely.”
The timing compounds the confusion. A user initiates a swap on a decentralized exchange, MetaMask pops up with an approval screen, the user confirms it, and then a second transaction—the actual swap—appears. If the approval succeeds but the swap fails (due to slippage, liquidity, or user error), the user may assume the approval was part of a single failed action. In reality, the approval has already been recorded on the blockchain and remains valid even if the swap never happens. Many users who encounter this scenario do not realize they have granted standing authority that persists beyond that single failed interaction.
Common scenarios where unlimited approvals create risk
An unlimited approval to a legitimate, well-audited protocol like Uniswap or Aave is relatively lower-risk because the contract code is public and has been reviewed by multiple parties. The risk increases sharply when approving newer, less-audited projects, or when a contract is upgraded and gains new functions after you have already approved it. If a project team later adds a withdrawal function they control, an unlimited approval gives them access to all approved tokens.
Approval risk also depends on chain conditions and the token’s utility. Approving an unlimited amount of ETH (or a wrapped token) on Ethereum mainnet is riskier than approving the same amount on a lower-value testnet. The potential loss is simply larger. Similarly, approving an unlimited amount of a valuable or widely-held token carries more risk than approving a personal or low-liquidity token. An attacker who compromises a contract is more likely to exploit approvals of high-value assets.
Another practical scenario involves token bridge contracts or wrapped token handlers. If you are converting a token from one chain to another, you may need to approve a bridge contract. If that contract is newer, from a less-established team, or lacks comprehensive audits, the approval is a significant trust decision. The bridge contract typically holds the tokens temporarily, and an unlimited approval means it could hold indefinitely or direct tokens to any address. Many bridge exploits have leveraged approvals granted by users expecting a single transaction but unknowingly giving the bridge contract full discretion over their holdings.
Social engineering attacks also exploit approval mechanics. A phishing site may direct users to “approve” a contract while actually requesting authorization to a malicious address. The user might think they are enabling a legitimate swap but have actually approved a contract with no restrictions. Because the blockchain has no concept of “intent” or “correct recipient,” a signed approval is valid even if the user was deceived about its purpose.
Identifying unlimited approvals in MetaMask
Before signing an approval transaction, users can examine the details more carefully than the default view suggests. In MetaMask, clicking the “View Full Transaction Details” or similar option expands the approval request to show additional fields. The key field is the “Amount” or “Value” parameter. If this field shows a very large number (often represented as “Unlimited,” “UINT256_MAX,” or a number like 115792089237316195423570985008687907853269984665640564039457584007913129639935), the approval is unlimited.
Some advanced users and security-conscious applications have begun using smaller, more specific approvals. A dapp might request an approval of exactly the amount needed for the current transaction, or a reasonable daily limit. Spotting these limited approvals requires reading the amount carefully, but it is worth doing. A specific number tied to the transaction amount is preferable to an unlimited allowance.
External tools can also help users track their existing approvals. Websites like Etherscan allow users to search their wallet address and review past transactions, including approval confirmations. Specialized approval-checking tools such as approved.zone or similar platforms provide a clearer view of which contracts have what allowances over a user’s tokens. These tools are not part of MetaMask itself but can be used in a browser alongside your wallet to audit permissions before they become a problem.
How to revoke dangerous token approvals
If you have granted an unlimited (or unwanted) approval to a contract, the solution is to revoke it. Revoking an approval means submitting a new approval transaction to the same token contract, setting the spender’s allowance to zero. MetaMask can be used to initiate this transaction, and specialized tools can guide the process.
To revoke an approval in MetaMask, you need the contract address of the token and the contract address of the spender. You can obtain these from Etherscan or your transaction history. Then, you use MetaMask to interact directly with the token contract’s “Approve” function, setting the amount to zero. Some approval-revocation sites automate this by pre-filling the addresses and allowing you to approve zero with a single click. The transaction costs gas (a blockchain fee), typically a small amount unless the network is congested.
An important caveat: revoking one approval does not revoke all approvals. If you have approved multiple spenders, you must revoke each one individually. Similarly, revoking an approval on one blockchain does not affect approvals on other chains. A user who has approved the same spender on Ethereum, Polygon, and Arbitrum must revoke on each chain separately. This is why checking your approvals periodically—perhaps monthly or after using unfamiliar dapps—is a practical security habit.
Some users choose to revoke all old approvals and grant only new, limited ones for each interaction. This approach is more tedious because it requires more transactions and more gas fees, but it minimizes the amount of standing authority any single contract possesses. The trade-off is between convenience (fewer approvals) and security (smaller per-approval risk). The right balance depends on how often you interact with dapps and how much you are willing to spend on revocation transactions.
Best practices for managing blockchain wallet security and approvals
The foundational best practice is to treat approval requests as separate decisions from transaction execution. When MetaMask shows an approval screen, pause and ask: “What contract am I trusting with my tokens, how much authority am I granting, and do I need unlimited authority or just enough for this one action?” If the answer is unclear, do not approve. No single transaction or swap is worth the risk of granting unsafe permissions to an untrusted address.
For dapps you use frequently, approving a reasonable amount (such as a day’s worth of expected volume or a multiple of the current transaction) is a middle ground. You still benefit from convenience, but you are not giving the contract unlimited access. For unfamiliar or experimental applications, requesting a limited approval or one specific to that transaction is preferable. Some newer dapps support this; if the app does not, that is a signal that it may not be worth trusting with large amounts.
Maintain a habit of periodic audits. Every few months, review your approvals on the chains where you actively trade. Look for contracts you no longer use or recognize. Revoke the ones that seem unnecessary. This reduces your exposure to forgotten approvals and makes it harder for an attacker to find and exploit old permissions. The revocation cost is small compared to the potential loss from a compromised contract exploiting an old, unused approval.
Use hardware wallet support in MetaMask when managing significant assets. MetaMask can connect to hardware wallets such as Ledger or Trezor, which keep your private keys completely offline. This does not prevent you from approving unsafe contracts, but it does ensure that even if your desktop or phone is compromised, an attacker cannot sign approvals without physical access to the hardware wallet. For smaller amounts or testing with new dapps, a software wallet is acceptable; for larger holdings, hardware-backed signing adds a meaningful security layer.
The future of approval mechanisms and wallet design
The ERC-20 approval mechanism is foundational to Ethereum and has remained largely unchanged since its introduction. Newer token standards and alternative protocols have attempted to improve this model, but adoption remains limited. Some proposals involve allowing the spender to be a time-limited delegation or to require periodic re-approval, but these add complexity for users and developers alike.
From a wallet perspective, MetaMask and other interfaces have an ongoing opportunity to improve approval clarity. Better warnings about unlimited allowances, clearer displays of the spender address and amount, and integrated links to revocation tools could reduce the approval-related losses that occur each year in decentralized finance. Some wallets have begun experimenting with approval limits set by the user or defaulting to limited rather than unlimited allowances, though this approach requires dapp support and coordination.
The most practical near-term improvement is education and user awareness. Every person who manages digital assets should understand that an approval is not the same as a transaction, that unlimited approvals are a security trade-off, and that revoking old permissions is a legitimate maintenance task. This knowledge does not require technical expertise; it requires time spent reading the confirmation screen rather than immediately clicking approve.
Frequently asked questions
What is the difference between approving a token and sending it?
Approving a token grants a contract permission to transfer that token on your behalf up to a specified amount. Sending a token directly moves it to a recipient address immediately. An approval is a standing permission; a send is a discrete action. If you approve a contract, it can then transfer your tokens without you approving each transfer individually, up to the approved amount.
Can I lose money if I approve a contract and then do not use it?
Yes, if the contract is malicious or becomes compromised after you approve it. Simply approving a contract does not cause money to move immediately, but the approval grants that contract authority to transfer your tokens at any time in the future. If the contract owner or an attacker exploits that permission, your funds can be drained without another signature from you.
How do I know if an approval is limited or unlimited?
In MetaMask, expand the transaction details to see the “Amount” field. If it shows a very large number (like UINT256_MAX or 115792089…) or the word “Unlimited,” the approval is unlimited. A specific, readable number tied to your transaction amount indicates a limited approval. You can also check your past approvals using tools like Etherscan or specialized approval auditors to see what permissions you have already granted.

No comment