Declarative Validation
Nodes select known authenticators by address instead of running the sender account's code
Research and implementation tracking for a draft native account-abstraction proposal. Canonical authenticators, portable account configuration, and bounded validation.
Pick the route that matches why you're here.
chain_id 0.Every EIP-8130 account is governed by the Keystore at KEYSTORE_ADDRESS, which stores actor and account state and delegates credential checks to an authenticator contract:
interface IAuthenticator {
function authenticate(bytes32 hash, bytes calldata data) external view returns (bytes32 actorId);
}A node accepts a transaction by checking the declared authenticator against a canonical allowlist and calling it via STATICCALL, rather than executing sender-account code. K1_AUTHENTICATOR runs native ecrecover. Account-aware validateSignature then uses typed local or multichain envelopes and an account- and chain-scoped digest.
Each actor carries a uint16 scope grant mask rather than one 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,
valid_after, valid_before,
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 | Admin or SELF_PAYER on the sender's resolved actor |
| sender's own address | set | sender | Admin or SELF_PAYER on a dedicated gas key funding a sibling key |
| a different address | set | the payer field | Admin or SPONSOR_PAYER on the payer's resolved actor |
No bundler or EntryPoint contract is required on the native path. See Current Spec for validity windows, local epochs, multichain changes, nonces, Account Lock, and account creation.