corruptedClaimDeadline is computed as _firstGoodFaithCorruptedAt + CORRUPTED_CLAIM_WINDOW (180 days) and stored as uint32, with no bounds check before the cast. The contract guards its other three uint32 timestamp casts this way — expiry at both initialize() and setExpiry(), and riskWindowStart/riskWindowEnd via an explicit if (t > expiry) t = expiry; clamp — but this fourth cast site has neither a clamp nor a revert, only an inline comment acknowledging the gap.
If _firstGoodFaithCorruptedAt falls within 180 days of type(uint32).max (2106-02-07), the sum overflows uint32 and the explicit downcast silently wraps rather than reverting, since Solidity's overflow checks apply to arithmetic operators, not narrowing casts.
Likelihood:
Occurs whenever a pool's expiry and its first good-faith CORRUPTED flag both land within roughly the final six months of the uint32 range — a state already exercised for unrelated purposes in the shipped test suite, but far off in calendar time from current deployments.
Impact:
The named whitehat's claimAttackerBounty() reverts on the first attempt, permanently losing their entitled bounty.
The 180-day exclusivity window collapses to zero — sweepUnclaimedCorrupted() becomes callable by anyone immediately, defeating the good-faith incentive.
The PoC reuses the identical near-uint32-ceiling setup already present in the shipped test suite (testQuadraticHoldsAtUint32TimestampCeiling), deploying a pool with expiry one second below the ceiling, staking, sealing the risk window, then flagging good-faith CORRUPTED at that boundary. It asserts corruptedClaimDeadline is now less than block.timestamp — proving the wrap — then shows the named attacker's claim reverts ClaimWindowExpired, and immediately after, sweepUnclaimedCorrupted() succeeds with no wait, confirming the exclusivity window is gone.
Add the same bounds-check-before-cast pattern already used at the expiry cast sites, reverting instead of wrapping when the deadline would exceed type(uint32).max.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
View preliminary resultsAppeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.