What this category covers
Every external call in Solidity hands control to code the original contract does not own. The category covers five common failure patterns:
-
Reentrancy via callbacks (ERC-777, ERC-721/1155 receivers, ERC-4626, flash-loan callbacks).
-
Silent failures from ignored return values.
-
Arbitrary code execution via user-supplied addresses.
-
State-after-call ordering - the classic reentrancy window.
-
Unsafe
delegatecallto untrusted code.
2025 incidents
-
GMX V1 (Jul 2025) lost $42M because
executeDecreaseOrdertransferred control to an attacker-supplied address during refund, and state updates happened after the external calls. OWASP cross-references this with SC03 and SC08. -
Arcadia Finance (Jul 2025) lost $3.5M because
SwapLogic._swapRouter()andRebalancerSpotallowed arbitrary external calls to user-supplied router addresses without callee validation.
How AI auditors handle this category
AI tools handle the canonical patterns well - missing return-value checks, low-level call to user-supplied address, missing reentrancy guard. The remaining gap is callbacks: callee identity validation in routers, hooks, and flash-loan recipients. SCH's /attacks/reentrancy walks through the canonical examples that often appear in this category.