For a "Like" mechanism, this usually means that when a user pays a fee to interact with another profile, those funds are either instantly transferred to the recipient, held until a mutual match occurs, or collected by a treasury as a service fee.
The specific issue with "likeUser" function is that it permanently locks the user's funds within the contract without any logic to transfer them out. While the function successfully updates the likes and matches state, it effectively acts as a "black hole" for ETH because there is no "address(liked).call{value: msg.value}("")" or similar withdrawal mechanism, meaning the 1 ETH is trapped in the contract balance forever. Also, the funds are not received by the intended recipient because the contract lacks a transfer or withdrawal mechanism.
Likelihood:
Every user attempting to engage with the core "matching" feature will inevitably trigger this vulnerability upon a successful transaction.
The absence of a centralized withdraw function or a userBalances mapping prevents any manual recovery of the trapped ETH, ensuring the funds remain locked in the contract's address indefinitely.
Impact:
Financial loss for users is absolute; participants who spend ETH to "like" others receive the social "state change" (the like record) but the economic value is permanently removed from circulation, leading to a total loss of principal for the sender and zero gain for the recipient.
The protocol's reputation and utility are severely compromised, as the accumulation of "stuck" funds creates a "honeypot" of unrecoverable liquidity that serves no functional purpose within the dating ecosystem, effectively acting as a "black hole" for user capital.
The Proof of Concept demonstrates that while the transaction successfully completes and the sender’s balance is deducted, the intended recipient's balance remains unchanged. This test case validates the "black hole" logic vulnerability by programmatically asserting that the financial state of the recipient does not reflect the economic intent of the "like" interaction.
Instead of letting the ETH sit "anonymously" in the contract's main balance, assign the msg.value to a specific user's record. This allows the funds to be "received" by the user in a ledger-based system, which they can later withdraw using a separate function.
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.