closePot iterates over claimants and makes an external ERC20 transfer call for each one. If any single transfer reverts due to a blacklisted address (USDC/USDT), a token with transfer hooks, or a contract recipient that reverts, the entire closePot call reverts.
Since there is no partial-close mechanism, the Pot becomes permanently uncloseable, and all remaining funds are locked.
Likelihood:
This requires a specific confluence: a claimant's address must be blacklisted on the prize token (USDC/USDT have on-chain blacklists) after they successfully called claimCut but before closePot is called.
Alternatively, a claimant could be a smart contract whose ERC777/transfer-hook callback reverts. While both scenarios are plausible in real deployments (especially for USDC-denominated contests), they require an external action (token-level blacklisting) outside of direct attacker control. Low likelihood, but once triggered, the impact is permanent and irreversible.
Impact:
A single malicious or blacklisted claimant can permanently prevent closePot from completing, locking all remaining funds in the contract.
The following test deploys a USDC-like token with an address blacklist. After two players claim (entering claimants[]), player1's address is blacklisted. closePot then fails permanently because the transfer to player1 reverts, trapping all remaining funds.
Add it to test/PocTests.t.sol alongside the BlacklistableERC20 helper contract and run forge test --match-test testM2 -vvv:
Replace the push-loop with a pull-payment pattern: record pending amounts in a mapping during closePot and let each recipient withdraw individually. This isolates any single transfer failure and prevents full DoS.
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.