closePot() uses a push payment pattern, iterating over all claimants and sending tokens to each one in a single transaction. If any single claimant address is blacklisted by the token contract (USDC, USDT) or is a smart contract that reverts on token receipt, the entire transaction reverts.
This blocks the manager cut and all other claimants from receiving their bonus.// Root cause in the codebase with @> marks to highlight the relevant section
Likelihood:
USDC and USDT both have blacklist functionality. A claimant who gets blacklisted after claiming (added to claimants[]) will cause closePot() to permanently revert.
A malicious player can deploy a contract that claims via claimCut() then intentionally reverts on any incoming token transfer, permanently DoS'ing closePot().
Impact:
closePot() becomes permanently uncallable — the manager cut and all claimant bonuses from leftover rewards are locked forever.
There is no alternative withdrawal or emergency function to recover funds.
The owner has no way to remove the problematic claimant from the array.
The following test deploys a malicious contract as one of the contest players. The malicious contract claims its reward (getting added to claimants[]), then sets a flag to revert on any future incoming token transfer. When the owner tries to call closePot(), the loop hits the malicious address, reverts, and permanently bricks the entire close operation.
Wrap each individual token transfer in a try/catch block so that a single failed transfer (due to blacklisting, reverting contract, etc.) does not block the entire closePot() execution. This ensures the manager cut and other claimants' bonuses are still distributed even if one address cannot receive tokens.
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.