Smart contract security
Prove your contracts are safe from bugs.
Solbend checks every way an attacker could drain your contracts. You get a proof, or the exact line to fix, without having to write any lemmas yourself.
01What we solve
Smart contract audits are hard, expensive, and not definitive.
Everyone finds out the hard way.
125 months 797 exploits $5.57B lost $44M a month
Drained by hackers since 2016
−$5.57B
797 incidents across 7 bug classes
Access control
A function that should have been locked was callable by anyone.
Table
| Stolen | |
|---|---|
| Poly Network | $611M |
| Parity Multisig | $150M |
| UPCX | $70M |
| Munchables | $62.5M |
| Parity Wallet | $30M |
| Wintermute | $17.6M |
Total drained
−$1.24B
193 incidents since 2016
Amounts from the DefiLlama hacks database, on EVM chains since 2016, by its primary class, plus a few large attacks the database misses, recorded by hand from the reports. Incidents link to rekt.news where its archive covers them and to the project's own report where it does not.
02Why Solbend
Scanners only flag. We can prove.
Other scanners match patterns and leave you to review the noise. Other provers need experts to write specs by hand. Solbend proves or disproves safety for you.
| Other Scanners | Solbend | |
|---|---|---|
| When code is safe | Nothing matched a known pattern | Proven safe |
| When code has a bug | Review it by hand | Unproven, with attack if one exists |
| On safe code that looks risky | Often flagged as a false positive | Proven safe |
Tested on four public research datasets
SmartBugs curated (143 contracts), SolidiFI (50 contracts), Not So Smart Contracts (25 contracts) and Consolidated Ground Truth (1422 contracts), the public benchmarks researchers use to measure security tools.
188 /237- vulnerable contracts caught
- 0
- marked safe by mistake
100% - of exploitable planted bugs found
Vulnerable contracts caught
Contracts the datasets call reentrant. Green is a contract the dataset called safe that Solbend proved reentrant, each attack written out and checked on a test chain.
- Caught
- Proven safe, label disputed
- Not checked
- Marked safe
Table
| Caught | Proven safe, label disputed | Not checked | Marked safe | Total | |
|---|---|---|---|---|---|
| SmartBugs curated | 31 | 0 | 0 | 0 | 31 |
| SolidiFI | 50 | 0 | 0 | 0 | 50 |
| Not So Smart Contracts | 3 | 0 | 0 | 0 | 3 |
| Consolidated Ground Truth | 104 | 35 | 14 | 0 | 153 |
Safe contracts proven safe
Contracts the datasets call safe, plus generated variants built to be safe. A flag on one is a false alarm, or a pattern Solbend cannot prove yet. Green is a contract the dataset called safe that Solbend proved reentrant, each attack written out and checked. Of the 432 generated variants that are not safe, every one is flagged.
- Proven safe
- Flagged, found reentrant (label disputed)
- Flagged
- Not checked
Table
| Proven safe | Flagged, found reentrant (label disputed) | Flagged | Not checked | Total | |
|---|---|---|---|---|---|
| Consolidated Ground Truth (labelled safe) | 1,115 | 19 | 58 | 77 | 1,269 |
| Generated variants (safe by construction) | 1,060 | 0 | 8 | 0 | 1,068 |
Planted bugs found, by tool
389 exploitable reentrancy bugs planted across 50 real contracts, found by each tool.
Table
| Found | Total | |
|---|---|---|
| Solbend | 389 | 389 |
| Slither | 389 | 389 |
| Oyente | 335 | 389 |
| Securify | 326 | 389 |
| Mythril | 258 | 389 |
| SmartCheck | 0 | 389 |
Every bug class, not just reentrancy
Solbend can catch different kinds of bugs. Slither has no check at all for 6 of these classes. Mythril has none for 8. Solbend covers every bug class, and where it can, it proves whether the code is safe or not.
| Bug class | Mythril | Slither | Solbend | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Re-entrancySolidiFI line-level, 389 exploitable planted bugs | 66% | 100% | 100% | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| Access controlprivileged code callable by anyone | 31% | 31% | 100% | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| Owner trust / rugpullowner can take user value or access | no check | no check | 48% | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| Arbitrary storage writea write reaches any storage slot | 70% | 40% | 50% | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| Controlled delegatecallcaller chooses the code that runs | 89% | 100% | 100% | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| Unprotected initializeranyone can set the authority | 0% | 30% | 80% | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| Uninitialized storage pointera write lands at slot zero | no check | 100% | 90% | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| Upgrade storage collisionan upgrade moves a live slot | no check | 100% | 100% | ||||||||||||||||||||||||||||||||||||||||||||||||||||
Show all 21 classes
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||
The 20 classes are the labelled datasets/classes matrix, run 2026-10-24. Slither 0.11.6 and Mythril 0.24.8 at default settings. The Re-entrancy row is SolidiFI line-level, Mythril from the SolidiFI paper (2020). Solbend's figures are the published 2026-10-24 snapshot.
Method
- Measured on the public research datasets above and the labelled class matrix (
datasets/classes, 437 contracts, 231 buggy and 206 safe), 2026-10-24. A buggy contract counts as caught when a finding of its class lands in the vulnerable function, or in a function it calls internally. For declaration classes a finding anywhere in the contract counts. - A safe contract Solbend proves reentrant is counted in green, and every one of those proofs was reviewed by independent auditors and attacked on a test chain. Where a dataset label relies on a low-gas payout, an owner-chosen address or a contract the code creates, the report names it.
- Slither 0.11.6 and Mythril 0.24.8 run at default settings. A dash in the table means a tool has no check for that class. Solbend's class figures are the published 2026-10-24 snapshot.
03How it works
A proof, or a precise warning.
Solbend writes the proof itself, nothing for you to write. If it cannot prove a contract safe, it shows exactly where, and on Professional it then hunts for a real attack.
- Proven
- Re-entering reaches only states that plain transactions reach. Each proof is rechecked by Bend's kernel, proven consistent in Lean.
- Not proven
- No proof and no confirmed attack. You see where the proof breaks, to review by hand.
- Attack found
- A confirmed bug, on Professional. Z3 finds the attack, Bend and Lean confirm it.
A contract that uses code Solbend cannot model yet gets no verdict.
$ solbend examples/BankDAO.sol
Reentrancy: NOT PROVEN
✗ State changed after other code gets control
withdraw calls out at BankDAO.sol:16
then BankDAO.sol:18: balances[msg.sender] = 0
✓ Call no untrusted code
deposit
Invariants: PROVEN without reentrancy
✓ sum(balances) <= balance
Counterexample: FOUND (bend checked it: CEX.bend proves reentrancy_safe false)
deployed constructor(), by 0x1
0x3 deposit(), sending 1 wei
0x1 deposit(), sending 1 wei
0x3 withdraw()
BankDAO.sol:16 sends 1 wei to 0x3, which calls back:
0x3 withdraw()
BankDAO.sol:16 sends 1 wei to 0x3
sum(balances) <= balance fails there, and every plain transaction keeps it:
before sum(balances) = 2, balance = 2
after sum(balances) = 1, balance = 0
$ solbend examples/BankCEI.sol
Reentrancy: PROVEN (bend checked the proof)
any state that reentrant calls can reach, plain transactions reach too
✓ Call no untrusted code
deposit, transfer
✓ Change no state after other code gets control (checks-effects-interactions)
withdraw calls out at BankCEI.sol:23
Invariants: PROVEN
in every state reachable from deployment, with or without reentrancy
✓ sum(balances) <= balance
Who can change what (each restriction proven)
balances deposit (only the caller's entry), transfer, withdraw (only the caller's entry)
Funds never stuck
✓ balances: withdraw lowers any positive entry of its caller
Every proof and every attack is double-checked by an independent checker.
04Pricing
Pay per scan, or per repository.
Limited offer
Your first scan is free.
Ends in
Starter
$199per scan
For public repositories.
- One contract on main branch
- Download proof files as .tar.gz
- Public repositories only
Professional
$999/month per repo
For smart contract developers and crypto projects.
- Every contract on any branch
- Finds attack counterexamples
- Private repositories
- CI integration
Enterprise
Custom
For auditing firms, security researchers and teams with many projects.
- Everything in Professional
- Volume pricing
- No-source bytecode scan
- Priority support
05FAQ
Questions, answered.
Do I need to write specs or proofs?
No. Unlike Certora prover, Solbend generates invariants and proofs automatically. You just connect a repository and pick a branch.
What does Solbend check?
It specializes in reentrancy and checks it in depth. Scans also cover overflows, access control, stuck funds, denial of service, front-running, ERC-20 rules and who can upgrade, and flag risky patterns such as tx.origin checks, weak randomness and unchecked calls.
What if Solbend cannot prove a contract as safe?
Solbend will say so, because it never assumes safety. The result is Not proven, with where the proof breaks. On Professional, Solbend also searches for a real attack, and when it confirms one the result is Attack found, with every call step by step.
Can I check a proof myself?
Yes. Download a scan's .tar.gz proof files and check them with Bend on any machine. With --verdict, Bend's kernel, whose logic is proven consistent in Lean, rechecks them too.
Which Solidity versions are supported?
Solidity 0.4.11 and newer.
Does Solbend support Vyper?
Yes, Vyper 0.2.16 and newer. Solbend proves a Vyper contract from the bytecode Vyper compiles, and replays any attack it finds on that same bytecode. A contract that uses delegatecall is not supported yet, because the code it runs is not known until the call happens.
Are Foundry and Hardhat projects supported?
Yes. Solbend detects a Foundry or Hardhat project and installs its git submodules and npm packages in an isolated sandbox before the scan. Setup commands from a .solbend.yml, or saved for the repository on the dashboard, run there too. Tested on OpenZeppelin, Uniswap v3 and v4, Aave v3, Safe, Compound, Morpho, Solady and Solmate.
Can I run Solbend in CI?
Yes. Install the Solbend GitHub App to get a check on every pull request, or run the solbend-ci command (npx @encribe/solbend-ci) or the encribe/solbend-action GitHub Action from any CI on Professional.
Get Started
Only scan your own repositories. Scanning other code is against our ToS.