Independent DeFi security desk · Status: operationalMethodology & corrections · Submit an incident
DeFi Safety · Fact checked

How to Separate a Token Approval From a Token Transfer

The interface difference that helps readers understand what a wallet prompt is asking.

This article may contain affiliate links. Commercial relationships are disclosed in the affiliate policy.

DeFi Safety — illustration keyed to this article's identifier. Source documents are listed under Sources and are not reproduced here.

These two operations look almost identical in a wallet prompt, cost almost the same, and produce almost the same confirmation screen. One of them moves your tokens. The other one changes what a piece of code is allowed to do with your tokens later, without moving anything now. Confusing them is the single most common way people lose funds without ever making a bad trade.

What each operation actually does

A token transfer moves an amount of an asset from your address to another address. After it is included in a block, the balance in your wallet is lower. That is the whole effect. There is nothing left behind that a third party can invoke.

A token approval changes the allowance recorded for a contract address: it says “this contract may move up to this amount of this token from my address.” No tokens move. Your balance does not change. What changes is a permission, and that permission persists until it is spent or until you revoke it.

The mechanism is usually described as the ERC-20 approve and allowance functions. The allowance is a number attached to a specific owner-contract-token triple. Reading it tells you the ceiling, not the amount in dispute: an allowance of zero is a revoked or never-granted permission, an allowance equal to the balance of the token is effectively unlimited for practical purposes, and an allowance of a large round number is the signature of a user who clicked through a default.

The prompt tells you which one you are signing

Wallet interfaces have improved, but the distinction still comes down to specific fields rather than overall appearance.

Look at what the confirmation names. A transfer prompt names a recipient address and a token amount. An approval prompt names a contract address as the spender, often with wording about permission or allowance, and frequently shows an amount of “unlimited.”

Look at what your balance does afterwards. If a balance changes, it was a transfer. If nothing moved and a permission was granted, it was an approval. This is the reliable check when a prompt is ambiguous, and it is checkable after the fact from a block explorer.

Look at whether the interface asks for an amount at all. Approval flows often present a preset — exact amount, or unlimited — because the amount is a ceiling rather than a quantity being sent.

Ethereum’s own security guidance is explicit on the mechanism: do not allow unlimited spend limits when interacting with smart contracts, because an unlimited allowance is what enables a contract to drain a wallet, and set limits to only the amount the transaction requires. Many wallets now offer limit protection that defaults to something other than unlimited.

Why an approval is the more dangerous of the two

An approval carries a capability that outlives the moment you granted it. A transfer is a completed event; an approval is an open door with a size attached.

Three consequences follow, and they are worth separating because they have different likelihoods.

The standing exposure. The permission persists indefinitely. A contract you approved eight months ago for a deposit you since withdrew still holds that allowance, and if that contract is compromised, the compromise has a path to your balance that does not require you to interact again.

The counterparty is usually not the thing you interacted with. The contract holding your approval is frequently a router, a deposit contract, or a settlement contract, not the protocol’s front end. Reading the protocol’s name on the approval screen tells you very little about whose code is being authorised.

The chain is not the interface. The same address on Ethereum, Base, Arbitrum and other networks is a different address with separate, non-transferable allowances on each. Revoking on one network leaves the others exactly as they were. This is why an “I revoked everything” claim is often wrong for a specific pair of network and token.

A working procedure

  1. Before signing, decide whether the flow requires a transfer, an approval, or both. A first-time deposit into a new protocol commonly requires an approval first and a deposit second, as two separate transactions.
  2. If an approval is required, set a specific limit equal to what the transaction needs rather than unlimited. If the interface offers unlimited as the default, change it.
  3. Record the spender contract address, not the app name. The name is a label and can be changed after deployment.
  4. After signing, use a block explorer to confirm what happened: a transfer shows a balance movement, an approval shows an allowance written to the contract’s storage.
  5. Schedule a periodic pass over your approval list, or at minimum revoke approvals for protocols you no longer use.
  6. When revoking, work network by network and token by token. Confirm the revocation landed on the chain you intended.
  7. Never let anyone talk you into signing an approval in response to a direct message, an “airdrop claim”, or a support request. The standard airdrop scam works precisely by presenting a claim page that asks you to “approve” a transaction.

What this distinction does not settle

Distinguishing approval from transfer tells you what a signature does. It does not tell you whether the contract receiving the approval is safe, whether the code it runs has been audited, or whether the person who controls it is honest. A perfectly legitimate approval can point at a contract with a known vulnerability, and a valid-looking interface can be a copy of a real one on a domain you did not intend to visit.

For that, the checks are separate: verify the domain before you sign, read what the spender contract is for in the protocol’s own documentation, and treat any request for a seed phrase or private key as an attempt at theft rather than a support step. No legitimate service will ever ask for those.

Sources