The contract defines a nonReentrant guard but at least one external state-changing function that makes value transfers is missing it. Attackers re-enter through the unguarded function, bypassing the protection the guard implies.
// withdraw() is nonReentrant, but claim() (also sends ETH) is not. // attacker re-enters via claim() during the external call, draining funds // the guard was meant to protect.
// apply nonReentrant to ALL external functions that move value / mutate // shared state, not just the obvious withdraw().
Largest recorded losses in the same failure class — related, not the same bug:
The SaferICO scanner runs 201 detectors over your Solidity source, SAFE-0305 among them. Paste an address or the source itself — a small per-scan fee, shown before you sign, or unlimited on any plan.