Declarative Validation
Nodes check an authenticator's identity against a canonical allowlist, never execute wallet code
Native account abstraction for Ethereum without executing wallet code during validation. Declarative authenticators, portable cross-chain accounts, predictable mempool safety.
Pick the route that matches why you're here.
chain_id 0.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:
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:
| Grant | Value | Meaning |
|---|---|---|
SENDER | 0x01 | Ungated call initiation |
POLICY | 0x02 | Call initiation gated to a designated policy manager |
NONCE | 0x04 | Permission to use non-nonceless nonce channels |
SELF_PAYER | 0x08 | Pay gas for the account's own transactions |
SPONSOR_PAYER | 0x10 | Pay 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.
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.
payer | payer_auth | Who pays | Required grant |
|---|---|---|---|
| empty | empty | sender | SELF_PAYER on the sender's own resolved actor |
| sender's own address | set | sender | SELF_PAYER on a dedicated gas key funding a sibling key |
| a different address | set | the payer field | SPONSOR_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.