# Plataberget spec
:::info
:mega: Plataberget targets to launch in early August 2026. **Exact date deferred to ACDT #90 (2026-08-03)**
:::
:::info
:checkered_flag: **Scope.** Short-lived fork-transition devnet: all clients fork together from a big pre-fork state (config similar to devnet-7). EL discovery runs **discv5-only** (per-client flags under Networking); QUIC stays enabled on the CL. The new **builder API** flow (Beacon API / Keymanager / Builder Specs PRs below) is **best effort**. Benchmark-driven repricing updates (EIP-8037/8038 numbers) may still land before launch. Stress goals: SSZ/stable-container performance and builder lifecycle at scale (see Testing focus). devnet-9 (non-finality testing) follows within the month.
:::
:::info
8282 system contracts are unchanged from devnet-7 (no sys-asm bytecode changes since):
| Contract | Req | type | Address |
|----------|---------|------|--------------------------------------------|
| same as devnet-7 | deposit | 0x03 | 0x0000bff46984e3725691fa540a8c7589300d8282 |
| same as devnet-7 | exit | 0x04 | 0x000064d678505ad48f8ccb093bc65613800e8282 |
:::
## EIP List for Plataberget testnet
| EIP | Title |Status
|--------|-----|:-----:|
|[EIP-2780](https://eips.ethereum.org/EIPS/eip-2780) | Reduce intrinsic transaction gas — **transfer log cost folded into `TX_VALUE_COST`** (create-with-value cost changes) | :up:
|[EIP-7610](https://eips.ethereum.org/EIPS/eip-7610) | Revert creation in case of non-empty storage
|[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 — recipient excluded when a runtime halt precedes | :up:
|[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 — spec unchanged; clients **must not** check contract existence at the fork boundary (no BAL read, no witness) | :up:
|[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 — CPSB=1530, source-based refunds; "regular gas" renamed to **"execution gas"** (terminology only) | :up:
|[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) | Sparse Blobpool — **Engine API half now required**: `engine_getBlobsV3` *and* `V4` both served, FCU v4 `custody_columns`. eth/72 cell exchange stays optional; cell-level DAS deferred | :exclamation:
|[EIP-8159](https://eips.ethereum.org/EIPS/eip-8159) | eth/71 - Block Access List Exchange |
|[EIP-8246](https://eips.ethereum.org/EIPS/eip-8246) | Remove SELFDESTRUCT Burn |
|[EIP-8282](https://github.com/ethereum/EIPs/pull/11760) | Add builder execution requests |
**Key:**
- :up: EIP has updated
- :new: New EIP added
- :exclamation: scope changed (now required)
- :sparkles: Optional (nice to have)
## Testing focus
- **Fork transition** (primary goal): all clients through the fork without restarts. Regression checks from devnet-7: Lodestar+Besu/Erigon post-fork head hang, Teku rejecting valid buildoor bids, `debug_traceBlockByHash`, ePBS payload-body reconstruction.
- **SSZ / stable containers (EIP-7688) performance**: devnet-7 showed 10–20% slower processing across clients plus large-Merkle-tree issues with the big validator set. Verify the optimization round landed; compare block-processing/hashing metrics against devnet-7.
- **Builder lifecycle at scale**: each builder can only bid once per slot, so stressing the exit/withdrawal path needs breadth — deposit a few thousand builders, exit them en masse, drain the full-withdrawal sweep. Throughput bounds: deposits target 8/block on the 8282 contract (fee ramps exponentially above target; CL cap `MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD` = 64), exits ≤ `MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD` = 16/payload, withdrawability +64 epochs, sweep scans ≤ `MAX_BUILDERS_PER_WITHDRAWALS_SWEEP` = 16,384 builders/block, sharing the withdrawal pipeline with the exited-validator sweep. Also stresses the `ProgressiveList` builder registry (ties into the SSZ goal). Note: assertoor `builder-lifecycle.yaml` skips its full-withdrawal step when `MIN_BUILDER_WITHDRAWABILITY_DELAY` ≥ 10 epochs — playbook needs extending for this scenario.
- **discv5-only verification**: each EL must publish — and refresh at the fork — the `eth` forkid ENR entry on its discv5 record; geth's dial-candidate filter drops nodes without it. Confirm bootnode ENR distribution, and watch for besu's silent V4 fallback masking failures.
- **Txpool across the fork**: start spamming before the fork (devnet-7 started post-fork) so pools full of pre-fork-priced txs (EIP-2780 intrinsic gas, create-with-value change) get revalidated at the boundary.
## Network config overrides (vs mainnet defaults)
Goal: a 1024 ETH validator joins/exits at least as fast as a 32 ETH validator on mainnet, and entry/exit churn is high enough to grow and drain the validator and builder sets quickly. All of these are runtime config values — no client rebuilds.
| Config var | Mainnet default | devnet-8 | Why |
|------------|-----------------|----------|-----|
| `MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT_GLOAS` | `256000000000` (256 ETH) | `16384000000000` (16384 ETH) | 16 × 1024-ETH activations/epoch — saturates the `MAX_PENDING_DEPOSITS_PER_EPOCH` = 16 preset cap; 2× mainnet's count-rate |
| `CHURN_LIMIT_QUOTIENT_GLOAS` | `32768` | `128` (TBD — size against genesis active stake) | keeps exit churn *proportional* (the EIP-8061 mechanism) while meaningful at devnet stake; at the mainnet quotient the 128 ETH floor binds and one 1024-ETH exit eats 8 epochs |
| `CONSOLIDATION_CHURN_LIMIT_QUOTIENT` | `65536` | `256` (TBD — only if consolidation flows are in scope) | consolidation churn has no floor (EIP-8061); at devnet stake levels with the mainnet quotient it rounds to ~0 and consolidations stall |
| `MIN_BUILDER_WITHDRAWABILITY_DELAY` | `64` epochs | `8` epochs | fast mass-withdrawal drain for the builder stress test; also un-skips the assertoor `builder-lifecycle` full-withdrawal step (its guard is < 10 epochs) |
Deliberately left at mainnet values:
- `MAX_PENDING_DEPOSITS_PER_EPOCH` = 16 is a **preset** (compile-time for most CL clients) — validator onboarding is hard-capped at 16/epoch ≈ 3,600/day regardless of churn. Bulk validator count belongs in genesis; incremental state growth is faster via builders (~57,000/day at the 8282 contract's 8/block target — no churn, no pending-deposit queue).
- Builder per-payload caps (`MAX_BUILDER_DEPOSIT_REQUESTS_PER_PAYLOAD` = 64, `MAX_BUILDER_EXIT_REQUESTS_PER_PAYLOAD` = 16) and `MAX_BUILDERS_PER_WITHDRAWALS_SWEEP` = 16,384 are preset SSZ bounds — consensus-breaking to change.
- sys-asm 8282 contract bytecode stays at mainnet parameters (`TARGET_PER_BLOCK` = 8, exponential fee ramp) — the fee mechanism is itself under test.
### Specs & Tests
**Consensus Layer**
- [ ] target `v1.7.0-alpha.13` — version bump merged ([PR-5470](https://github.com/ethereum/consensus-specs/pull/5470)); **release not cut** (latest `v1.7.0-alpha.12`, 2026-07-08). Slipped past the ACDT #89 target :hourglass:
**Execution Layer**
- [x] target [tests-glamsterdam-devnet@v8.0.0](https://github.com/ethereum/execution-specs/releases/tag/tests-glamsterdam-devnet@v8.0.0)
### Open PRs
**EIPs**
- [PR-11902 - EIP-7928: exclude the recipient when a runtime halt precedes](https://github.com/ethereum/EIPs/pull/11902) Merged :heavy_check_mark:
- [PR-11991 - EIP-7997: specify activation-block deployment and BAL recording](https://github.com/ethereum/EIPs/pull/11991) Closed :x:
- closed 07-27
- [PR-11997 - EIP-2780: fold transfer log cost into TX_VALUE_COST](https://github.com/ethereum/EIPs/pull/11997) Merged :heavy_check_mark:
- [PR-11998 - EIP-8037: rename "regular gas" to "execution gas"](https://github.com/ethereum/EIPs/pull/11998) Merged :heavy_check_mark:
- [PR-12009 - EIP-7997: simplify spec, clarify rationale](https://github.com/ethereum/EIPs/pull/12009) Closed :x:
- closed 07-27
ACDT #89 closed both: existing spec text is correct, and no BAL read or contract-existence check happens at the fork boundary. Follow-up: geth uniquely reads/deploys the 7997 contract at the boundary — harmless on mainnet, divergent on chains without the factory pre-deployed.
**Builder Specs**
[ethereum/builder-specs](https://github.com/ethereum/builder-specs) — best effort for devnet-8
- [PR-165 - request auth clarifications](https://github.com/ethereum/builder-specs/pull/165) Open :exclamation:
- Will there be a release?
**Beacon API**
- [ISSUE-599 - event to signal the builder that its bid was accepted](https://github.com/ethereum/beacon-APIs/issues/599) Open :exclamation:
- builders have no clean signal that their bid won, hence whether to reveal
- [PR-606 - feat: extend /eth/v1/node/peers with peer scoring and disconnect reasons](https://github.com/ethereum/beacon-APIs/pull/606) Open :exclamation:
- [PR-624 - remove BlindedExecutionPayloadEnvelope](https://github.com/ethereum/beacon-APIs/pull/624) Merged :heavy_check_mark:
- merged 07-16. Builders send `Eth-Blob-Data-Included: true`, and keep `Eth-Execution-Payload-Blinded: false` for pre-624 beacon nodes
- [PR-625 - Add a POST produceBlockV4](https://github.com/ethereum/beacon-APIs/pull/625) Open :exclamation:
- [PR-627 - Add `produceBlockV4WithBid`](https://github.com/ethereum/beacon-APIs/pull/627) Open :exclamation:
- best effort
- [PR-630 - Update Beacon API for parity with Builder API and KeyManager API](https://github.com/ethereum/beacon-APIs/pull/630) Open :exclamation:
- best effort
**Keymanager API**
Best effort for devnet-8.
- [PR-87 - Deprecate prior and add /validator/config endpoint](https://github.com/ethereum/keymanager-APIs/pull/87) Open :exclamation:
- [PR-88 - add per-key builders endpoints](https://github.com/ethereum/keymanager-APIs/pull/88) Open :exclamation:
**Review order for the builder-config stack:** keymanager (#87/#88) first — builder-specs#165 and beacon-APIs#630 both depend on the shape it lands on. Open points: whether to cut per-builder p2p config options; overloading `builder_pubkey` for p2p builders (makes `url` optional, which SSZ handles badly without a first-class `Optional`); `min_bid`/boost-factor are VC-local hints the beacon node must not forward. At least one client must implement e2e before merge — the reason this flow stays best effort for devnet-8.
**Consensus Specs**
*Builder-bid fork-choice — PR-5472 vs PR-5491, pick one before the freeze.* :exclamation:
- [PR-5179 - Add `beacon_block_headers_by_root` req/resp on Gloas](https://github.com/ethereum/consensus-specs/pull/5179) Open :exclamation:
- required for devnet-8
- [PR-5294 - Add executable gossip validation functions for gloas](https://github.com/ethereum/consensus-specs/pull/5294) Open :exclamation:
- required for devnet-8
- [PR-5442 - Fix payload availability lookup for attestations to skipped slots](https://github.com/ethereum/consensus-specs/pull/5442) Closed :x:
- closed 07-28, superseded by PR-5473
- [PR-5443 - Add dependent root check to `proposer_preferences` validation](https://github.com/ethereum/consensus-specs/pull/5443) Merged :heavy_check_mark:
- merged 07-24
- [PR-5459 - Add p2p helper functions for epoch inclusivity check](https://github.com/ethereum/consensus-specs/pull/5459) Merged :heavy_check_mark:
- [PR-5462 - Correct `MIN_SLOTS_FOR_INCLUSION_LISTS_REQUESTS` value](https://github.com/ethereum/consensus-specs/pull/5462) Merged :heavy_check_mark:
- [PR-5472 - Allow builders to bid on multiple branches](https://github.com/ethereum/consensus-specs/pull/5472) Open :exclamation:
- builder-bid fork-choice option A — emerging preference: bounds DoS by a constant factor and decouples fork choice from bid processing
- [PR-5473 - Fix payload availability lookup using the parent block's slot](https://github.com/ethereum/consensus-specs/pull/5473) Merged :heavy_check_mark:
- merged 07-29; the alternative that superseded PR-5442
- [PR-5491 - Only allow bids compatible with the head view](https://github.com/ethereum/consensus-specs/pull/5491) Open :exclamation:
- builder-bid fork-choice option B — requires processing attestations every slot
- [PR-5495 - Preserve PTC votes when a known block is re-delivered in Gloas](https://github.com/ethereum/consensus-specs/pull/5495) Draft :exclamation:
**Execution APIs**
JSON-RPC alignment targeted for devnet-8.
- [PR-851 - eth/debug: specify block access list getter semantics](https://github.com/ethereum/execution-apis/pull/851) Open :exclamation:
- required for devnet-8
- [PR-852 - debug: specify callTracer output and add EIP-8037 two-dimensional gas to tracing](https://github.com/ethereum/execution-apis/pull/852) Open :exclamation:
- required for devnet-8
- [PR-854 - eth_createAccessList: clarify gas-fee affordability when fee fields omitted](https://github.com/ethereum/execution-apis/pull/854) Draft :exclamation:
- [PR-855 - debug: standardize callTracer output and add debug_traceCall](https://github.com/ethereum/execution-apis/pull/855) Draft :exclamation:
- follow-on to PR-852
- **`rpc-compat` / hivechain**: blocked on the fork definition being stable enough to generate a chain loadable by production clients. A combined execution-apis branch is being assembled. **Action: declare the EL fork definition frozen modulo the repricing constants so hivechain generation can start.**
**Networking**
- **EL discovery: discv5-only.** Per-client flags:
| Client | discv5-only flags |
|--------|-------------------|
| geth | `--discovery.v4=false --discovery.v5=true` |
| besu | `--discovery-mode=V5` (falls back to V4 if the node key is not secp256k1) |
| nethermind | `--Discovery.DiscoveryVersion V5` |
| reth | `--disable-discv4-discovery` (discv5 on by default) |
| erigon | `--discovery.v4=false --discovery.v5=true` |
| ethrex | `--p2p.discv4 false` (discv5 on by default) |
- **Also disable DNS discovery** — a second silent fallback that runs independently of discv4/discv5, so peers can still be found while discv5 is quietly broken. geth: `--discovery.dns ""`. Besu uses it independently of v4/v5 and can disable it. Nimbus EL/CL do not use it. Confirm per client.
- CL: QUIC stays enabled (carried over from devnet-7)
**Execution Specs**
- [PR-2948 - EIP-8070 sparse blobpool execute-only tests](https://github.com/ethereum/execution-specs/pull/2948) Merged :heavy_check_mark:
- merged 07-29
- [PR-3200 - add EIP-7997 deterministic factory deployment (fork-transition BAL entries)](https://github.com/ethereum/execution-specs/pull/3200) Closed :x:
- closed 07-24
- [PR-3214 - fold transfer log cost into value transfer cost](https://github.com/ethereum/execution-specs/pull/3214) Merged :heavy_check_mark:
- merged 07-29
**System Contracts**
- No changes since devnet-7 (only a geas v0.3.3 toolchain bump, bytecode unchanged)
## Local testing
Kurtosis example:
```
participants_matrix:
el:
- el_type: geth
el_image: ethpandaops/geth:glamsterdam-devnet-8
- el_type: ethrex
el_image: ethpandaops/ethrex:glamsterdam-devnet-8
- el_type: nethermind
el_image: ethpandaops/nethermind:glamsterdam-devnet-8
cl:
- cl_type: lighthouse
cl_image: ethpandaops/lighthouse:glamsterdam-devnet-8
- cl_type: lodestar
cl_image: ethpandaops/lodestar:glamsterdam-devnet-8
- cl_type: prysm
cl_image: ethpandaops/prysm-beacon-chain:glamsterdam-devnet-8-minimal
network_params:
preset: minimal
gloas_fork_epoch: 1
# (deploy_eip8282_contracts: true) at the same addresses as devnet-7:
# deposit: 0x0000bFF46984e3725691FA540a8C7589300D8282
# exit: 0x000064D678505ad48F8cCb093BC65613800E8282
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 sheets for reference: https://notes.ethereum.org/@ethpandaops/glamsterdam-devnet-7