An upgradeable/inheritable base contract declares state but no __gap storage reservation. Adding a variable to the base in a later version shifts every child's storage slots, silently corrupting all existing data after the upgrade.
// V1 base: { uint a; } child: { uint b @ slot1 } // V2 base: { uint a; uint c; } -> child.b now reads slot2 // every stored b is misread; balances/owners scrambled after upgrade.
// reserve slots so future base variables don't collide with child storage
uint256[50] private __gap;
Largest recorded losses in the same failure class — related, not the same bug:
The SaferICO scanner runs 201 detectors over your Solidity source, SAFE-0128 among them. Paste an address or the source itself — a small per-scan fee, shown before you sign, or unlimited on any plan.