The contract implements a receive()
function, allowing ETH to be sent directly to it without invoking any game logic.
However, this ETH is not added to any internal variables like pot, platformFeesBalance, or pendingWinnings. At the same time, the contract exposes a getContractBalance() function that reads the raw ETH balance:
This creates a false sense of correctness: external tools or frontend UIs may compare getContractBalance() to internal values (e.g., pot + fees) and assume they match. But ETH sent via receive() causes silent drift, breaking this assumption.
Likelihood:
Any user, wallet, or contract using .send()
or .transfer()
(or mistakenly pasting the contract address in MetaMask) will send ETH via receive()
.
This ETH will increase address(this).balance
but not be included in any game-related accounting.
Impact:
getContractBalance()
no longer reflects only accounted funds — off-chain monitors may wrongly trust it.
ETH can become permanently locked: it's not part of the pot, not withdrawable by the platform, and not claimable by players.
Auditors, UIs, or dashboards may display incorrect stats or mislead users about actual claimable or reserved balances.
ETH sent this way increases the contract balance but doesn't affect pot
or platformFeesBalance
. This creates a discrepancy between the actual contract balance and the accounting system, potentially leading to permanent loss of funds that can never be claimed by winners.
1: Remove receive()
if not needed
If there's no legitimate reason for untagged ETH to be sent
If allowing direct ETH transfers is intentional:
There is no reason for a user to directly send ETH or anything to this contract. Basic user mistake, info, invalid according to CH Docs.
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.