Normal behavior: The claim period is 90 days. After it elapses the owner closes the pot: the manager takes the cut, the remainder goes to timely claimants, and the pot is done — late players forfeit, and no further claims or closures can occur.
The issue: The program has no closed/terminal state at all:
claimCut only checks that the caller has a reward — never that the claim period is still open. A player who never claimed within 90 days can call claimCut after closePot and still withdraw their full reward whenever enough tokens remain in the pot.
closePot updates no state: it does not set a flag, does not zero remainingRewards, and does not clear the payout. It can be called any number of times; each call with a sufficient balance moves another remainingRewards / 10 to the manager, so the "manager cut" is not a one-time 10% but a repeatable drain (worst case with zero claimants: repeated closes move 10% of the original remainder each time until the pot is nearly empty).
Root cause in src/Pot.sol:
Likelihood:
Reason 1 — The 90-day "claim or forfeit" rule is enforced nowhere; a late player who notices the pot still holds funds can claim at any later time with a single transaction.
Reason 2 — closePot is callable by the owner repeatedly whenever the balance covers the cut, with no terminal state to stop it.
Impact:
Impact 1 — The forfeiture mechanic (the entire point of the 90-day window) is bypassable: late claims succeed after closure, so the remaining-pool math can be upset after the split already ran.
Impact 2 — No state is ever final: repeated closePot calls keep paying the manager beyond the intended single 10% cut, and the pot never transitions to "closed".
Foundry test (kept in poc/MyCutPoC.t.sol) — passes, showing a late claim succeeding after the pot was closed and that closePot left the pot state open:
Console output of the run:
Add a terminal state and gate both functions on it:
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.