The only state transition that moves a liker's payment is matchRewards, which requires a mutual like. There is no unlike(), no timeout, and no way for a liker to reclaim funds if the liked user never reciprocates. Even with proper balance crediting, one-sided balances could only ever be drained by a mutual match. An attacker can farm likes with a free fake profile and simply never reciprocates.
test_M1_oneSidedLikeUnrecoverable: Alice likes Bob (1 ETH); Bob never reciprocates. Asserts: 1 ETH sits in the registry, likes[alice][bob] is true with no undo function, both withdrawFees paths revert. PASS.
Add unlike(address) refunding the liker's accumulated unmatched balance, or a time-boxed escrow (like expires after N days, then refundable). At minimum a withdrawUnmatched() pull 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.