Smart contract security

Prove your contracts are safe from reentrancy.

solbend checks every way an attacker could gain control of your Solidity code. You get a proof, or the exact line that breaks the assumptions. Fully automatic, with no specs or lemmas to write.

$458M drained from crypto projects by reentrancy since 2016

01What we solve

The oldest vulnerability in Solidity language is still unsolved.

Reentrancy is like an ATM that hands you cash before updating your bank balance, allowing a fast thief to keep asking for withdrawals mid-transaction until all the funds are gone. It has happened 63+ times since 2016.

The largest reentrancy attacks

Value stolen at the time. Each name links to the incident's write-up.

−$80M
Curve 2023, Vyper compiler bug
−$69.3M
The DAO 2016
−$60M
GMX 2025, most funds returned
−$42M
−$30M
Penpie 2024
−$27M
−$25M
−$18.8M
−$8M
−$7.2M
−$4.2M
Table
Stolen
Fei Rari$80M
Curve$69.3M
The DAO$60M
GMX$42M
Grim Finance$30M
Penpie$27M
Lendf.Me$25M
Cream Finance$18.8M
Agave and Hundred Finance$11.7M
Origin Protocol$8M
BurgerSwap$7.2M
Conic Finance$4.2M
Voltage Finance$4M
dForce$3.7M
EraLend$3.4M
Orion Protocol$3M
Stars Arena$2.9M
Solv$2.7M
Revest Finance$2M
Akropolis$2M
GemPad$1.9M
Sovryn$1.1M
Sturdy Finance$0.8M
Midas Capital$0.7M
Clober$0.5M

Sources: rekt.news leaderboard, with The DAO and Lendf.Me from CoinDesk and Decrypt. Totals from the DeFiLlama hacks database.

02Why we're better

Scanners only flag. We can prove.

Scanners like Slither are fast and cover many bug types. solbend goes beyond static analysis and can prove absence or presence of bugs. Other formal tools can prove too, but need experts to write specs by hand, while solbend does it automatically.

Scanners compared with solbend
Other Scannerssolbend
When no issues are foundNothing matched a known patternProven safe
When an issue is foundReview it by handThe exact line, and the attack if one exists
On safe code that looks riskyOften flagged as false positiveCleared
CoversMany bug types, in secondsReentrancy, in depth, in minutes

Tested on three public research datasets

SmartBugs curated (143 contracts), SolidiFI (50 contracts) and Not So Smart Contracts (25 contracts). Collections of known-vulnerable contracts that researchers use to measure security tools.

84/85
vulnerable contracts caught
0
marked safe by mistake
97%
of exploitable planted bugs found

Vulnerable contracts caught

Contracts each dataset lists as open to reentrancy.

  • Caught
  • Not checked
  • Marked safe
SmartBugs curated
100% 31/31
SolidiFI
98.0% 49/50
Not So Smart Contracts
100% 4/4
Table
CaughtNot checkedMarked safeTotal
SmartBugs curated310031
SolidiFI491050
Not So Smart Contracts4004

Planted bugs found, by tool

389 exploitable reentrancy bugs planted in 50 real contracts (SolidiFI).

Slither
100% 389/389
solbend
97.4% 379/389
Oyente
86.1% 335/389
Securify
83.8% 326/389
Mythril
66.3% 258/389
SmartCheck
0% 0/389
Table
FoundTotal
Slither389389
solbend379389
Oyente335389
Securify326389
Mythril258389
SmartCheck0389

Every bug class, not just reentrancy

SolidiFI plants seven bug types across these 50 contracts. Share of planted bugs each tool catches, scored line by line. solbend and Slither both re-run locally (2026-10-10).

Detection rate by bug class
Bug classSlithersolbend
Re-entrancy (re-enterable .call bugs)100%97%
Overflow-Underflow0%30%
TOD0%100%
Timestamp-Dependency82%100%
Unchecked-Send100%100%
Unhandled-Exceptions67%100%
tx.origin100%100%
Method
  • solbend ff7351a, 2026-10-10, default settings. 212 of 218 contracts could be checked. Not So Smart Contracts' DAO.sol predates Solidity 0.4 and runs with --port-legacy.
  • Datasets:SmartBugs curated 230e649 (140 of 143 checked), SolidiFI 4b0573e (49 of 50 checked), Not So Smart Contracts 020dbdb (23 of 25 checked).
  • Slither was re-run locally (2026-10-10) and finds every planted bug. The other tools' numbers are the reports published with SolidiFI (2020), scored the same way (a bug counts as found when the report points inside it); Oyente, Securify, Smartcheck and Manticore are unmaintained, so those remain current.
  • Across all seven SolidiFI bug classes, solbend and Slither were both re-run locally (2026-10-10); the table above is the share of planted bugs each catches, scored line by line. Slither has no detector for integer overflow or transaction ordering on these pre-0.8 contracts, so it scores zero there. Mythril, a bounded symbolic executor, is slow and timeout-sensitive: the 2020 SolidiFI paper measured it at 66% on reentrancy, and it flags none of these overflow patterns even with a generous budget.
  • Counting all 1,343 planted bugs, solbend finds 28% and Slither 100%. The other 954 use send() or transfer(), which pass too little gas to call back in, so solbend treats them as safe. Manticore was tested on a different set and is not shown.
  • Not checked:parity_wallet_bug_2.sol (model too large for Bend to check), 0x663e…14c3.sol (assigns a fixed-size array struct member), buggy_24.sol (emitter stack overflow), list_dos.sol (does not compile on any 0.4 solc).

03How it works

A proof, or a precise warning.

solbend writes the proof itself, with no annotations from you. If it cannot prove a contract safe, it shows exactly where, then looks for a real attack.

Proven safe
A checked proof that calling back in reaches nothing normal use could not already reach.
Not proven
solbend could not prove it. You get the function, the external call and the state it changes afterwards.
Attack found
solbend then searches for a real attack. When one exists, you get every call, step by step.

A contract that uses code solbend cannot model yet gets no verdict. That was 6 of 218 in testing.

exit 1
$ 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 other 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

Every proof and every attack is double-checked by an independent checker.

04Pricing

Pay per project.

Enterprise

Custom

For auditing firms and teams with many projects.

  • Everything in a project scan
  • Volume pricing
  • Your own rules, proven
  • Runs in your own infrastructure
  • Priority support
Contact us

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 accounting, access control, stuck funds and upgrades.

What if it cannot prove a contract safe?

It says so. It never assumes safety. You get the function, the external call and the state it changes afterwards, and a real attack when one exists.

Can I check a proof myself?

Yes. Download a scan's .tar.gz proof files and run them with Bend's formal verification on any machine.

Is my code safe with solbend?

solbend only reads repositories you administer. Your code is never run.

Which Solidity versions are supported?

Solidity 0.4.11 and newer.

Check your contracts.

Only your own repositories. Your code is never run.