According to the protocol design, users must pay 1 ETH to like another profile. If two users mutually like each other, their contributions are pooled and transferred to a shared multisig wallet after deducting a 10% protocol fee.
However, the contract allows users to send any amount ≥ 1 ETH when calling likeUser(). The deposited ETH is tracked in userBalances and later used in matchRewards(). When a match occurs, the matchRewards() function consumes the entire recorded balance of both users instead of deducting 1 ETH per match.
This means that if a user accidentally sends more ETH than intended when liking someone, the full balance will be used for the first match and the protocol fee will be calculated from the entire balance instead of the intended 1 ETH.
Likelihood:
Users can send more than 1 ETH when calling likeUser() because the contract only enforces msg.value >= 1 ether. Accidental overpayment is possible when interacting directly with contracts or through custom integrations.
Impact:
Protocol fees are calculated from the entire balance, potentially causing users to pay significantly higher fees than expected.
The full user balance is consumed during the first match instead of charging 1 ETH per match.
Remaining intended likes cannot be executed because the balance is reset to zero after the first match.
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.