Three ERC20 calls do not check their boolean return values. Non-standard tokens such as USDT return false on failure rather than reverting. Ignoring the return value means a failed transfer silently passes, leaving the contract in an inconsistent state.
Likelihood:
Non-reverting ERC20 tokens (e.g., USDT on Ethereum mainnet, older BEP-20 tokens, and various custom tokens) are widely deployed and commonly used as prize tokens in contest platforms.
While the standard OpenZeppelin ERC20 used in the test suite reverts on failure, the protocol places no restriction on which ERC20 can be used in a Pot.
Any non-reverting token triggers this vulnerability, and the impact ranges from a silently unfunded Pot to permanently lost claimant rewards.
Impact:
fundContest: Pot appears funded but holds no tokens; all subsequent claims silently fail.
closePot / _transferReward: manager or claimant receives nothing while remainingRewards is decremented, causing permanent fund loss.
The following test demonstrates that fundContest silently "succeeds" with a non-reverting token, leaving the Pot with zero balance, and that a subsequent claimCut zeroes the player's entitlement without delivering any tokens permanently destroying their reward with no recourse. Add it to test/PocTests.t.sol alongside the ReturnFalseERC20 helper contract and run forge test --match-test testM1 -vvv:
Use OpenZeppelin's SafeERC20 library and apply safeTransfer / safeTransferFrom to all three call sites:
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.