flagOutcome may be re-flagged before the first claim so the moderator can fix a typo'd or premature outcome "before any participant locks in the wrong distribution" (docs/DESIGN.md §4), and §4 states finality is "correctly tied to value movement" via the claimsStarted latch. On a good-faith CORRUPTED re-flag the whole pool (stake + bonus) is re-snapshotted as the named whitehat's bountyEntitlement.
sweepUnclaimedBonus() moves real contributed bonus out of the pool to recoveryAddress but intentionally does not set claimsStarted. When a SURVIVED outcome was flagged with riskWindowStart == 0 (the correctable mis-flag §4 exists for), the reserve calculation excludes the bonus, so a permissionless sweep drains the entire snapshotTotalBonus to recoveryAddress and zeroes totalBonus while the correction window stays open. The moderator's later re-flag to good-faith CORRUPTED then re-snapshots a depleted pool — bountyEntitlement collapses to principal-only — so the named whitehat permanently loses the entire bonus. §4's own "because" (finality is tied to value movement) is false here: value left, yet the re-flag is still honored and cannot restore the whitehat's entitlement.
Likelihood:
The moderator flags SURVIVED on a genuinely in-scope CORRUPTED agreement with riskWindowStart == 0 — exactly the premature/typo mis-flag the re-flag correction window exists to fix (not an "evil admin", the documented correction scenario).
A permissionless griefer calls sweepUnclaimedBonus() in that window, draining the whole bonus to recoveryAddress before the moderator re-flags the correct good-faith CORRUPTED.
Impact:
The named good-faith whitehat, who performed the in-scope breach, permanently loses the entire bonus pool — it is diverted to recoveryAddress (which the sponsor controls, so the sponsor can harvest it) instead of paid as the bounty.
The re-flag correction feature is rendered incomplete: the moderator can restore the correct CORRUPTED outcome but cannot restore the whitehat's bonus, because value already left through a path that did not latch finality.
Tie finality to this value movement too: when sweepUnclaimedBonus moves accounted bonus (not merely a post-flag donation), latch claimsStarted so a later re-flag cannot silently under-pay the whitehat; equivalently, block the sweep until the correction window is closed.
Impact – Medium Up to the entire bonus pool can be routed to the wrong party for good, with no on-chain way to unwind it, and in a stakerless pool the effect is total since bountyEntitlement computes to zero and claimAttackerBounty reverts outright. This impact is definitely not High: the pool stays solvent throughout with no principal ever at risk, and the money ends up at the sponsor's own recoveryAddress, which in most pools means a sponsor recovering a bonus they funded themselves. The whitehat's claim on that bonus also only exists because the moderator changed their mind after the fact. Likelihood – Low Four separate things have to coincide: nobody touches the pool for the whole active-risk window (or there are no stakers to begin with), the moderator flags SURVIVED and later reverses to CORRUPTED, that reversal is good-faith with a named attacker, and a sweep lands between the two flags. The first cuts against staker self-interest, since skipping the poke costs them their entire bonus share, and the second asks the moderator to overturn a scope judgement, which is a bigger deal than the typo fix DESIGN.md #4 offers the window for. The sweep itself I'd treat as near-certain once the rest holds, given it's permissionless and the sponsor has an obvious reason to make the call, but assembling the first three in one pool lifecycle is where this stays rare.
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.