Root Cause: Missing token rescue mechanism in Pot contract
Impact: Tokens sent after closure become permanently locked
After closePot() executes, the pot has distributed its remaining rewards and completed its lifecycle, but the contract remains live and can still receive tokens.
The Pot contract lacks any rescue or sweep mechanism to recover tokens sent to it after closure, either accidentally (user error) or maliciously (grief attack), causing those funds to become permanently locked.
Likelihood:
Users may accidentally send tokens to a closed pot address thinking it is still active.
Malicious actors could grief the system by sending dust amounts to closed pots, permanently locking value.
The contract accepts ERC20 transfers at any time without validation, making accidental sends likely over the protocol's lifetime.
Impact:
Any tokens sent to the pot after closePot() are permanently inaccessible, as no withdrawal mechanism exists.
Over many pot instances, accidental transfers accumulate into significant locked value.
The pot owner (ContestManager) cannot recover these funds even though it owns the pot contract.
The following scenario demonstrates tokens becoming permanently locked:
A pot is created with 1,000 tokens and closes after 90 days, distributing rewards properly
After closure, someone accidentally sends 9,319 tokens to the pot address (via direct transfer or mint)
The pot now holds 10,219 tokens but remainingRewards is still 1,000
No function exists to withdraw these extra 9,219 tokens
The test assertion pot balance after close > remainingAtClose fails because the pot balance grew unexpectedly with no mechanism to extract the surplus.
Add a rescue function that allows the owner to withdraw tokens sent to the pot after closure. Track whether the pot has been closed to prevent abuse:
This allows the protocol to recover accidentally sent tokens while preventing abuse by requiring the pot to be closed first.
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.