Final core EIP introducing Type-1 transactions that pre-declare the addresses and storage keys a transaction will touch, in exchange for discounted access gas (2,400 per address, 1,900 per key) versus cold-access pricing. Activated alongside Berlin.
- 01gas optimization for cross-contract calls
- 02MEV bots / searchers
- 03transactions touching many storage slots
- 04future statelessness preparation
- pnpm add viem
- pnpm add ethers
- pnpm add @ethereumjs/tx
Use Type-1 (`0x01`) transactions with an `accessList` of `{ address, storageKeys[] }` entries to mark accounts and slots as warm before execution. Generate the list via `eth_createAccessList` on a node, or build it manually for known patterns. With viem, pass `accessList` to `sendTransaction`; with ethers, use `populateTransaction`. Only include the list if the savings on warm vs cold access exceed the per-entry cost — empty or wrong lists strictly increase gas.
- ⚑Adding an access list ALWAYS costs 2,400 gas per address and 1,900 gas per storage key — if execution does not actually touch those slots, you pay the cost without the discount and the tx is more expensive than legacy.
- ⚑`eth_createAccessList` is best-effort: the resulting list may miss slots written by storage-creating opcodes or differ at execution time due to state changes between blocks — re-validate before high-value sends.
- ⚑Most L2s either ignore the access list (charging full L1 calldata cost regardless) or price it differently — measure on the target chain rather than assuming mainnet behavior.
- ⚑Access lists are part of the signed transaction — modifying them after signing invalidates the signature, so you cannot patch a list mid-broadcast.
- ⚑EIP-1559 Type-2 transactions also support an `accessList` field; EIP-2930 Type-1 is rarely the right format today — prefer Type-2 with an access list unless you specifically need the legacy-tip semantics.