On-chain contract risk score: detects upgradeable proxies and privileged functions from live bytecode. Use before trading/interacting with an unfamiliar contract.
How the score works
Every scan reads the contract's live bytecode and the EIP-1967 proxy
storage slot, then adds a weight for each risk signal it finds. The total
is riskScore; riskLevel is just that total sorted
into a band.
| Level | Score | Reading |
| low | 0–9 | No centralised-control signals found. |
| medium | 10–29 | Privileged functions or upgradeability present. |
| high | 30+ | Several powerful owner capabilities at once. |
| unknown | — | No code at this address (a wallet, or not deployed yet). |
A high score is not proof of a scam, and a
low score is not a safety guarantee. Plenty of legitimate tokens are
pausable and mintable by design — the score tells you how much power
the owner holds, so you can decide whether you trust whoever holds it.
What each signal adds
| Signal | Weight |
| Upgradeable proxy (EIP-1967 implementation slot is set) | +10 |
owner() | +5 |
transferOwnership(address) | +5 |
mint(address,uint256) | +15 |
pause() | +10 |
blacklist(address) | +20 |
setBlacklist(address,bool) | +20 |
excludeFromFee(address) | +5 |
setTaxFee(uint256) | +15 |
Maximum possible score is 105. Function detection
searches the bytecode for each function's dispatcher pattern, so it can
under-report on heavily optimised or obfuscated contracts, and proxy
detection currently only reads the EIP-1967 slot — contracts using
older proxy layouts (USDC among them) are reported as
isProxy: false. Treat this as one signal among several, not a
verdict.
Response fields
riskLevel- Band from the table above: low, medium, high, or unknown.
riskScore- Sum of the weights of every signal found.
isContract- Whether the address has bytecode. False means a wallet or an undeployed address.
isProxy- Whether the EIP-1967 implementation slot is set, meaning an admin can swap the contract's logic.
flags- Each signal found, as a human-readable
label and its weight.
address, chain- Echoed back so a stored result is self-describing.
note- Only present when there is no code to analyse.