Skip to content

EIP-8130Account Configuration

Native account abstraction for Ethereum without executing wallet code during validation. Declarative authenticators, portable cross-chain accounts, predictable mempool safety.

What to read first?

Pick the route that matches why you're here.

How does it work?

Every EIP-8130 account is governed by a single system contract, the Account Configuration Contract, which stores one actor_config slot per registered actor and delegates signature checking to an authenticator contract:

solidity
interface IAuthenticator {
    function authenticate(bytes32 hash, bytes calldata data) external view returns (bytes32 actorId);
}

A node accepts a transaction into its mempool by checking the identity of the declared authenticator against a small canonical allowlist and calling it via STATICCALL, not by executing the account's own code to figure out whether the transaction is valid. K1_AUTHENTICATOR is the native secp256k1 case: the protocol runs ecrecover directly instead of a contract call, which is what lets any existing EOA send AA transactions immediately with zero prior registration.

Each actor carries a scope byte of grants rather than a single all-or-nothing permission:

GrantValueMeaning
SENDER0x01Ungated call initiation
POLICY0x02Call initiation gated to a designated policy manager
NONCE0x04Permission to use non-nonceless nonce channels
SELF_PAYER0x08Pay gas for the account's own transactions
SPONSOR_PAYER0x10Pay gas on behalf of a different sender

scope == 0x00 is the admin predicate: unrestricted authority over config changes and delegation. There is no separate "config" grant, since any actor able to rewrite actor_config can already grant itself full access.

Transaction format (AA_TX_TYPE = 0x79)

AA_TX_TYPE || rlp([
  chain_id, sender, nonce_key, nonce_sequence, expiry,
  max_priority_fee_per_gas, max_fee_per_gas, gas_limit,
  account_changes, calls, metadata,
  payer, sender_auth, payer_auth
])

calls is a two-level structure, phases of atomic calls that commit independently in sequence: if a call in a phase reverts, that phase rolls back and later phases are skipped, but already-completed phases persist. A common pattern is [[sponsor_payment], [user_action_a, user_action_b]], where the sponsor's payment phase survives even if the user's action phase later reverts.

Gas sponsorship

payerpayer_authWho paysRequired grant
emptyemptysenderSELF_PAYER on the sender's own resolved actor
sender's own addresssetsenderSELF_PAYER on a dedicated gas key funding a sibling key
a different addresssetthe payer fieldSPONSOR_PAYER on the payer's resolved actor

No bundler, no EntryPoint contract, no off-chain relayer. Validation, gas payment, and execution are all native protocol behavior. See Current Spec for the full mechanism, including nonces, Account Lock, and account creation and import.