The executeTransaction() function sets txn.executed = true before the external call{value}, which correctly prevents same-txId reentrancy.
However, if multiple transactions are pre-approved, a malicious recipient contract can re-enter executeTransaction() with a different txId during the external call's callback. This allows executing multiple transactions atomically in a single call frame, preventing the second owner from reacting or revoking between executions.
Likelihood:
Requires both owners to have approved multiple transactions AND the recipient to be a malicious contract -- a narrow scenario
Both owners must be in on it or one must have been tricked into pre-approving multiple transactions
Impact:
Multiple pre-approved transactions execute atomically, preventing the second owner from revoking between them
No additional funds are stolen beyond what was already approved, but timing control is lost
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.