Pot.closePot distributes the manager's cut and the claimants' cut out of remainingRewards, but never resets remainingRewards (or any other state) once it's done, and has no "already closed" guard:
Once the 90-day window has passed, closePot() can be called again — and again — and each call re-distributes the exact same remainingRewards figure, transferring the manager cut and every claimant's cut out of the pot's actual token balance a second, third, etc. time, until the pot is out of funds.
Likelihood: High
No special conditions: any call to closePot() after the first one reproduces the bug. ContestManager.closeContest is a thin, unguarded onlyOwner wrapper around it.
Impact: High
Real funds leave the pot on every repeat call — draining the pot's actual token balance beyond what remainingRewards was ever supposed to distribute, until the underlying ERC20 balance is exhausted.
Calling closeContest twice pays the manager's cut twice, from the same remainingRewards figure that was never reset:
Track closed state and reset the distributable amount:
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.