# EIP712MetaTransaction.executeMetaTransaction() failed txs are open to replay attacks

Failed meta-transactions revert the whole tx, leaving the nonce unchanged, so anyone can replay the same signature later once conditions change.

- Payout: Audit contest
- Severity: high
- Program: Rolla
- Found by: WatchPug
- Disclosed: 2022-06-24
- Write-up quality: 7/10
- Original: https://github.com/code-423n4/2022-03-rolla-findings/issues/45
- Library page: https://bugbountylibrary.com/r/c4%3A2022-03-rolla%3AH-04
- Tags: domain:web3 impact:funds-loss kind:contest platform:code4rena sev:high tech:evm tech:solidity technique:source-review vuln:signature-replay

**Target:** EIP712MetaTransaction.executeMetaTransaction meta-transaction forwarder
**Root cause:** Nonce is incremented before the low-level call, but a failed call reverts the entire transaction, rolling back the nonce increment. The signature therefore remains valid for replay.
**Steps:**
1. Alice signs a meta-tx calling operate()/_mintOptionsPosition() with 10,000 USDC.
2. Before execution Alice sends 1,000 USDC away so the call fails (insufficient balance).
3. Tx reverts; `_nonces[Alice]` unchanged, signature still valid.
4. Days later Bob sends 1,000 USDC back to Alice.
5. Attacker resubmits the same signed metaAction with r/s/v; call now succeeds and spends Alice's 10,000 USDC.
**How found:** Code reading of executeMetaTransaction: noticed nonce increment is rolled back on revert because the low-level call's failure triggers require(success) reverting the whole tx, leaving the signature reusable.
**Exploitation:** Attacker observes a failed meta-transaction (reverted, nonce not consumed) and later replays the identical signed payload once the precondition (balance) is restored, forcing the victim's funds to be spent against their will.
**Insight:** In meta-tx forwarders, nonce consumption must survive failure; check whether a revert path rolls back the nonce, making any condition-dependent signed tx replayable once conditions change.
