Skip to content

Unchecked Low-Level Call Return Value

SAFE-0131 External Calls Checked automatically by the scanner
1

What goes wrong

The boolean success flag from a .call / .send is discarded. A failed transfer or external call is treated as success, so the contract updates state (marks a payment made, a withdrawal complete) even though the value never moved.

2

The vulnerable pattern

proof of concept — how it is exploited
// to.call{value: amt}("");            // return value ignored
// paid[user] = true;                     // marked paid even on failure
// recipient's receive() reverts -> no ETH sent, but state says 'paid'.
3

How to fix it

the pattern that is safe
(bool ok, ) = payable(to).call{value: amount}("");
require(ok, "transfer failed");
Always require() the success flag of a low-level call.
Check your own contract for this

The SaferICO scanner runs 201 detectors over your Solidity source, SAFE-0131 among them. Paste an address or the source itself — a small per-scan fee, shown before you sign, or unlimited on any plan.

Run the scanner See how it is attacked Read the docs