ERC-8043: Atomic ERC-7579 Module Install and Execute

Hi everyone! :waving_hand:

I’m excited to share ERC-8043, a new standard that solves a major UX friction in ERC-7579 smart accounts.

The Problem

Current ERC-7579 implementations require two separate transactions for module installation and usage. Users must:

  1. Install a module (wait for confirmation)
  2. Use the module in another transaction

This creates poor UX, especially for session keys and spending limits.

ERC-8043 introduces “Enable Mode” to install and use modules in a single user operation by installing the module during the validation phase of the user operation

How it works:

:wrench: Magic Nonce: 0x01 prefix in user operation nonce triggers enable mode
:locked_with_key: EIP-712 Auth: Secure module installation via typed signatures
:package: Structured Encoding: Clean separation of installation and validation data

// Signature format
abi.encode(
    uint256 moduleTypeId,
    address module,
    bytes initData,
    bytes installationSignature,  // EIP-712 
    bytes userOpSignature        // Normal validation
)

Validation Flow:

  1. Detect 0x01 nonce prefix
  2. Decode structured signature
  3. Validate EIP-712 installation signature
  4. Install module during validation phase
  5. Continue normal user operation validation

Hi all, posting an update since the spec has changed substantially.

Renamed to “Init Mode” / new title

“Enable Mode” is now “Init Mode” to align with the mechanism, and the ERC title is now “Atomic ERC-7579 Module Install and Execute”.

New signaling mechanism: initCode instead of a magic nonce

The original design used a 0x01 nonce prefix and packed installation data into signature. The new design uses a 4-byte magic value at the start of userOp.initCode (0x80438043), leveraging ERC-4337 EntryPoint v0.9’s behavior of silently ignoring initCode for already-deployed accounts. Since initCode is still included in the userOpHash, all installation parameters are automatically committed to by the user operation signature.

New encoding format

userOp.initCode[4:] is ABI-encoded as (uint256[] moduleTypeIds, address[] modules, bytes[] initDatas, bytes installationSignature). The minimum payload is 256 bytes, so a 4-byte magic is unambiguous. The nonce and signature fields are now used normally.

Simplified validation flow

A single path: detect magic → decode → validate EIP-712 installationSignature → install modules → delegate to normal validateUserOp. No sub-flows, installationSignature is always required.