Detect unchecked low-level call vulnerabilities in Solidity where ignored return values cause silent failures, lost funds, and corrupted contract state.
Overview
Unchecked low-level calls occur when Solidity’s low-level functions (call, delegatecall, staticcall) are used without properly verifying their return values.
Failed low-level calls return false instead of reverting. If not checked, transactions appear successful while silently failing.
The Risk
Low-level calls in Solidity don’t automatically revert on failure. If the return value isn’t checked:
Funds can be “sent” but never arrive
State changes occur based on failed operations
Users lose assets without error messages
Vulnerable Patterns
Unchecked Call
// VULNERABLE: Return value ignoredfunction withdraw(uint256 amount) public { balances[msg.sender] -= amount; payable(msg.sender).call{value: amount}(""); // Silent failure!}
Unchecked Delegatecall
// VULNERABLE: Delegatecall without checkfunction upgrade(address impl) public onlyOwner { impl.delegatecall(abi.encodeWithSignature("initialize()"));}
Unchecked Transfer
// VULNERABLE: ERC20 transfer without checkfunction distribute(address token, address[] memory recipients) public { for (uint i = 0; i < recipients.length; i++) { IERC20(token).transfer(recipients[i], 100); // May fail silently }}