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.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.