Description
ConfidencePool allows the moderator to correct a typo'd outcome before any participant claims (claimsStarted = false). However, sweepUnclaimedBonus() can be called in this same window — it sweeps the bonus to recoveryAddress AND sets totalBonus = 0, but intentionally does NOT set claimsStarted = true.
If the moderator then re-flags to good-faith CORRUPTED, flagOutcome() snapshots the current totalBonus (now 0) to calculate bountyEntitlement:
bountyEntitlement = snapshotTotalStaked + snapshotTotalBonus = stake + 0
The whitehat attacker receives only the staked principal — the entire bonus pool has been permanently sent to recoveryAddress and is unrecoverable.
Likelihood:
Requires moderator to flag wrong outcome first (typo/mistake)
sweepUnclaimedBonus() must be called before the correction
Moderator must then re-flag to good-faith CORRUPTED
Sequence is rare but realistic in production
Impact:
Whitehat attacker receives only staked principal, losing entire bonus
In a $100K bonus pool: whitehat loses$100,000 permanently
Bonus tokens are sent to recoveryAddress and cannot be reclaimed
Verified: 90% bounty loss in Scenario 3 (10,000 received vs 110,000 owed)
Run: forge test --match-test test_M02_Scenario3_LargePool_EconomicImpact -vvv
Attack steps:
Alice stakes 10,000 tokens, Carol contributes 100,000 bonus
Moderator flags SURVIVED (no risk window — riskWindowStart = 0)
Anyone calls sweepUnclaimedBonus() — sweeps 100,000 tokens to recoveryAddress, totalBonus = 0
Moderator re-flags to good-faith CORRUPTED (allowed: claimsStarted = false)
bountyEntitlement = 10,000 + 0 = 10,000 (instead of 110,000)
Whitehat receives 10,000 tokens — loses 100,000 tokens (90%)
Forge output:
Recommended Mitigation
sweepUnclaimedBonus() should set claimsStarted = true when sweeping
a non-zero amount. A sweep is a value-movement event that permanently
removes tokens from the pool — it should close the moderator's re-flag
window exactly like a claim does.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.