We are using push payment pattern via a low-level call
to send the prize to the winner at RockPaperScissors::_finishGame
Using .call{value: prize}("")
directly to send Ether to an external address is bad because:
Untrusted receiver contracts may have fallback or receive functions that consume more gas or revert unexpectedly.
If the receiver is a smart contract, it might:
Revert the transaction
Reenter your contract if proper guards aren't in place
Fail to receive the prize without notifying the sender
There's no tracking mechanism of unclaimed prizes — if it fails, the funds may get stuck or lost.
Low-level calls can silently fail, and the contract might not properly handle these failures unless explicitly checked.
Denial of Service (DoS): A malicious or faulty contract could block other winners from receiving their prize.
Manual Review
Use method : pull over push
Malicious player wins a game using a contract that intentionally reverts when receiving ETH, the entire transaction will fail
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.