Skip to content

RIP-7712

Multi-dimensional nonces for smart contract accounts in RIP-7560 transactions

RIP-7712 introduces a two-dimensional nonce mechanism for native Account Abstraction (RIP-7560) transactions. It enables Smart Contract Accounts to define their own transaction sequencing logic, making complex and parallelized workflows possible — especially when multiple signers or execution threads are involved.


🧱 What It Adds

  • Two-dimensional nonces: (nonceKey, nonceSequence) pairs replace the traditional sequential nonce
  • NonceManager contract: Precompiled helper for validating and incrementing nonces
  • Enhanced parallelism: Accounts can manage multiple nonce threads (e.g., for multisig vs routine ops)

🔗 Relation to Other Standards

Spec Relation
RIP-7560 RIP-7712 extends its native transaction type
ERC-4337 Smart wallets already use custom nonces per validator
EIP-7702 Revocation relies on legacy nonce; 7712 adds caveats
ERC-6900 / 7579 Can map plugins to separate nonceKey lanes

🤔 Why It Matters

  • Avoids nonce collisions across independent actions
  • Enables parallel UX flows like multisig vs automation
  • Powers plugin-specific channels for modular accounts

⚙️ How It Works

RIP-7712 introduces a nonceKey alongside the usual nonceSequence. Each nonceKey acts like an independent thread:

mapping(address => mapping(uint256 => uint256)) public nonce;

A NonceManager precompile handles validation and incrementing:

  • nonceKey = 0: Uses legacy nonce (for EOAs and simple flows)
  • nonceKey > 0: Uses the two-dimensional scheme
  • Bundlers or builders must call the precompile to validate the pair

🤖 Example Use Cases

  • Threshold multisig vs user-level automation
  • Plugin-specific nonces for fee payment, voting, recovery
  • Delegated session key lanes (e.g. game moves, subscriptions)
  • Atomic batch ops with concurrent replay protection

⚠️ Caveats

  • EIP-7702 revocations use the legacy nonce — applications must align nonceKey = 0 for clean compatibility
  • Some tooling (e.g. eth_getTransactionCount) may not support multi-key logic
  • Wallets must expose nonce lanes clearly to avoid replay errors

💬 Discussion