The protocol uses IERC20.transfer() and IERC20.transferFrom() directly without OpenZeppelin's SafeERC20 wrapper throughout all token operations.
Tokens like USDT that do not return a boolean value will cause the ABI decoder to revert, making the entire protocol incompatible. Tokens that return false on failure instead of reverting will be silently ignored — state updates proceed but tokens never move, leading to accounting insolvency.
Likelihood:
Any contest created with USDT (the most widely used stablecoin) as the reward token will fail completely because USDT's transfer() does not return a boolean, causing Solidity's ABI decoder to revert.
Tokens that return false on failure (instead of reverting) will silently pass, causing the protocol to believe funds were sent when they were not.
Impact:
With USDT or similar non-standard tokens: all claimCut(), closePot(), and fundContest() calls revert — the entire protocol is bricked for that token.
With tokens returning false on failure: claimCut() zeroes a player's reward mapping and decrements remainingRewards even though no tokens moved. The player loses their reward permanently.
fundContest() marks the Pot as funded with totalRewards but the Pot receives nothing, making all subsequent claims fail.
The following test shows that when the Pot uses a non-standard token like USDT (which does not return a boolean from transfer()), the ABI decoder fails and all claim operations revert, making the protocol completely unusable for that token.
Import OpenZeppelin's SafeERC20 library in both Pot.sol and ContestManager.sol, and replace all transfer()/transferFrom() calls with safeTransfer()/safeTransferFrom(). This handles tokens with missing return values (USDT) and tokens that return false on failure by reverting the transaction.
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.