The payment check uses >= instead of ==:
Any ETH sent above 1 ether is silently accepted into the contract. The userBalances[msg.sender] mapping (once the missing-credit bug is fixed) would credit the full msg.value — but since the fee math and match pool are designed around 1 ETH per user, any excess distorts the pool accounting. More critically in the current codebase where userBalances is never written, the entire msg.value is simply locked. There is no withdrawExcess(), no partial-refund logic, and no user-facing withdrawal function in LikeRegistry. The only withdrawal is withdrawFees() for the owner, which only touches totalFees.
Likelihood:
Users interacting via a frontend that pre-fills 1 ETH will not be affected in normal conditions, but wallet UX errors, gas estimation rounding, and direct contract calls routinely result in slightly over-sent values.
Any user calling the contract directly (via Etherscan, cast, scripts) without knowing the exact requirement will overpay and lose the excess permanently.
On high-gas networks, some wallets add a small ETH buffer to payable calls automatically.
Impact:
Any ETH above 1 ether sent in a likeUser() call is permanently lost with no recovery mechanism for the user.
Combined with the missing userBalances credit bug, the entire msg.value (not just the excess) is locked — making this a total loss for every caller.
The receive() fallback compounds this: any ETH sent directly to the contract is also unrecoverable.
Enforce exact payment with == to prevent silent over-collection:
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.