# 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.