matchRewards() deploys a fresh MultiSigWallet for each match and sends the reward ETH to it. The wallet requires both matched users (owner1, owner2) to approve every transaction before execution.
MultiSigWallet provides submitTransaction, approveTransaction, and executeTransaction but no way to cancel a submitted transaction and no timeout after which a unilateral withdrawal is possible. If one matched user loses their key, becomes unresponsive, or simply refuses to approve, all ETH in the wallet is permanently locked with no recovery path.
Likelihood:
Every matched pair's ETH lands in a two-of-two MultiSig deployed with no escape hatch. Any disagreement, key loss, or one party going offline makes the funds unrecoverable.
The protocol currently deposits 0 ETH to the MultiSig due to H-01 (userBalances never credited), but fixing H-01 without adding a cancellation mechanism would make this locking scenario directly exploitable.
Impact:
Matched users' reward ETH is permanently locked whenever either owner cannot or will not cooperate. There is no owner, governance address, or timeout mechanism that can unblock the funds.
One malicious user can hold their match's ETH hostage indefinitely by simply never approving any transaction.
The sequence below shows the lock-up scenario:
Alice's ETH remains trapped in the MultiSig because Bob refuses to approve, and the contract offers no alternative exit.
Add a cancellation function callable by either owner, and a timeout-based unilateral withdrawal for transactions that remain unexecuted past a deadline:
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.