REVERT is a bytecode-only Tier-1 risk pre-filter — calibrated to agree with Slither's contract-level signal, but running on the unverified contracts Slither can't open — to triage which contracts a human or a Slither/Mythril stack should review first. It is a triage signal, not an audit, and it is complementary to Slither, never a replacement. This page explains exactly how the score is produced, how to read it, and — most importantly — what it does not do. If you take one thing away: treat a high score as a reason to look harder, and never treat a low score as proof of safety.
[0, 1] — how strongly the bytecode shape resembles the patterns
Slither flags (high = review priority, low does not mean safe). Served model:
XGBoost, binary any-vulnerability F1 = 0.948 (95% bootstrap CI [0.944, 0.951],
B=1000) on 11,670 held-out Slither-labelled contracts — agreement-with-Slither
on held-out data, not ground truth. Method submitted to ICICPE 2026 (open
preprint + data).| Bucket | Means | Do |
|---|---|---|
| high surface review priority > 0.85 | The bytecode strongly matches the patterns associated with vulnerable contracts in training. A review-priority signal, not a confirmed bug — complex, audited infra (DEX routers, aggregators) also scores high. | Route to manual review / deeper tools first. This is where to look, not what is broken. |
| elevated 0.3–0.85 | Ambiguous. Mixed signals. | Review if the contract matters to you. |
| low-risk < 0.3 | Only that no known bytecode-risk pattern fired. Not a statement that the contract is safe. | Do not interpret as "safe". Audit anyway if value is at stake. |
It cannot evaluate oracle logic, liquidation/AMM math, access-control intent, governance, upgrade paths, MEV, or cross-contract invariants. Most large DeFi losses live in logic, which a single contract's runtime bytecode does not encode.
A proxy's own bytecode is tiny and benign-looking, so a proxy address can score low while its implementation scores high. REVERT now detects EIP-1967/1822/1167 proxies and also scans the implementation, showing a banner — but always confirm you scanned the contract that actually holds the logic. If you only scan the proxy, you can get false comfort.
A boundary of the method, by design — not a bug. The Euler-related eDAI address
0xe025…D9DC scores low-risk despite figuring in the Euler
incident: the exploitable condition lived in proxy-routed module logic that a single
contract's runtime bytecode does not encode — no bytecode-only tool can see logic that
isn't in the bytecode. We report these boundaries openly; treat low-risk on complex,
proxy-routed protocols with appropriate scepticism, and lean on proxy→implementation
resolution.
Use REVERT alongside, never instead of: proxy→implementation resolution, owner/admin/role inspection, upgradeability review, verified-source reading, transaction-history and incident lookup, and Slither / Aderyn / Foundry tests / manual review.
F1 0.948 is agreement with Slither on verified contracts (the held-out set has source, so Slither can label it). The product runs on the unverified ~95%, where there is no Slither ground truth to measure against — a structural distribution shift. The signal is expected to transfer because the features are compiler/opcode-level (same solc → similar bytecode), but we do not yet publish a direct out-of-domain validation. Until we do, read the score as attack-surface / complexity triage — which our own Slither head-to-head confirms it behaves as (audited blue-chips and an exploited bridge can score alike) — rather than a calibrated vulnerability probability on unverified code. A direct out-of-domain study on later-verified contracts is on the roadmap.
score ≥ 0.85 → route to manual review (the high-risk band).The public "recent scans" feed is address-anonymized: each address is replaced with a salted, non-reversible hash before it leaves the server, so a scan never reveals which contract you looked at. Anonymous demo scans are logged without identity; signed-in scans are tied to your account for quota only. See /privacy.
Paper, feature extractor, dataset reference, and the trained model are public: GitHub. The live API is documented at /api/scan (GET returns a usage reference; POST scores). Status: /status.
Questions or a sample report? Contact us.