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:
Install a module (wait for confirmation)
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:
Magic Nonce: 0x01 prefix in user operation nonce triggers enable mode EIP-712 Auth: Secure module installation via typed signatures 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
)
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.