Token approvals: the risk nobody explains
Protecting your seed phrase is not enough. Approvals are standing permissions to move your tokens that persist until you remove them, and they drain many wallets.
Quick answer
An approval is an allowance you grant so a contract can move your tokens with transferFrom. It persists on chain until you change or remove it, and unlimited approvals cover your whole balance. Signature-based permits and NFT setApprovalForAll grant the same power. Your approval surface only grows unless you audit and revoke it.
Key points
- Approvals separate spending permission from your balance and persist until revoked.
- Unlimited approvals authorize your entire present and future balance.
- Permit and Permit2 grant spending power via an off-chain signature, no gas required.
- setApprovalForAll hands an operator control of an entire NFT collection.
- Your approval surface grows silently until you review and prune it.
Most guidance about staying safe in crypto focuses on protecting your private key and seed phrase. That advice is correct but incomplete. A large share of real-world losses happen without any key ever being exposed, because the victim voluntarily granted a spending permission called an approval. Approvals are a normal, necessary part of how tokens work. They are also a standing risk that quietly accumulates in almost every active wallet.
What an approval actually is
The ERC-20 token standard separates ownership from spending. Your balance lives in the token contract. When an application needs to move your tokens, it does not touch your balance directly. Instead you call approve(spender, amount), which records an allowance: permission for a specific spender address to move up to a certain amount of your tokens on your behalf. Later, the spender calls transferFrom(you, destination, amount) to actually move them, drawing down the allowance.
approve(spenderAddress, amount) // you grant permission
transferFrom(you, to, amount) // spender uses that permission
This two-step design exists for good reasons. It lets decentralized exchanges, lending markets, and other contracts pull tokens as part of a larger operation without you signing off on every individual movement. The token standard is documented on ethereum.org and in the original EIP-20 specification.
The part nobody explains: the allowance persists
The crucial detail is that an allowance does not expire when you finish using an application. It stays on chain until you change or remove it. If you swapped a token on some exchange a year ago, the allowance you granted then may still be active today. Every active allowance is a door: as long as it is open, the approved spender can call transferFrom and move tokens up to the approved amount, at any time, without asking you again.
If the spender is a well-behaved, audited contract, this is fine. If the spender contract has a vulnerability, is later exploited, or was malicious from the start, the allowance becomes the exact channel through which your tokens leave. Your key was never the weak point. The permission you granted was.
Unlimited approvals
Many applications request an unlimited approval by default, setting the amount to the maximum possible value, type(uint256).max. Common ERC-20 implementations, including OpenZeppelin’s, treat this maximum value as an infinite allowance and do not decrement it on each transferFrom, which saves gas on repeated transfers. That is a genuine convenience for frequent trading, but it means a single approval can authorize the movement of your entire present and future balance of that token, indefinitely, to whichever spender you approved.
Unlimited approvals are why a wallet can be drained of far more than the amount involved in the original interaction. You may have thought you were authorizing a single swap; the allowance you left behind covered everything.
Signature-based approvals: the risk without a transaction
Approvals do not always require an on-chain transaction. Under EIP-2612, a token can implement a permit function that accepts an off-chain, EIP-712 signed message and grants an allowance in the same call that spends it. The user only signs a message; a relayer or the application submits it. This is often marketed as a gasless approval, and tokens such as USDC and DAI support it.
The security implication is important: a permit signature grants the same spending power as an on-chain approval, but it does not cost you gas, does not immediately appear in your transaction history, and can be requested through a signing prompt that looks like a harmless login. Permit2, a widely integrated contract from Uniswap, extends signature-based allowances to tokens that do not natively support permit, using a combination of a one-time approval to the Permit2 contract and subsequent off-chain signatures. These mechanisms are convenient and legitimate, and they also expand the set of things a phishing page can ask you to sign.
NFTs: setApprovalForAll
The same pattern exists for NFTs, but broader. The ERC-721 standard defines setApprovalForAll(operator, approved), which grants an operator authority over every token you own in that collection, current and future, until you revoke it. A single signature can therefore hand over an entire collection. This one call is behind a large fraction of NFT phishing losses, because the victim believes they are approving one action while granting blanket, collection-wide control.
How to think about your approval surface
Every wallet that has interacted with decentralized applications carries an approval surface: the complete set of allowances and operator permissions it has granted over its lifetime. This surface only grows unless you actively prune it. Treat it the way you would treat app permissions on a phone: something to review periodically and reduce to what you actually use.
- Assume permanence. Any approval you grant stays live until you remove it. There is no automatic cleanup.
- Prefer bounded amounts. Where an application lets you approve a specific amount instead of unlimited, choose the specific amount, even at the cost of approving again next time.
- Treat signatures as approvals. A request to sign a message can be a permit or a Permit2 authorization. It is not automatically safer than a transaction just because it is gasless.
- Separate wallets by purpose. A holding wallet that never approves anything cannot be drained through an approval. Use a low-value wallet for interaction.
- Audit and revoke. Periodically review your approvals with a reputable checker and revoke anything you no longer use or do not recognize.
Why this matters more than it seems
Approvals are invisible in day-to-day use. Your balance looks the same whether you have granted one allowance or fifty. That invisibility is precisely the problem: risk accumulates silently, and the cost is only realized at the moment a spender turns out to be untrustworthy. Understanding approvals does not require reading Solidity. It requires internalizing one sentence: an approval is a standing permission to move your tokens that lasts until you remove it. Everything else follows from that.
Sources
Frequently asked questions
Does an approval move my tokens right away?
Are approvals bad? Should I avoid them?
Is signing a message safer than a transaction?
What is an unlimited approval?
How do I know what approvals I have?
Note: CamoCrypt is security & education only — no prices, no predictions, no investment advice. Verify every address and contract yourself; we cannot recover lost funds and neither can anyone who contacts you claiming they can.