Skip to content

Return Value of send() Ignored

SAFE-0310 External Calls Checked automatically by the scanner
1

What goes wrong

address.send() returns a boolean that is discarded. send() does not revert on failure, so a failed transfer is treated as success and the contract advances its state (marks paid / burns the claim) while no ETH actually moved.

2

The vulnerable pattern

proof of concept — how it is exploited
// to.send(amount);           // returns false on failure, ignored
// paid[user] = true;          // state says paid, but nothing was sent
// recipient's receive() reverts -> user loses the payout permanently.
3

How to fix it

the pattern that is safe
(bool ok, ) = payable(to).call{value: amount}("");
require(ok, "transfer failed");   // or check send()'s return and revert
Check send()'s return, or use call{value:} + require.
Check your own contract for this

The SaferICO scanner runs 201 detectors over your Solidity source, SAFE-0310 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