Normal behavior per the README / design docs is that the moderator may re-flag a correction until the first claim, with finality tied to value movement.
The issue is that claimExpired() sets claimsStarted = true during mechanical auto-resolution even when the caller has userEligible == 0 and receives no payout. That means any non-staker can finalize the pool after expiry and permanently close the moderator’s correction window before any real claim occurs.
Likelihood:
any address can call claimExpired() once the pool expires
The issue occurs during routine post-expiry resolution, before any staker necessarily interacts
Impact:
The moderator loses the documented ability to correct the outcome until the first real claim
An incorrect auto-resolved outcome becomes final without any value movement, breaking the protocol’s stated finality rule
Use the regression test added during the audit:
Steps to run:
cd confidence-pool
forge test --match-test testZeroStakeCallerClosesReflagWindowBeforeAnyClaim -vv
Expected outcome:
The test passes
A non-staker calls claimExpired()
They receive no payout and do not become a claimant
claimsStarted is still flipped to true
A later moderator correction reverts with OutcomeAlreadySet
Only latch claimsStarted when value actually moves or when the caller has a real claim.
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.