# ECP-0113: Keep OP Stack Runtime Compatible With Forge Host Services

Status: Draft

## Problem / context

`ecp-forge` now runs the OP Stack bootstrap far enough to produce `deployment.json`, `genesis.json`,
and `rollup.json`, but the runtime containers still failed to stay up. `op-geth` tried to bind the
default Ethereum P2P port `30303`, already owned by the host full Ethereum node. The pinned
`op-node:v1.13.5` rejected current `op-deployer/v0.6.0-rc.3` rollup fields such as `minBaseFee`.
After aligning to `op-node:v1.14.0`, that image still rejected the newer
`genesis.system_config.daFootprintGasScalar` field. The generated rollup config also carried
`eip1559Params = 0x0000000000000000` even though the genesis `extraData` and chain config encode
denominator `250` and elasticity `6`; that zero value caused `op-geth` to panic when the sequencer
requested the first payload. `op-batcher:v1.14.0` also no longer accepts `--batch-inbox-address`.
Isolated compatibility probes showed `op-node:v1.16.6` paired with `op-geth:v1.101702.0-rc.1` can
run against the generated genesis hash and produce L2 blocks.

## Decision

Assign `op-geth` a repo-owned L2 P2P port in the existing `285xx` range, align `op-node` to the
probed `v1.16.6` runtime, move `op-geth` to the probed
`v1.101702.0-rc.1` image, remove the stale batcher inbox-address flag, delete only
`genesis.system_config.daFootprintGasScalar` from generated rollup configs, and derive zero
`eip1559Params` from the generated `chain_op_config`.

## Consequences

- The host Ethereum node can keep `30303` without blocking OP Stack startup.
- The OP Stack RPC and P2P port assignments stay documented in repo config.
- Runtime image compatibility is explicit in Nix config.
- The rollup JSON normalization is intentionally narrow: it removes the exact field rejected by the
  older `op-node:v1.14.0` parser and repairs only the zero EIP-1559 params that caused the live
  `op-geth` payload panic.
- The `op-geth` image is an explicit release-candidate tag because the previously pinned image
  panicked against the current deployer output.

## Alternatives considered

- Stop the host full Ethereum node. Rejected because the OP Stack should coexist with the existing
  Ethereum services.
- Strip all newer-looking fields from `rollup.json`. Rejected because `op-node:v1.14.0` accepts the
  other generated fields tested during recovery; broad deletion would hide schema drift.
- Leave zero `eip1559Params` in place. Rejected because the live sequencer/geth pair panicked before
  the first L2 block could be built.
- Keep `op-geth:v1.101511.1`. Rejected because it reproducibly panics on first payload construction
  for this generated chain config.

## Rollout / teardown

Deploy the updated NixOS module and bootstrap helper, reset failed OP Stack units, and verify L2 RPC
and rollup RPC locally on `ecp-forge`. Teardown is reverting the port assignment and rollup JSON
normalization, then regenerating runtime files with a mutually compatible deployer/runtime image set.
