Normal behavior:
Once two users mutually like each other and a match is formed:
rewards should be distributed once, and
the match should be finalized and immutable.
Repeated reward distribution for the same pair must not be possible.
Issue:
LikeRegistry does not mark a match as consumed or finalized after matchRewards() is executed.
As a result, the same mutual match can be processed multiple times, repeatedly deploying new multisig wallets and attempting to distribute rewards again.
There is no state variable preventing re-execution for the same (from, to) pair.
Likelihood:
Reason 1: Any function path that checks mutual likes can trigger matchRewards again.
Reason 2: No attacker privileges required.
Reason 3: Can be triggered accidentally or intentionally.
Impact:
Impact 1: Duplicate multisig creation: unnecessary contract deployments.
Impact 2: Inconsistent accounting: rewards logic may be re-applied.
Impact 3: Protocol integrity risk: a single match no longer represents a one-time event.
This does not always lead to additional fund loss (depending on balances), but it breaks a core invariant of the matching system.
Explanation
Assume the following sequence:
Result:
A new multisig wallet is deployed again
Reward logic is re-run
Match semantics are violated
Mark matches as finalized immediately after reward distribution.
Alternatively, clear the likes mapping after a successful 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.