> ## Documentation Index
> Fetch the complete documentation index at: https://docs.whitechain.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Network artifacts

> Download, verify, and regenerate the Whitechain genesis, rollup config, and L1 contract addresses that a node needs to start from block 0.

Every Whitechain node starts from a fixed set of files: the L2 execution genesis, the rollup config, and the record of what was deployed on L1. They are published in the [whitechain-bootstrap repository](https://github.com/whitechain-labs/whitechain-bootstrap), one directory per network, and this page explains what each file is, how to check that the copy you downloaded is the real one, and how to regenerate the derived files yourself.

<Note>
  Whitechain Sepolia artifacts are published today. Mainnet artifacts are published at Mainnet launch.
</Note>

## Networks and directories

| Network            | Directory  | L2 chain ID                     | Settlement layer              | Status            |
| ------------------ | ---------- | ------------------------------- | ----------------------------- | ----------------- |
| Whitechain Sepolia | `testnet/` | `1874`                          | Ethereum Sepolia (`11155111`) | Published         |
| Mainnet            | `mainnet/` | Published before Mainnet launch | Ethereum mainnet              | Not yet published |

Each network directory is self-contained. Never mix files across networks: a genesis from one network does not match the rollup config of another, and a node started on a mismatched pair stalls instead of syncing.

## What each file is

| File                 | What it is                                                                                                                                                                                                                              | Who consumes it                                            |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- |
| `genesis.json`       | L2 execution-layer genesis. Builds the block 0 state, including every OP Stack predeploy and the pre-funded allocations.                                                                                                                | The execution client: `op-geth init`, or `op-reth --chain` |
| `rollup.json`        | L2 consensus-layer (rollup) config. Defines the L1 origin block, protocol activation times, sequencing window, and the L1 system contract addresses.                                                                                    | `op-node`                                                  |
| `l1-addresses.json`  | Every L1 contract deployed for the chain: portal, bridges, messenger, `SystemConfig`, dispute game factory, and all implementation contracts behind the proxies.                                                                        | Humans and tooling verifying the deployment on Ethereum    |
| `deploy-config.json` | The resolved OP Stack deploy config: the full parameter set the deployment was applied with, after defaults and overrides were merged. Derived from `state.json`, published so it can be read and diffed without running `op-deployer`. | Humans and tooling verifying the chain configuration       |
| `intent.toml`        | The deployment intent handed to `op-deployer`: chain parameters, role addresses, fee vault recipients, and the custom gas token. The human-authored source of truth for how the chain was configured.                                   | `op-deployer apply`                                        |
| `state.json`         | The `op-deployer` output state: the applied intent plus every deployed contract address. `genesis.json`, `rollup.json`, and `deploy-config.json` are all derivable from it.                                                             | `op-deployer inspect`                                      |

Only `genesis.json` and `rollup.json` are read by a running node. The other four exist so that anyone can check the chain configuration and the L1 deployment without asking Whitechain for anything.

## Download the artifacts

```bash theme={null}
git clone https://github.com/whitechain-labs/whitechain-bootstrap.git
```

To run a node you need `genesis.json` and `rollup.json` for your network. Copy them into the node stack under `artifacts/<network>/`, a path relative to the root of the [whitechain-labs/node repository](https://github.com/whitechain-labs/node), where the directory name matches `WHITECHAIN_NETWORK` in your `.env`:

```text theme={null}
artifacts/testnet/genesis.json
artifacts/testnet/rollup.json
```

The `public-rpc-node` stack already ships the Whitechain Sepolia pair, byte-for-byte identical to the copies in this repository, so on testnet there is nothing to replace. Download them when you want to verify what you are running, when you are bringing up a network the stack does not ship, or when a hardfork changes them.

## Verify what you downloaded

Compare the SHA-256 checksums of your copies against the published values:

```bash theme={null}
shasum -a 256 testnet/*
```

| File                         | SHA-256                                                            |
| ---------------------------- | ------------------------------------------------------------------ |
| `testnet/deploy-config.json` | `1aa1680515f0118dec543342a6a6689c553b7e2e576a3014eb3975af8f738a40` |
| `testnet/genesis.json`       | `7097a49f0ac0a7a9dc36a68c8e401018d0238a15730b08a2d1874efd2d422cf5` |
| `testnet/intent.toml`        | `c48a33129a238f97af788dc9805894cd7761a58c20ac108d2a1daf5315eeaef7` |
| `testnet/l1-addresses.json`  | `0b84cc7b4f818846c40874cd9c0c3afc964978dfaa9e312959a8069997b405c3` |
| `testnet/rollup.json`        | `722deb00df45e276cff35d66c40d15cbbb3c5e42f1086077ad6beb55b8bb16b5` |
| `testnet/state.json`         | `25aed7f30c4f8807a20a56a5202766e84c076bfb90924ef1a9bb0052adbfb793` |

These values cover the current Whitechain Sepolia set. They change when a hardfork changes the artifacts, and the repository is the authoritative copy of both the files and their checksums.

## Regenerate the derived files

`genesis.json`, `rollup.json`, `l1-addresses.json`, and `deploy-config.json` are not hand-written. They are derived from `state.json`, so you can rebuild them with `op-deployer` (v0.6.0 or later) and confirm that the committed files match what the deployer produces:

```bash theme={null}
op-deployer inspect genesis       --workdir ./testnet 1874 > /tmp/genesis.json
op-deployer inspect rollup        --workdir ./testnet 1874 > /tmp/rollup.json
op-deployer inspect deploy-config --workdir ./testnet 1874 > /tmp/deploy-config.json
op-deployer inspect l1            --workdir ./testnet 1874 > /tmp/l1-addresses.json
```

```bash theme={null}
diff <(jq -S . testnet/genesis.json)       <(jq -S . /tmp/genesis.json)
diff <(jq -S . testnet/rollup.json)        <(jq -S . /tmp/rollup.json)
diff <(jq -S . testnet/deploy-config.json) <(jq -S . /tmp/deploy-config.json)
diff <(jq -S . testnet/l1-addresses.json)  <(jq -S . /tmp/l1-addresses.json)
```

Every `diff` prints nothing when the files match. Any output means your copy differs from what the recorded deployment produces, and you should not start a node from it.

## Chain parameters recorded in the artifacts

These are the Whitechain Sepolia values as they appear in `rollup.json`, `genesis.json`, and `intent.toml`. They are reproduced here as text so the numbers are readable without opening the files.

| Parameter               | Value                                               | Source file                   |
| ----------------------- | --------------------------------------------------- | ----------------------------- |
| L2 chain ID             | `1874` (hex `0x752`)                                | `genesis.json`, `rollup.json` |
| L1 settlement           | Ethereum Sepolia (`11155111`)                       | `rollup.json`                 |
| L1 origin block         | `11071328`                                          | `rollup.json`                 |
| L2 genesis timestamp    | `1781596368` (2026-06-16 07:52:48 UTC)              | `rollup.json`                 |
| Block time              | 1 second                                            | `rollup.json`                 |
| Block gas limit         | `40000000`                                          | `genesis.json`, `rollup.json` |
| Minimum base fee        | `5000000000` wei (5 gwei)                           | `rollup.json`                 |
| EIP-1559 denominator    | `100`                                               | `rollup.json`                 |
| EIP-1559 elasticity     | `6`                                                 | `rollup.json`                 |
| Sequencing window       | `3600` L1 blocks (about 12 hours)                   | `rollup.json`                 |
| Channel timeout         | `300` L1 blocks                                     | `rollup.json`                 |
| Maximum sequencer drift | `600` seconds                                       | `rollup.json`                 |
| Batch inbox address     | `0x00be0e81141c6fb68542d5f4b29900c42ad8d43e`        | `rollup.json`                 |
| L1 base fee scalar      | `1368`                                              | `deploy-config.json`          |
| L1 blob base fee scalar | `801949`                                            | `deploy-config.json`          |
| Native gas token        | WBT (WhiteBIT Coin), OP Stack custom gas token      | `intent.toml`                 |
| Protocol upgrades       | Every upgrade through Jovian is active from block 0 | `genesis.json`, `rollup.json` |

Withdrawal and dispute timings come from `intent.toml`:

| Parameter                         | Value              |
| --------------------------------- | ------------------ |
| `proofMaturityDelaySeconds`       | `900` (15 minutes) |
| `disputeGameFinalityDelaySeconds` | `300` (5 minutes)  |
| `faultGameWithdrawalDelay`        | `600` (10 minutes) |
| `faultGameClockExtension`         | `300` (5 minutes)  |
| `faultGameMaxClockDuration`       | `900` (15 minutes) |
| `preimageOracleChallengePeriod`   | `300` (5 minutes)  |

Whitechain Sepolia delays are intentionally short so that a full withdrawal can be tested end to end. Mainnet values are different. See [OP Stack canonical bridge](/build/bridge/bridge-assets#timing-parameters) for what these mean for a withdrawal.

`intent.toml` also records the role addresses for the deployment: the L1 and L2 `ProxyAdmin` owners, the `SystemConfig` owner, the batcher, the proposer, the challenger, the unsafe block signer, and the fee vault recipients.

## L1 contracts on Ethereum Sepolia

`l1-addresses.json` carries the complete set, proxies and implementations. The proxies below are the ones an operator or an integrator usually needs; read the file for the implementation addresses behind them.

| Contract                            | Address on Ethereum Sepolia                                                                                                     |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `OptimismPortalProxy`               | [`0xff9b597b0781457ae6aa7256ca5ed5839bf7d0c3`](https://sepolia.etherscan.io/address/0xff9b597b0781457ae6aa7256ca5ed5839bf7d0c3) |
| `SystemConfigProxy`                 | [`0x9328ea869949f33c57b7b680b6edb58769e2181c`](https://sepolia.etherscan.io/address/0x9328ea869949f33c57b7b680b6edb58769e2181c) |
| `L1StandardBridgeProxy`             | [`0x0c50be539ab5d72d226038928f2eb25100899ded`](https://sepolia.etherscan.io/address/0x0c50be539ab5d72d226038928f2eb25100899ded) |
| `L1CrossDomainMessengerProxy`       | [`0x547967f45d19dc4ca0a056ba525afe99bda18a88`](https://sepolia.etherscan.io/address/0x547967f45d19dc4ca0a056ba525afe99bda18a88) |
| `L1Erc721BridgeProxy`               | [`0x1e419fc5575bbd6d352582e9d8073918d79f0c5b`](https://sepolia.etherscan.io/address/0x1e419fc5575bbd6d352582e9d8073918d79f0c5b) |
| `OptimismMintableErc20FactoryProxy` | [`0x5898f6c319842a379799d634c6ed2da960a42b9b`](https://sepolia.etherscan.io/address/0x5898f6c319842a379799d634c6ed2da960a42b9b) |
| `DisputeGameFactoryProxy`           | [`0xfaa2faa8912c069c01abc169c33713c79027c833`](https://sepolia.etherscan.io/address/0xfaa2faa8912c069c01abc169c33713c79027c833) |
| `AnchorStateRegistryProxy`          | [`0x4da165963420deeb0788f338b7a1df41e535a32c`](https://sepolia.etherscan.io/address/0x4da165963420deeb0788f338b7a1df41e535a32c) |
| `EthLockboxProxy`                   | [`0x7becd75f3e1ce952cb63fd7ef5220f205a6e1469`](https://sepolia.etherscan.io/address/0x7becd75f3e1ce952cb63fd7ef5220f205a6e1469) |
| `SuperchainConfigProxy`             | [`0x11854d3146a460d095943c3231f2755ba342426e`](https://sepolia.etherscan.io/address/0x11854d3146a460d095943c3231f2755ba342426e) |
| `ProtocolVersionsProxy`             | [`0x811de5c619960e417dc8bc40aa4b052376ec211f`](https://sepolia.etherscan.io/address/0x811de5c619960e417dc8bc40aa4b052376ec211f) |

These addresses are specific to the Whitechain Sepolia deployment on Ethereum Sepolia. They are not the same on Mainnet, and they change if the deployment is ever redone. The L2 side of the bridge sits at fixed `0x4200...` predeploy addresses that are identical on every OP Stack chain: see [OP Stack canonical bridge](/build/bridge/bridge-assets#contract-addresses).

## Start a node from the artifacts

The same `genesis.json` is accepted by both execution clients. Whitechain's own `public-rpc-node` stack runs `op-reth`; `op-geth` works from the identical file.

Initialize `op-geth` from the genesis:

```bash theme={null}
op-geth init --datadir=./datadir testnet/genesis.json
```

Initialize `op-reth` from the same file:

```bash theme={null}
op-reth init --chain=testnet/genesis.json --datadir=./datadir
```

`op-reth` takes the genesis through `--chain` on every invocation, not only at init, so pass the same `--chain=testnet/genesis.json` to `op-reth node`. The explicit `init` step is optional, because `op-reth node` initializes an empty datadir from `--chain` on first start. This is what the `public-rpc-node` stack does: it mounts `artifacts/<network>/genesis.json` into the container and passes `--chain` to `op-reth node`, with no separate init step.

Start the consensus client against the same network:

```bash theme={null}
op-node \
  --rollup.config=testnet/rollup.json \
  --l1=<L1_RPC> \
  --l1.beacon=<L1_BEACON> \
  --l2=<L2_ENGINE_RPC> \
  --l2.jwt-secret=<JWT_FILE>
```

`<L2_ENGINE_RPC>` is the authenticated engine API of the execution client started above, configured with the `--authrpc.*` flags on both `op-geth` and `op-reth`, and `<JWT_FILE>` must be the same JWT secret that client was given.

Both clients must be pointed at the same pair of artifacts. In practice you do not run these commands directly: the `public-rpc-node` Docker Compose stack wraps them and generates the JWT for you. See [Run a node](/operate/run-a-node/run-a-node).

## When the artifacts change

Artifacts change at a hardfork, and the repository is updated before the activation timestamp. Replace `artifacts/<network>/rollup.json` (and `genesis.json` if it changed) with the published version and restart before that timestamp, or the node stalls on a chain divergence. See [Node maintenance](/operate/run-a-node/maintenance#update-the-node).

A genesis change never applies to a node that is already synced past block 0. If both files change, wipe and resync, or restore a snapshot taken after the fork.

## Related

* [Run a node](/operate/run-a-node/run-a-node)
* [Node configuration](/operate/run-a-node/configuration)
* [Node maintenance](/operate/run-a-node/maintenance)
* [Troubleshooting](/operate/run-a-node/troubleshooting)
* [Whitechain Sepolia parameters](/learn/network/testnet)
* [Network reference](/learn/network/reference)
* [OP Stack canonical bridge](/build/bridge/bridge-assets)
