A contract passes execution to a user-supplied callback or arbitrary target inside a sensitive flow (flash loans, hooks, plugins). The callback re-enters protocol functions that assume the outer call has completed.
function flashLoan(address receiver, uint256 amt) external nonReentrant {
uint256 before = token.balanceOf(address(this));
token.transfer(receiver, amt);
IReceiver(receiver).execute();
require(token.balanceOf(address(this)) >= before, "not repaid");
}
Largest recorded losses in the same failure class — related, not the same bug:
The SaferICO scanner runs 201 detectors over your Solidity source, SAFE-0005 among them. Paste an address or the source itself — a small per-scan fee, shown before you sign, or unlimited on any plan.