The contract pays out to many addresses inside a single loop. One recipient that reverts (a contract with a reverting receive, or an out-of-gas fallback) makes the whole loop revert, so nobody can be paid — a griefing or fund-freeze vector.
// for (uint i; i<winners.length; i++) winners[i].transfer(prize); // attacker registers a contract whose receive() { revert(); } // now every payout tx reverts -> prizes are frozen for everyone.
// pull over push: let each user withdraw their own share
mapping(address => uint256) public owed;
function withdraw() external {
uint256 a = owed[msg.sender]; owed[msg.sender] = 0;
(bool ok,) = msg.sender.call{value: a}(""); require(ok);
}
The SaferICO scanner runs 201 detectors over your Solidity source, SAFE-0124 among them. Paste an address or the source itself — a small per-scan fee, shown before you sign, or unlimited on any plan.