# Token Approval Checker: Open Allowances by Wallet

> Check token approvals for any wallet: every open ERC-20 allowance, NFT approval and Permit2 grant by spender and chain, with its grant date and a receipt.

Markdown copy of https://voltfincrypto.com/apps/token-approval-checker

**Question:** Which contracts can still spend tokens from this wallet, and for how much?

- Kind: Table in Voltfin Strata
- Topic: [Security and risk](https://voltfincrypto.com/topics/security)
- Chains: Multi-chain
- Status: Planned. The data is not published yet, so this page states no figure; each figure will open its receipt when it is.

Every time a wallet lets an app move its tokens, it leaves an approval on-chain, and that approval stays until it is used up or revoked. This table lists every open approval for a wallet across chains: the token, the spender, the allowance and when it was granted, confirmed against the token contracts at the latest block.

Unlimited approvals and approvals over a whole NFT collection are the ones drainers and exploited contracts use, so they are marked, along with the spender's label where one is known. Sort by value at risk or by date and filter by chain or approval kind. Open any row for the transaction that granted it and the read that shows it is still open.

The table only reads. Revoking happens from the wallet itself, by sending a transaction that sets the allowance to zero, and the row disappears once the next read confirms it.

## Blueprint

One row: One row per wallet, chain, token and spender with an open approval at the latest block

- **Token** (`token`): The approved token's name and symbol, linked to its contract.
- **Chain** (`chain`): The chain the token contract and the approval live on.
- **Approval kind** (`approval_kind`): Exact amount, unlimited, a whole NFT collection (ApprovalForAll), a single NFT or a Permit2 grant.
- **Spender** (`spender`): The contract or address allowed to move the tokens.
- **Spender label** (`spender_label`): What the spender is (a DEX router, a marketplace, a bridge or a known drainer) with the label's source, or unknown.
- **Allowance** (`allowance`, tokens): The amount the spender may still move, read at the latest block; shown as unlimited at the largest value.
- **Value at risk** (`value_at_risk`, USD): The smaller of the allowance and the wallet's balance, valued at the latest oracle or DEX pool price.
- **Granted** (`granted_at`): The date of the transaction that set the current allowance.
- **Expires** (`expires_at`): When a Permit2 allowance expires; ERC-20 and NFT approvals do not expire on their own.
- **Receipt** (`receipt`): The granting transaction and the latest-block read that shows the approval is still open.

## How it will be measured

- Candidate approvals come from ERC-20 Approval logs, ERC-721 and ERC-1155 ApprovalForAll logs and Permit2 Approval and Permit logs in which the wallet is the owner.
- Each candidate is confirmed at the latest block with allowance(owner, spender), isApprovedForAll(owner, operator) or the Permit2 allowance(owner, token, spender), so used and revoked approvals drop out.
- An ERC-20 allowance counts as unlimited when it equals the largest uint256 value or exceeds the token's total supply.
- The value at risk for an ERC-20 row is the smaller of the allowance and the wallet's balance, valued at the latest oracle or DEX pool price.
- Spender labels come from the address registry with their sources; an unlabelled spender is shown as unknown, never as safe.

## Data it needs

- `token_approvals` (to build): Active ERC-20 and NFT approvals per wallet and spender, with the spender's label and when the approval was set.
- `address_labels` (to build): Labels for known addresses: exchanges, bridges, protocols, funds, treasuries, sanctioned addresses and known attackers.
- `token_holders_snapshot` (to build): Holder counts, top holders and concentration shares of registry tokens at a pinned block, with contract and exchange labels.
- `native_prices_daily` (to build): Reference prices of major assets read from on-chain oracle feeds (Chainlink latestRoundData) at each day's last block, with each round's update time.
- Source: ERC-20 Approval(owner, spender, value) logs where the wallet is the owner
- Source: allowance(owner, spender) via eth_call at the latest block
- Source: ERC-721 and ERC-1155 ApprovalForAll logs and isApprovedForAll(owner, operator) at the latest block
- Source: Permit2 Approval, Permit and Lockdown logs and allowance(owner, token, spender) reads
- Source: balanceOf(owner) of each approved token at the same block, for the value at risk

## Questions

### What is a token approval?

An approval is a permission a wallet gives a contract to move its tokens, set with approve() for ERC-20 tokens or setApprovalForAll() for NFT collections. Apps need it to swap or list tokens on the wallet's behalf, and it stays in place after the app has been used.

### Why are unlimited token approvals risky?

An unlimited approval lets the spender move the wallet's whole balance of that token at any time, now or later. If the spender contract is exploited, or was malicious from the start, every token the approval covers can be taken without another signature.

### How do I revoke a token approval?

Revoking is a transaction from the wallet: approve(spender, 0) for an ERC-20 token, setApprovalForAll(operator, false) for an NFT collection or a zero-amount approval or lockdown on Permit2. It pays the chain's normal fee, and this table shows the new state once it is mined.

### What are Permit2 allowances?

Permit2 is a shared contract that many apps use to move tokens. A wallet approves Permit2 once per token, then grants each app its own allowance inside Permit2, with an amount and an expiry. Both layers are listed here, each with its own row.

### Does revoking an approval on one chain revoke it everywhere?

No. An approval lives in one token contract on one chain, so the same token on another chain, or a bridged copy of it, has its own approvals. The table lists each chain's approvals separately for that reason.

## Glossary

- **Allowance**: The amount of a token a spender may still move from a wallet, as returned by the token's allowance(owner, spender) function.
- **ApprovalForAll**: An NFT approval that lets an operator move every token a wallet holds in one ERC-721 or ERC-1155 collection.
- **Unlimited approval**: An allowance set to the largest value the token allows, so it never runs out however much the spender moves.

## Related apps

- [Wallet Drainer Tracker: Phishing Losses by Month](https://voltfincrypto.com/apps/wallet-drainer-tracker)
- [Token Safety Check: Mint, Blacklist and Owner Powers](https://voltfincrypto.com/apps/token-safety-check)
- [Crypto Address Checker: Flagged, Sanctioned or Hacked](https://voltfincrypto.com/apps/crypto-address-checker)
- [Wallet Balance Checker: Every EVM Chain in One View](https://voltfincrypto.com/apps/wallet-balance-checker)
- [Safe Multisig Checker: Owners, Threshold and Modules](https://voltfincrypto.com/apps/safe-multisig-checker)
- [Bitcoin Quantum Risk: BTC in Exposed Public Key Addresses](https://voltfincrypto.com/apps/bitcoin-quantum-risk-exposed-keys)

Build it in Voltfin Studio: https://app.voltfincrypto.com/signup?next=%2F
