The RockPaperScissors contract allows players to create/join games using an ERC20 token (WinningToken). However, the functions createGameWithToken() and joinGameWithToken() call transferFrom() without first verifying that the player has approved the contract to spend tokens on their behalf.
Transactions revert if allowance is insufficient, breaking game flow.
Partial state updates (e.g., playerB assigned but tokens not transferred) may leave the contract in an inconsistent state.
Poor UX: Players may repeatedly fail transactions due to missing approvals.
Frontrunning Risk: Attackers can invalidate pending transactions by resetting allowances (approve(contract, 0)) .
Manual reviews
SafeERC20And repeat the same for joinGameWithToken()
createGameWithToken and joinGameWithToken functions will revert because they attempt transferFrom without requiring the user to first approve
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.