# glamsterdam-devnet-9 spec
:::info
:mega: **Genesis 2026-09-01 15:00:00 UTC** (`MIN_GENESIS_TIME` 1788274800). **Gloas fork at epoch 225 — 2026-09-02 15:00:00 UTC**, 24 h after genesis.
:::
:::warning
:rotating_light: **Client teams - please get your trunk branches ready.** devnet-9 runs **trunk images**
(`:master` / `:main` / `:unstable` / `:develop`)
:::
:::info
:checkered_flag: **Scope. No new EIPs.** Two goals, in order:
1. **A clean Gloas fork transition** from a large pre-fork state that exists at genesis rather than being grown over days of block production. This is what the L2 teams asked for after Plataberget.
2. **Non-finality testing** — drive the network below the 2/3 participation threshold, hold it in the inactivity leak, observe recovery.
:::
## EIP List for glamsterdam-devnet-9
Unchanged from devnet-8 except where marked.
| EIP | Title | Status |
|-----|-------|:------:|
|[EIP-2780](https://eips.ethereum.org/EIPS/eip-2780) | Reduce intrinsic transaction gas | |
|[EIP-7610](https://eips.ethereum.org/EIPS/eip-7610) | Revert creation in case of non-empty storage | :x: |
|[EIP-7688](https://eips.ethereum.org/EIPS/eip-7688) | Forward compatible consensus data structures | |
|[EIP-7708](https://eips.ethereum.org/EIPS/eip-7708) | ETH transfers emit a log | |
|[EIP-7732](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-7732.md) | Enshrined Proposer-Builder Separation | |
|[EIP-7778](https://eips.ethereum.org/EIPS/eip-7778) | Block Gas Accounting without Refunds | |
|[EIP-7843](https://eips.ethereum.org/EIPS/eip-7843) | SLOTNUM opcode | |
|[EIP-7904](https://eips.ethereum.org/EIPS/eip-7904) | Compute Gas Cost Analysis (informational only) | ℹ️ |
|[EIP-7928](https://eips.ethereum.org/EIPS/eip-7928) | Block-Level Access Lists | |
|[EIP-7954](https://eips.ethereum.org/EIPS/eip-7954) | Increase Maximum Contract Size (→ 64 KiB) | |
|[EIP-7975](https://eips.ethereum.org/EIPS/eip-7975) | eth/70 - partial block receipt lists | |
|[EIP-7976](https://eips.ethereum.org/EIPS/eip-7976) | Increase Calldata Floor Cost (64/64) | |
|[EIP-7981](https://eips.ethereum.org/EIPS/eip-7981) | Increase Access List Cost | |
|[EIP-7997](https://eips.ethereum.org/EIPS/eip-7997) | Deterministic Factory Predeploy | |
|[EIP-8024](https://eips.ethereum.org/EIPS/eip-8024) | Backward compatible SWAPN, DUPN, EXCHANGE | |
|[EIP-8037](https://eips.ethereum.org/EIPS/eip-8037) | State Creation Gas | :warning: |
|[EIP-8038](https://eips.ethereum.org/EIPS/eip-8038) | State-access gas cost update | |
|[EIP-8045](https://eips.ethereum.org/EIPS/eip-8045) | Exclude slashed validators from proposing | |
|[EIP-8061](https://eips.ethereum.org/EIPS/eip-8061) | Increase exit and consolidation churn | |
|[EIP-8070](https://eips.ethereum.org/EIPS/eip-8070) | eth/72 - Sparse Blobpool | |
|[EIP-8136](https://eips.ethereum.org/EIPS/eip-8136) | Cell-Level Deltas for Data Column Broadcast | |
|[EIP-8159](https://eips.ethereum.org/EIPS/eip-8159) | eth/71 - Block Access List Exchange | |
|[EIP-8189](https://eips.ethereum.org/EIPS/eip-8189) | snap/2 - BAL-Based State Healing | |
|[EIP-8246](https://eips.ethereum.org/EIPS/eip-8246) | Remove SELFDESTRUCT Burn | |
|[EIP-8261](https://eips.ethereum.org/EIPS/eip-8261) | Gas Limit Schedule (optional) | ℹ️ |
|[EIP-8282](https://github.com/ethereum/EIPs/pull/11760) | Add builder execution requests | |
**Key:** :up: updated · :new: added · :x: removed for devnet-9 · :warning: changes under review · ℹ️ informational / optional
- **EIP-7610 — removed from Glamsterdam** 2026-08-20 (EIPs commit `f9976e68`); EELS
[#3417](https://github.com/ethereum/execution-specs/pull/3417) deleted the tests.
## Execution Layer Client Support
| Item | Geth | Besu | Reth | Nethermind | Erigon | Nimbus-EL | Ethrex |
|-----|:----:|:----:|:----:|:----------:|:------:|:---------:|:------:|
| Trunk image | ✅ `:master` | ✅ `:main` | ❌ pinned | ✅ `:master` | ✅ `:main` | ❌ pinned | :hammer: `:main` |
| Frozen 8038/2780 in the **published image** | ✅ | ✅ | ✅ | ✅ | ✅ `main-bbf97b6` | ✅ | :hammer: |
| eth/72 (EIP-8070) on trunk | ✅ | ✅ | ❌ not on `main` | ✅ | ✅ | ✅ | :hammer: |
| EIP-7610 removal | :hammer: | :hammer: | :hammer: | :hammer: | :hammer: | :hammer: | :hammer: |
| Undecodable BAL → `INVALID` ([#869](https://github.com/ethereum/execution-apis/pull/869)) | ❌ | ✅ | ❌ | :grey_question: | ❌ | :grey_question: | ❌ |
### Implementation tracker CL
| Item | Lodestar | Lighthouse | Prysm | Teku | Nimbus | Grandine |
|------|:--------:|:----------:|:-----:|:----:|:------:|:--------:|
| Trunk image | ✅ `:unstable` | ✅ `:unstable` | :grey_question: `:develop` | ✅ `:master` | ✅ `:unstable` | :grey_question: `:develop` |
| `v1.7.0-alpha.14` | ✅ | ✅ | ❌ alpha.12 | ✅ | ✅ | ✅ |
| `get_parent_payload_status` for a pre-Gloas parent ([#5096](https://github.com/ethereum/consensus-specs/issues/5096)) | `FULL` | `PENDING` | :grey_question: | :grey_question: | :grey_question: | :grey_question: |
| EIP-8261 gas-limit schedule | :grey_question: | ❌ | :grey_question: | ✅ | ❌ | ❌ |
### Test Releases
**Consensus Specs:** [v1.7.0-alpha.14](https://github.com/ethereum/consensus-specs/releases/tag/v1.7.0-alpha.14) (2026-08-19, `0718095c4d54`) :heavy_check_mark:
**Execution Specs (EELS):** [tests-glamsterdam-devnet@v8.1.3](https://github.com/ethereum/execution-specs/releases/tag/tests-glamsterdam-devnet@v8.1.3) (2026-08-31) — branch [`devnets/glamsterdam/8`](https://github.com/ethereum/execution-specs/tree/devnets/glamsterdam/8)
### Spec versions required & Open PRs
**EIPs**
- [PR-12249 - Update EIP-8037: refill state-gas for a SELFDESTRUCTed account](https://github.com/ethereum/EIPs/pull/12249) Open :exclamation:
- [PR-12256 - Update EIP-8037: restore a frame's state-gas on rollback](https://github.com/ethereum/EIPs/pull/12256) Open :exclamation:
- [PR-12265 - Update EIP-8037: return state-gas to gas_left when a child merges](https://github.com/ethereum/EIPs/pull/12265) Open :exclamation:
**Consensus Specs**
- [ISSUE-5096 - Gloas: `on_block` is ill-defined at fork boundary](https://github.com/ethereum/consensus-specs/issues/5096) Closed :x:
- [PR-5125 - Guard `get_parent_payload_status` at fork boundary](https://github.com/ethereum/consensus-specs/pull/5125) Open :exclamation:
- [PR-5545 - Initialize anchor PTC vote arrays in `get_forkchoice_store`](https://github.com/ethereum/consensus-specs/pull/5545) Merged :heavy_check_mark:
- [PR-5554 - Use slot from header instead of bid](https://github.com/ethereum/consensus-specs/pull/5554) Merged :heavy_check_mark:
- [PR-5559 - Ignore proposer preferences for pre-Gloas slots](https://github.com/ethereum/consensus-specs/pull/5559) Merged :heavy_check_mark:
- [PR-5563 - Load gossip validation state from the store](https://github.com/ethereum/consensus-specs/pull/5563) Merged :heavy_check_mark:
- [PR-5580 - Reject bids from builders exited by the parent's payload](https://github.com/ethereum/consensus-specs/pull/5580) Merged :heavy_check_mark:
All five merged PRs post-date the `v1.7.0-alpha.14` tag. #5580 is **not consensus-breaking** — p2p bid validation only.
**Execution APIs**
- [PR-856 - engine: specify bit ordering for the 16-byte custody and cell bitarrays](https://github.com/ethereum/execution-apis/pull/856) Open :exclamation:
- [PR-869 - engine: return INVALID for undecodable blockAccessList](https://github.com/ethereum/execution-apis/pull/869) Merged :heavy_check_mark:
**Networking**
- [PR-281 - caps/eth: define the pooled transaction encoding and fix the txsize definition](https://github.com/ethereum/devp2p/pull/281) Open :exclamation:
**Execution Specs**
- [PR-3417 - chore(tests): remove EIP-7610 create collision tests](https://github.com/ethereum/execution-specs/pull/3417) Merged :heavy_check_mark:
- [PR-3475 - feat(tests): EIP-7928 - storage reads of a recreated destroyed account](https://github.com/ethereum/execution-specs/pull/3475) Merged :heavy_check_mark:
**Other**
- [PR-854 - Add gas limit schedule config](https://github.com/grandinetech/grandine/pull/854) Open :exclamation:
- [PR-9878 - Add gas limit schedule](https://github.com/sigp/lighthouse/pull/9878) Open :exclamation:
- [PR-11203 - fix: announce the pooled representation of a locally submitted blob transaction](https://github.com/besu-eth/besu/pull/11203) Open :exclamation:
- [PR-17354 - Glamsterdam devnet 8](https://github.com/OffchainLabs/prysm/pull/17354) Open :exclamation:
- [PR-17380 - Explicitly set bid fields when upgrading to Gloas](https://github.com/OffchainLabs/prysm/pull/17380) Open :exclamation:
- [PR-17383 - Bump consensus spec to v1.7.0-alpha.14](https://github.com/OffchainLabs/prysm/pull/17383) Open :exclamation:
## EIP-8037 changes under review
Three PRs from Paweł's partial review. **None are in devnet-9** — it ships EIP-8037 as specified in EELS `devnets/glamsterdam/8`. **EL decides by Thursday 2026-09-03.** If either open PR lands, EELS needs a spec update and a new fixture release.
| # | Change | EIPs PR | Status |
|---|--------|---------|--------|
| 1 | Refill state-gas for an account created and `SELFDESTRUCT`ed in the same transaction, keyed on final state at transaction finalization. Adds `requires: 8246`. | [#12249](https://github.com/ethereum/EIPs/pull/12249) | :x: **not coming** — 3 clients against at ACDT #94; ACDE #244 deferred it to Hegotá |
| 2 | Add frame-local `state_gas_baseline`; replace "refill in LIFO order" with an explicit restore-to-baseline block on revert/halt. | [#12256](https://github.com/ethereum/EIPs/pull/12256) | :warning: open — **underspecification fix**. Rollback refills the state-gas "charged within the frame", but no counter holds that quantity (`L0` is never defined), so two frames can revert with every defined counter equal and still owe different amounts. No fixture can catch it. |
| 3 | Add a merge step returning state-gas from the reservoir to `gas_left`, capped by the frame's outstanding `state_gas_from_gas_left`. | [#12265](https://github.com/ethereum/EIPs/pull/12265) | :warning: open — **behaviour change**. `state_gas_from_gas_left` is frame-local but a slot's original value is its value at transaction start, so a refill can land in a different frame than the charge. Two sibling calls (an ERC-4337 bundle) strand 97,920 gas the caller cannot spend on execution. Also makes `gas_left` able to increase across a call. |
## Genesis / network parameters
| Parameter | devnet-8 | devnet-9 |
|-----------|----------|----------|
| Validator nodes | 84 | **1,000** (mainnet-weighted) + 4 bootnodes + 4 buildoors |
| `NUMBER_OF_VALIDATORS` | 84,000 | **1,000,000** (1,000 per node) |
| `ADDITIONAL_VALIDATOR_MNEMONICS` | *(none)* | **3,000,000 exited** (`start: 1100000`, `wd_prefix: 0x00`, `status: 2`) |
| Registry size | 84,000 | **≈4,000,000** |
| `genesis.ssz` | 14.4 MB | **≈560 MB** |
| Total stake | 2.7M ETH | **32M ETH** |
| `GLOAS_FORK_EPOCH` | 1536 (~6.8 d) | **225** (24 h) |
| `GENESIS_GASLIMIT` | 60,000,000 | 60,000,000 |
| `WITHDRAWAL_TYPE` | `0x02` | `0x02` |
| Genesis generator | 6.2.0 | **6.2.0** |
| EL discovery | discv5-only | discv5-only |
## Open items
- [ ] **prysm + grandine trunk confirmation.**
- [ ] **EIP-8037**: EL decision on [#12256](https://github.com/ethereum/EIPs/pull/12256) / [#12265](https://github.com/ethereum/EIPs/pull/12265) by Thursday 2026-09-03.
- [ ] **EIP-7610 removal reconciled** across all seven ELs (currently 4–3).
- [ ] [consensus-specs#5096](https://github.com/ethereum/consensus-specs/issues/5096) — `get_parent_payload_status` is undefined for a pre-Gloas parent; **Lighthouse returns PENDING, Lodestar returns FULL**. Closed NOT_PLANNED 08-31; fix PR [#5125](https://github.com/ethereum/consensus-specs/pull/5125) open. Please confirm what your client returns.
- [ ] [devp2p#281](https://github.com/ethereum/devp2p/pull/281) — eth/72 `txsize` is ambiguous for type-3 (EIP-4844 defines a separate pooled encoding); causing live cross-client peer downscoring on devnet-8. Client fix example: [besu#11203](https://github.com/besu-eth/besu/pull/11203).
- [ ] [execution-apis#856](https://github.com/ethereum/execution-apis/pull/856) — `custodyColumns` bit→byte ordering unspecified; a reversed ordering still decodes to a well-formed 128-bit set, so **failure is silent**.
- [ ] [execution-apis#869](https://github.com/ethereum/execution-apis/pull/869) — undecodable `blockAccessList` must yield `{status: INVALID}`, not a JSON-RPC error. Merged 08-28, after the current images were built.
## Local testing
```yaml
participants_matrix:
el:
- el_type: geth
el_image: ethpandaops/geth:master
- el_type: nethermind
el_image: ethpandaops/nethermind:master
- el_type: besu
el_image: ethpandaops/besu:main
cl:
- cl_type: lighthouse
cl_image: ethpandaops/lighthouse:unstable
- cl_type: lodestar
cl_image: ethpandaops/lodestar:unstable
- cl_type: teku
cl_image: ethpandaops/teku:master
network_params:
preset: minimal
gloas_fork_epoch: 1
additional_services:
- assertoor
- spamoor
- dora
assertoor_params:
run_stability_check: false
run_block_proposal_check: false
tests:
- { file: "https://raw.githubusercontent.com/ethpandaops/assertoor/refs/heads/master/playbooks/gloas-dev/builder-lifecycle.yaml" }
- { file: "https://raw.githubusercontent.com/ethpandaops/assertoor/refs/heads/master/playbooks/gloas-dev/builder-deposit.yaml" }
dora_params:
image: ethpandaops/dora:master-latest
port_publisher:
additional_services:
enabled: true
global_log_level: debug
```
---
## Metrics
https://notes.ethereum.org/@ethpandaops/bal-otel
Previous devnet spec sheet: https://notes.ethereum.org/@ethpandaops/glamsterdam-devnet-8