How it works
Contract Details
What a contract is, whether its code can change, who controls it and who created it, on one page per contract and network, with a token scan for ERC-20 tokens.
Updated 2026-10-10
Overview
Every contract on a supported network has a page at /<network>/contract/<address>. It reads the contract's code and storage on the chain, its record on the explorer and a few of its own view functions, and lays out what they say. Nothing is signed and no wallet is needed.
- Notes: plain facts worth knowing, such as a single account that can replace the code or a contract that is paused.
- Overview: source verification, token standard, creation date, creator, factory and transaction count.
- Code: proxy type, implementation, beacon and whether the code can be upgraded.
- Control: owner, upgrade admin, Safe threshold, timelock delay and pause state.
- Functions: the names of the verified ABI's write and read functions. Source code is never shown.
- Token scan (ERC-20 tokens only): holders without pools, the launch, trading, contract powers and a verdict with every finding behind it.
You reach it from search (Ctrl/Cmd+K with a contract address), from the Contract Deploy card of a wallet analysis, from the account line on the Identity tab, from the banner a wallet page shows when the address is a contract, from Contract details on a Wallet Flow node, from the contract addresses on a transaction page and the Unclaimed tab, and from the Contract page button of an Ask zkCodex answer.
Code and upgrades
Proxy patterns are read from the chain first: the runtime code and the standard storage slots. The explorer's own proxy label is used only when the chain shows nothing, and the page says which source it came from.
| Type | How it is detected | Upgradeable |
|---|---|---|
| Minimal proxy (clone) | EIP-1167 runtime code | No |
| Beacon proxy | EIP-1967 beacon slot; the beacon's implementation() | Yes, by the beacon's owner |
| Upgradeable proxy (EIP-1967) | Implementation slot; an admin slot makes it a transparent proxy | Yes, by the admin, or by the owner for UUPS |
| Upgradeable proxy (EIP-1822) | PROXIABLE slot | Yes, by the owner |
| Upgradeable proxy (ZeppelinOS) | The pre-EIP-1967 slots still used by USDC on many networks | Yes, by the admin |
| Safe proxy | Safe threshold and owners answer, singleton in slot 0 | Only through a Safe transaction |
| Diamond (EIP-2535) | facetAddresses() answers | Yes, by the owner |
A ProxyAdmin contract in the admin slot is followed one step to its own owner, so the page names who actually decides.
Who controls it
| Holder | Meaning |
|---|---|
| Single account | A plain wallet (with or without an EIP-7702 delegation) holds the role |
| Safe multisig (t of n) | t of the Safe's n owners must approve each change |
| Timelock | Changes are announced and wait at least the delay shown |
| ProxyAdmin contract | A helper contract; its own owner is shown under it |
| Renounced | The owner is the zero or dead address |
| Contract | Another contract whose rules the page does not read |
The contract, its creator, owner and admins carry a name when Blockscout Metadata has a name tag for them (for example an exchange, a bridge or a protocol team's multisig). All of them are looked up in one request and kept with the page for a day. A name tag tells who an address belongs to, not whether the contract is safe.
Notes
Notes are facts, one per line, never added up into a score. Attention notes come first; neutral ones follow.
| Note | When | Tone |
|---|---|---|
| Controlled by a single account | The owner or the upgrade admin is one account | Attention |
| The code can be replaced by … | An upgradeable proxy, with the holder that can do it | Attention |
| The contract is currently paused | paused() answers true | Attention |
| Source code isn't verified | The explorer has no verified source (also for the implementation) | Attention |
| Has mint functions / can block addresses | The verified ABI has such write functions (a payable public mint does not count) | Attention |
| Blockscout: … | Blockscout marks the address as scam or tags it with a risk label | Attention |
| GoPlus: … | GoPlus flags an ERC-20 token (honeypot, sell tax, pausable transfers and the like) | Attention |
| Controlled by a Safe multisig | The holder is a Safe | Neutral |
| Changes wait at least … in a timelock (or: Changes go through a timelock) | The holder is a timelock; its delay is shown when it can be read | Neutral |
| Ownership has been renounced | Renounced owner and no upgrade path | Neutral |
| No upgrade mechanism detected | No proxy pattern and no UUPS functions | Neutral |
| Has functions that change fees | setFee / setTax style write functions | Neutral |
| Created N days ago | The contract is less than a week old | Neutral |
This is not a security review
The page describes what the code and the chain say. Verified source means the code was published and matches the deployment; it does not mean the contract does what you expect. Function names are chosen by the contract's author.
Token scan
When the contract is an ERC-20 token, the page adds a token scan below the contract cards. The browser asks for it after the page is shown; one scan per token is kept for an hour and shared by every visitor (a scan with a source that did not answer is asked again after a few minutes).
- Holders: the top ten once pools, the Uniswap v4 PoolManager, routers, lockers and burn addresses are set aside, with the share the top ten hold of the supply and of what is outside the pools. A pool is one DexScreener lists or one whose factory (a factory behind a listed pool) confirms it; a locker or router is one Blockscout names. A contract's own verified name is chosen by whoever deployed it, so a contract called TeamVesting or UniswapV2Pair is ranked like any holder and marked Unidentified contract. A Safe multisig, recognised by its code, is a wallet with several keys and is ranked as one. The creator, snipers and insiders are marked.
- Launch: the first buy (a transfer out of a pool), snipers (wallets that bought within 30 seconds of it), bundles (three or more wallets buying in one block within two blocks of the first buy), insiders (wallets handed the token by the creator or straight from the mint instead of buying it; pools and labelled exchanges, bridges and protocols set aside, and an unidentified contract counted at most at what it still holds) and the creator's transfers into a pool after the first buy.
- Trading: every pool DexScreener lists with its liquidity, a buy and sell simulation with the real taxes, and GoPlus's flags.
- Contract powers: privileged functions found in the code's function dispatcher (mint, blacklist or bot list, pause or switch off trading, change the tax, change limits, change or burn other holders' balances, upgrade). They count as live while an owner or an upgrade path exists; once ownership is renounced and nothing can upgrade the code, they are listed as inactive.
- Verdict: a score from 0 to 100 added up from the findings, with what raised it, what speaks for the token and what could not be measured.
| Source | What it gives | Networks |
|---|---|---|
| Blockscout PRO | Token record and the top 50 holders by balance | Where Blockscout PRO serves the network; not on BNB Smart Chain, Monad, Monad Testnet, HyperEVM, Abstract, Avalanche, Linea, Katana, GIWA or XRPL EVM. A token with more than 2 million holders gets no holder list, so holder concentration is not measured for it |
| Etherscan or Blockscout logs | The first 1,000 Transfer events from the creation block | The explorer the approval scanner uses on that network |
| DexScreener | Pools, liquidity, 24h volume | Networks DexScreener covers; not Arc, Shape, Plume, XRPL EVM or testnets |
| Honeypot.is | A buy and a sell simulated against a live Uniswap V2/V3-style pool | Ethereum, BNB Smart Chain and Base only |
| GoPlus | Honeypot, tax, blacklist, pause and owner flags | Networks GoPlus covers |
| The network itself | The runtime code (and the implementation behind a proxy) and totalSupply() | Every supported network |
| Blockscout Metadata | Names of the top holders (exchanges, lockers, routers) | Where Blockscout has name tags |
| The pools' factories | Whether an unlisted contract holding the token is a pool: the factory behind a DexScreener-listed pool must return it for its pair | Every supported network, after DexScreener named a pool there |
| Finding | Warns at | Dangerous at |
|---|---|---|
| Top 10 holders (pools excluded) | 50% of the supply | 80% |
| Creator holds | 10% | 30% |
| Unidentified contracts hold, together | 10% | 30% (a warning at most where no pool list could be read) |
| Snipers bought in the first 30 seconds | 5% | 20% |
| Bundled launch buys | 5% | 20% |
| Insiders handed supply | 5% | 20% |
| Creator sold into pools | 5% | 20% |
| Buy or sell tax in the simulation | 5% | 10% |
| Pool fee | 3% | 10% in the pool holding half or more of the liquidity |
| Liquidity | Under $1,000 | No pool found warns |
| Verdict | Score |
|---|---|
| High | 70 or more |
| Elevated | 40 to 69 |
| Moderate | 15 to 39 |
| Low | Under 15 |
| Not enough data | Fewer than two areas measured, or neither the simulation nor the holders measured and a score under 40 |
- The top 10 finding reads their share of the whole supply; the verdict score weighs their share of the float (the supply outside pools and burn addresses) where it can be read, with the same 50% and 80% limits.
- The launch is read from the first 1,000 Transfer events only. A token with more transfers is judged on its first 1,000; sells and transfers after them are not in the read.
- Without a holder list (networks Blockscout PRO does not serve) the holder findings and the creator's share are not measured, and the card says so.
- Functions are recognised by their standard names. A contract that renames mint or blacklist is not caught.
- A buy the router received is counted but not attributed: the wallet behind it is not in the token's own logs.
- Not part of this scan: wallet ages, liquidity removals over time, LP locks and the creator's other tokens.
A low score is not a guarantee
The verdict covers only what was measured, on the day it was read. It says nothing about the team, the logic of the code or what happens next, and it never calls a token safe. Every finding names its source and the rule that graded it so you can judge it yourself.
Contracts on the wallet page
Before a wallet analysis starts, zkCodex asks the network what the address is. A plain contract shows a banner instead of the scan, with Open contract details and Analyze as wallet anyway. Safe multisigs, ERC-4337 smart accounts and EIP-7702 wallets are scanned as wallets right away. If the check does not answer within a few seconds, the scan starts as before.