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

# Rollup deployment configuration

> Reference for the OP Stack rollup deployment configuration values.

This page is the reference for the values in the `DeployConfig` — the flat JSON
configuration that sets the L1 contract parameters and the L2 genesis state when
an OP Stack chain is deployed.

The schema tables below are generated directly from the `DeployConfig` Go
struct tree in the monorepo (`op-chain-ops/genesis`) at a finalized op-deployer
release, so the field list, JSON keys, types, and descriptions cannot silently
fall behind the source. Recommended values and standard-configuration
requirements are policy rather than code, and are maintained by hand in the
[guidance section](#guidance-and-standard-configuration-requirements) below.

<Info>
  **The recommended way to deploy an OP Stack chain is [OP Deployer](/chain-operators/tools/op-deployer/overview).**
  OP Deployer takes a declarative [intent file](/chain-operators/tools/op-deployer/usage/init) (`intent.toml`)
  rather than a hand-written `DeployConfig` JSON, and derives the `DeployConfig`
  documented here from that intent as part of its deployment pipeline. Most chain
  operators set the intent file and never edit a `DeployConfig` directly.

  This page documents the underlying `DeployConfig` surface: the exhaustive set of
  values a deployment ultimately resolves to. Use it to understand what an intent
  setting maps to, to interpret the `DeployConfig` that OP Deployer can emit for an
  applied deployment (via `op-deployer inspect deploy-config`), or as background for
  the lower-level [custom deployments](/chain-operators/tools/op-deployer/usage/custom-deployments)
  OP Deployer also supports.
</Info>

<Info>
  Deploy-config values are largely immutable after a chain is deployed, so this page targets the values you set at genesis.
  The output-oracle proposal fields (the [`l2OutputOracle*` values](#legacy-output-oracle)) describe the legacy `L2OutputOracle` proposal system and apply only to chains still on that system. Chains using [permissionless fault proofs](/op-stack/fault-proofs/explainer) — the standard configuration for new OP Stack chains — set the [fault-proof deployment values](#fault-proofs) instead: `useFaultProofs` together with the `faultGame*`, `preimageOracle*`, `proofMaturityDelaySeconds`, `disputeGameFinalityDelaySeconds`, and `respectedGameType` fields.
</Info>

<Info>
  Standard configuration is the set of requirements for an OP Stack chain to be
  considered a Standard Chain within the OP Stack. These requirements are
  currently a draft, pending governance approval. For more details, please see
  this [governance thread](https://gov.optimism.io/t/season-6-draft-standard-rollup-charter/8135)
  and the actual requirements in the [OP Stack Configurability Specification](https://specs.optimism.io/protocol/configurability.html?utm_source=op-docs\&utm_medium=docs).
</Info>

## Configuration values

Generated from the [`DeployConfig` struct](https://github.com/ethereum-optimism/optimism/blob/op-deployer%2Fv0.7.1/op-chain-ops/genesis/config.go)
in `op-chain-ops/genesis` at [`op-deployer/v0.7.1`](https://github.com/ethereum-optimism/optimism/releases/tag/op-deployer%2Fv0.7.1):
122 values in 20 groups. The JSON key for each value is its `json:"..."` struct
tag there; descriptions are the Go doc comments. When this page and the source
disagree, the source wins.

### Development accounts

| JSON key          | Type    | Description                                                                                                      |
| ----------------- | ------- | ---------------------------------------------------------------------------------------------------------------- |
| `fundDevAccounts` | boolean | FundDevAccounts configures whether to fund the dev accounts. This should only be used during devnet deployments. |

### L2 genesis block

| JSON key                      | Type                             | Description |
| ----------------------------- | -------------------------------- | ----------- |
| `l2GenesisBlockNonce`         | number (hex-encoded)             | —           |
| `l2GenesisBlockGasLimit`      | number (hex-encoded)             | —           |
| `l2GenesisBlockDifficulty`    | number (hex-encoded big integer) | —           |
| `l2GenesisBlockMixHash`       | 32-byte hash                     | —           |
| `l2GenesisBlockNumber`        | number (hex-encoded)             | —           |
| `l2GenesisBlockGasUsed`       | number (hex-encoded)             | —           |
| `l2GenesisBlockParentHash`    | 32-byte hash                     | —           |
| `l2GenesisBlockBaseFeePerGas` | number (hex-encoded big integer) | —           |

### Ownership

OwnershipDeployConfig defines the ownership of an L2 chain deployment. This excludes superchain-wide contracts.

| JSON key           | Type    | Description                                                                                                           |
| ------------------ | ------- | --------------------------------------------------------------------------------------------------------------------- |
| `proxyAdminOwner`  | address | ProxyAdminOwner represents the owner of the ProxyAdmin predeploy on L2.                                               |
| `finalSystemOwner` | address | FinalSystemOwner is the owner of the system on L1. Any L1 contract that is ownable has this account set as its owner. |

### Fee vaults

| JSON key                                   | Type                                                                               | Description                                                                                                                                                                                 |
| ------------------------------------------ | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `baseFeeVaultRecipient`                    | address                                                                            | BaseFeeVaultRecipient represents the recipient of fees accumulated in the BaseFeeVault. Can be an account on L1 or L2, depending on the BaseFeeVaultWithdrawalNetwork value.                |
| `l1FeeVaultRecipient`                      | address                                                                            | L1FeeVaultRecipient represents the recipient of fees accumulated in the L1FeeVault. Can be an account on L1 or L2, depending on the L1FeeVaultWithdrawalNetwork value.                      |
| `sequencerFeeVaultRecipient`               | address                                                                            | SequencerFeeVaultRecipient represents the recipient of fees accumulated in the SequencerFeeVault. Can be an account on L1 or L2, depending on the SequencerFeeVaultWithdrawalNetwork value. |
| `operatorFeeVaultRecipient`                | address                                                                            | OperatorFeeVaultRecipient represents the recipient of fees accumulated in the OperatorFeeVault.                                                                                             |
| `baseFeeVaultMinimumWithdrawalAmount`      | number (hex-encoded big integer)                                                   | BaseFeeVaultMinimumWithdrawalAmount represents the minimum withdrawal amount for the BaseFeeVault.                                                                                          |
| `l1FeeVaultMinimumWithdrawalAmount`        | number (hex-encoded big integer)                                                   | L1FeeVaultMinimumWithdrawalAmount represents the minimum withdrawal amount for the L1FeeVault.                                                                                              |
| `sequencerFeeVaultMinimumWithdrawalAmount` | number (hex-encoded big integer)                                                   | SequencerFeeVaultMinimumWithdrawalAmount represents the minimum withdrawal amount for the SequencerFeeVault.                                                                                |
| `operatorFeeVaultMinimumWithdrawalAmount`  | number (hex-encoded big integer)                                                   | OperatorFeeVaultMinimumWithdrawalAmount represents the minimum withdrawal amount for the OperatorFeeVault.                                                                                  |
| `baseFeeVaultWithdrawalNetwork`            | string: "remote" (withdraw to L1) or "local" (withdraw to L2); legacy 0/1 accepted | BaseFeeVaultWithdrawalNetwork represents the withdrawal network for the BaseFeeVault.                                                                                                       |
| `l1FeeVaultWithdrawalNetwork`              | string: "remote" (withdraw to L1) or "local" (withdraw to L2); legacy 0/1 accepted | L1FeeVaultWithdrawalNetwork represents the withdrawal network for the L1FeeVault.                                                                                                           |
| `sequencerFeeVaultWithdrawalNetwork`       | string: "remote" (withdraw to L1) or "local" (withdraw to L2); legacy 0/1 accepted | SequencerFeeVaultWithdrawalNetwork represents the withdrawal network for the SequencerFeeVault.                                                                                             |
| `operatorFeeVaultWithdrawalNetwork`        | string: "remote" (withdraw to L1) or "local" (withdraw to L2); legacy 0/1 accepted | OperatorFeeVaultWithdrawalNetwork represents the withdrawal network for the OperatorFeeVault.                                                                                               |

### Governance token

GovernanceDeployConfig is exclusive to OP-Mainnet and the testing of OP-Mainnet-like chains.

| JSON key                | Type    | Description                                                                                                |
| ----------------------- | ------- | ---------------------------------------------------------------------------------------------------------- |
| `enableGovernance`      | boolean | EnableGovernance configures whether or not include governance token predeploy.                             |
| `governanceTokenSymbol` | string  | GovernanceTokenSymbol represents the ERC20 symbol of the GovernanceToken.                                  |
| `governanceTokenName`   | string  | GovernanceTokenName represents the ERC20 name of the GovernanceToken                                       |
| `governanceTokenOwner`  | address | GovernanceTokenOwner represents the owner of the GovernanceToken. Has the ability to mint and burn tokens. |

### Gas price oracle

GasPriceOracleDeployConfig configures the GasPriceOracle L2 predeploy.

| JSON key                            | Type   | Description                                                                                                                                                                                                                      |
| ----------------------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `gasPriceOracleOverhead`            | number | GasPriceOracleOverhead represents the initial value of the gas overhead in the GasPriceOracle predeploy. Deprecated: Since Ecotone, this field is superseded by GasPriceOracleBaseFeeScalar and GasPriceOracleBlobBaseFeeScalar. |
| `gasPriceOracleScalar`              | number | GasPriceOracleScalar represents the initial value of the gas scalar in the GasPriceOracle predeploy. Deprecated: Since Ecotone, this field is superseded by GasPriceOracleBaseFeeScalar and GasPriceOracleBlobBaseFeeScalar.     |
| `gasPriceOracleBaseFeeScalar`       | number | GasPriceOracleBaseFeeScalar represents the value of the base fee scalar used for fee calculations.                                                                                                                               |
| `gasPriceOracleBlobBaseFeeScalar`   | number | GasPriceOracleBlobBaseFeeScalar represents the value of the blob base fee scalar used for fee calculations.                                                                                                                      |
| `gasPriceOracleOperatorFeeScalar`   | number | GasPriceOracleOperatorFeeScalar represents the value of the operator fee scalar used for fee calculations.                                                                                                                       |
| `gasPriceOracleOperatorFeeConstant` | number | GasPriceOracleOperatorFeeConstant represents the value of the operator fee constant used for fee calculations.                                                                                                                   |

### Custom gas token

GasTokenDeployConfig configures the optional custom gas token functionality.

| JSON key                     | Type                             | Description                                                                                                       |
| ---------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `useCustomGasToken`          | boolean                          | UseCustomGasToken is a flag to indicate that a custom gas token should be used                                    |
| `gasPayingTokenName`         | string                           | GasPayingTokenName represents the custom gas token name.                                                          |
| `gasPayingTokenSymbol`       | string                           | GasPayingTokenSymbol represents the custom gas token symbol.                                                      |
| `nativeAssetLiquidityAmount` | number (hex-encoded big integer) | NativeAssetLiquidityAmount represents the amount of liquidity to pre-fund the NativeAssetLiquidity contract with. |
| `liquidityControllerOwner`   | address                          | LiquidityControllerOwner represents the owner of the LiquidityController.                                         |

### Operator addresses

OperatorDeployConfig configures the hot-key addresses for operations such as sequencing and batch-submission.

| JSON key              | Type    | Description                                                                                                                                                               |
| --------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `p2pSequencerAddress` | address | P2PSequencerAddress is the address of the key the sequencer uses to sign blocks on the P2P layer.                                                                         |
| `batchSenderAddress`  | address | BatchSenderAddress represents the initial sequencer account that authorizes batches. Transactions sent from this account to the batch inbox address are considered valid. |

### EIP-1559 fee market

EIP1559DeployConfig configures the EIP-1559 parameters of the chain.

| JSON key                   | Type   | Description                                                                                   |
| -------------------------- | ------ | --------------------------------------------------------------------------------------------- |
| `eip1559Elasticity`        | number | EIP1559Elasticity is the elasticity of the EIP1559 fee market.                                |
| `eip1559Denominator`       | number | EIP1559Denominator is the denominator of EIP1559 base fee market.                             |
| `eip1559DenominatorCanyon` | number | EIP1559DenominatorCanyon is the denominator of EIP1559 base fee market when Canyon is active. |

### Network upgrade (hardfork) activations

UpgradeScheduleDeployConfig configures when network upgrades activate.

| JSON key                                | Type                               | Description                                                                                                                                                                                                  |
| --------------------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `l2GenesisRegolithTimeOffset`           | number (hex-encoded), nullable     | L2GenesisRegolithTimeOffset is the number of seconds after genesis block that Regolith hard fork activates. Set it to 0 to activate at genesis. Nil to disable Regolith.                                     |
| `l2GenesisCanyonTimeOffset`             | number (hex-encoded), nullable     | L2GenesisCanyonTimeOffset is the number of seconds after genesis block that Canyon hard fork activates. Set it to 0 to activate at genesis. Nil to disable Canyon.                                           |
| `l2GenesisDeltaTimeOffset`              | number (hex-encoded), nullable     | L2GenesisDeltaTimeOffset is the number of seconds after genesis block that Delta hard fork activates. Set it to 0 to activate at genesis. Nil to disable Delta.                                              |
| `l2GenesisEcotoneTimeOffset`            | number (hex-encoded), nullable     | L2GenesisEcotoneTimeOffset is the number of seconds after genesis block that Ecotone hard fork activates. Set it to 0 to activate at genesis. Nil to disable Ecotone.                                        |
| `l2GenesisFjordTimeOffset`              | number (hex-encoded), nullable     | L2GenesisFjordTimeOffset is the number of seconds after genesis block that Fjord hard fork activates. Set it to 0 to activate at genesis. Nil to disable Fjord.                                              |
| `l2GenesisGraniteTimeOffset`            | number (hex-encoded), nullable     | L2GenesisGraniteTimeOffset is the number of seconds after genesis block that Granite hard fork activates. Set it to 0 to activate at genesis. Nil to disable Granite.                                        |
| `l2GenesisHoloceneTimeOffset`           | number (hex-encoded), nullable     | L2GenesisHoloceneTimeOffset is the number of seconds after genesis block that the Holocene hard fork activates. Set it to 0 to activate at genesis. Nil to disable Holocene.                                 |
| `l2GenesisIsthmusTimeOffset`            | number (hex-encoded), nullable     | L2GenesisIsthmusTimeOffset is the number of seconds after genesis block that the Isthmus hard fork activates. Set it to 0 to activate at genesis. Nil to disable Isthmus.                                    |
| `l2GenesisJovianTimeOffset`             | number (hex-encoded), nullable     | L2GenesisJovianTimeOffset is the number of seconds after genesis block that the Jovian hard fork activates. Set it to 0 to activate at genesis. Nil to disable Jovian.                                       |
| `l2GenesisKarstTimeOffset`              | number (hex-encoded), nullable     | L2GenesisKarstTimeOffset is the number of seconds after genesis block that the Karst hard fork activates. Set it to 0 to activate at genesis. Nil to disable Karst.                                          |
| `l2GenesisInteropTimeOffset`            | number (hex-encoded), nullable     | L2GenesisInteropTimeOffset is the number of seconds after genesis block that the Interop hard fork activates. Set it to 0 to activate at genesis. Nil to disable Interop.                                    |
| `l2GenesisPectraBlobScheduleTimeOffset` | number (hex-encoded), nullable     | L2GenesisPectraBlobScheduleTimeOffset is the number of seconds after genesis block that the PectraBlobSchedule fix activates. Set it to 0 to activate at genesis. Nil to disable the PectraBlobSchedule fix. |
| `l1CancunTimeOffset`                    | number (hex-encoded), nullable     | When Cancun activates. Relative to L1 genesis.                                                                                                                                                               |
| `l1PragueTimeOffset`                    | number (hex-encoded), nullable     | When Prague activates. Relative to L1 genesis.                                                                                                                                                               |
| `l1OsakaTimeOffset`                     | number (hex-encoded), nullable     | When Osaka activates. Relative to L1 genesis.                                                                                                                                                                |
| `l1BPO1TimeOffset`                      | number (hex-encoded), nullable     | When BPO1 activates. Relative to L1 genesis.                                                                                                                                                                 |
| `l1BPO2TimeOffset`                      | number (hex-encoded), nullable     | When BPO2 activates. Relative to L1 genesis.                                                                                                                                                                 |
| `l1BPO3TimeOffset`                      | number (hex-encoded), nullable     | When BPO3 activates. Relative to L1 genesis.                                                                                                                                                                 |
| `l1BPO4TimeOffset`                      | number (hex-encoded), nullable     | When BPO4 activates. Relative to L1 genesis.                                                                                                                                                                 |
| `l1BlobScheduleConfig`                  | object (go-ethereum blob schedule) | Blob schedule config.                                                                                                                                                                                        |

### Core protocol parameters

L2CoreDeployConfig configures the core protocol parameters of the chain.

| JSON key                    | Type    | Description                                                                                                                                                                                                                                                  |
| --------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `l1ChainID`                 | number  | L1ChainID is the chain ID of the L1 chain.                                                                                                                                                                                                                   |
| `l2ChainID`                 | number  | L2ChainID is the chain ID of the L2 chain.                                                                                                                                                                                                                   |
| `l2BlockTime`               | number  | L2BlockTime is the number of seconds between each L2 block.                                                                                                                                                                                                  |
| `finalizationPeriodSeconds` | number  | FinalizationPeriodSeconds represents the number of seconds before an output is considered finalized. This impacts the amount of time that withdrawals take to finalize and is generally set to 1 week.                                                       |
| `maxSequencerDrift`         | number  | MaxSequencerDrift is the number of seconds after the L1 timestamp of the end of the sequencing window that batches must be included, otherwise L2 blocks including deposits are force included.                                                              |
| `sequencerWindowSize`       | number  | SequencerWindowSize is the number of L1 blocks per sequencing window.                                                                                                                                                                                        |
| `channelTimeout`            | number  | ChannelTimeoutBedrock is the number of L1 blocks that a frame stays valid when included in L1.                                                                                                                                                               |
| `batchInboxAddress`         | address | BatchInboxAddress is the L1 account that batches are sent to.                                                                                                                                                                                                |
| `systemConfigStartBlock`    | number  | SystemConfigStartBlock represents the block at which the op-node should start syncing from. It is an override to set this value on legacy networks where it is not set by default. It can be removed once all networks have this value set in their storage. |

### Fee market limits

| JSON key               | Type   | Description                                                                       |
| ---------------------- | ------ | --------------------------------------------------------------------------------- |
| `minBaseFee`           | number | MinBaseFee is the minimum base applied to each block.                             |
| `daFootprintGasScalar` | number | DAFootprintGasScalar is the scalar used to compute the DAFootprint of each block. |

### Alt-DA mode

AltDADeployConfig configures optional AltDA functionality.

| JSON key                     | Type    | Description                                                                                                                              |
| ---------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `useAltDA`                   | boolean | UseAltDA is a flag that indicates if the system is using op-alt-da                                                                       |
| `daCommitmentType`           | string  | DACommitmentType specifies the allowed commitment                                                                                        |
| `daChallengeWindow`          | number  | DAChallengeWindow represents the block interval during which the availability of a data commitment can be challenged.                    |
| `daResolveWindow`            | number  | DAResolveWindow represents the block interval during which a data availability challenge can be resolved.                                |
| `daBondSize`                 | number  | DABondSize represents the required bond size to initiate a data availability challenge.                                                  |
| `daResolverRefundPercentage` | number  | DAResolverRefundPercentage represents the percentage of the resolving cost to be refunded to the resolver such as 100 means 100% refund. |

### Development L1 genesis

DevL1DeployConfig is used to configure a L1 chain for development/testing purposes. A production L2 deployment does not utilize this configuration, except of a L1BlockTime sanity-check (set this to 12 for L1 Ethereum).

| JSON key                      | Type                             | Description |
| ----------------------------- | -------------------------------- | ----------- |
| `l1BlockTime`                 | number                           | —           |
| `l1GenesisBlockTimestamp`     | number (hex-encoded)             | —           |
| `l1GenesisBlockNonce`         | number (hex-encoded)             | —           |
| `l1GenesisBlockGasLimit`      | number (hex-encoded)             | —           |
| `l1GenesisBlockDifficulty`    | number (hex-encoded big integer) | —           |
| `l1GenesisBlockMixHash`       | 32-byte hash                     | —           |
| `l1GenesisBlockCoinbase`      | address                          | —           |
| `l1GenesisBlockNumber`        | number (hex-encoded)             | —           |
| `l1GenesisBlockGasUsed`       | number (hex-encoded)             | —           |
| `l1GenesisBlockParentHash`    | 32-byte hash                     | —           |
| `l1GenesisBlockBaseFeePerGas` | number (hex-encoded big integer) | —           |
| `l1GenesisBlockExcessBlobGas` | number (hex-encoded), nullable   | —           |
| `l1GenesisBlockblobGasUsed`   | number (hex-encoded), nullable   | —           |

### L1 starting block

| JSON key             | Type                          | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| -------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `l1StartingBlockTag` | L1 block number, tag, or hash | L1StartingBlockTag anchors the L2 at an L1 block. The timestamp of the block referenced by l1StartingBlockTag is used in the L2 genesis block, rollup-config, and L1 output-oracle contract. The Output oracle deploy script may use it if the L2 starting timestamp is nil, assuming the L2 genesis is set up with this. The L2 genesis timestamp does not affect the initial L2 account state: the storage of the L1Block contract at genesis is zeroed, since the adoption of the L2-genesis allocs-generation through solidity script. |

### Superchain configuration

SuperchainL1DeployConfig configures parameters of the superchain-wide deployed contracts to L1. This deployment is global, and can be reused between L2s that target the same superchain.

| JSON key                   | Type    | Description                                                                                                             |
| -------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------- |
| `superchainConfigGuardian` | address | SuperchainConfigGuardian represents the GUARDIAN account in the SuperchainConfig. Has the ability to pause withdrawals. |

### Legacy output oracle

OutputOracleDeployConfig configures the legacy OutputOracle deployment to L1. This is obsoleted with Fault Proofs. See FaultProofDeployConfig.

| JSON key                            | Type    | Description                                                                                                                                                                                                                      |
| ----------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `l2OutputOracleSubmissionInterval`  | number  | L2OutputOracleSubmissionInterval is the number of L2 blocks between outputs that are submitted to the L2OutputOracle contract located on L1.                                                                                     |
| `l2OutputOracleStartingTimestamp`   | number  | L2OutputOracleStartingTimestamp is the starting timestamp for the L2OutputOracle. MUST be the same as the timestamp of the L2OO start block.                                                                                     |
| `l2OutputOracleStartingBlockNumber` | number  | L2OutputOracleStartingBlockNumber is the starting block number for the L2OutputOracle. Must be greater than or equal to the first Bedrock block. The first L2 output will correspond to this value plus the submission interval. |
| `l2OutputOracleProposer`            | address | L2OutputOracleProposer is the address of the account that proposes L2 outputs.                                                                                                                                                   |
| `l2OutputOracleChallenger`          | address | L2OutputOracleChallenger is the address of the account that challenges L2 outputs.                                                                                                                                               |

### Fault proofs

FaultProofDeployConfig configures the fault-proof deployment to L1.

| JSON key                          | Type         | Description                                                                                                                                                                                                                                                                                      |
| --------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `useFaultProofs`                  | boolean      | UseFaultProofs is a flag that indicates if the system is using fault proofs instead of the older output oracle mechanism.                                                                                                                                                                        |
| `faultGameAbsolutePrestate`       | 32-byte hash | FaultGameAbsolutePrestate is the absolute prestate of Cannon. This is computed by generating a proof from the 0th -> 1st instruction and grabbing the prestate from the output JSON. All honest challengers should agree on the setup state of the program.                                      |
| `faultGameMaxDepth`               | number       | FaultGameMaxDepth is the maximum depth of the position tree within the fault dispute game. `2^{FaultGameMaxDepth}` is how many instructions the execution trace bisection game supports. Ideally, this should be conservatively set so that there is always enough room for a full Cannon trace. |
| `faultGameClockExtension`         | number       | FaultGameClockExtension is the amount of time that the dispute game will set the potential grandchild claim's, clock to, if the remaining time is less than this value at the time of a claim's creation.                                                                                        |
| `faultGameMaxClockDuration`       | number       | FaultGameMaxClockDuration is the maximum amount of time that may accumulate on a team's chess clock before they may no longer respond.                                                                                                                                                           |
| `faultGameGenesisBlock`           | number       | FaultGameGenesisBlock is the block number for genesis.                                                                                                                                                                                                                                           |
| `faultGameGenesisOutputRoot`      | 32-byte hash | FaultGameGenesisOutputRoot is the output root for the genesis block.                                                                                                                                                                                                                             |
| `faultGameSplitDepth`             | number       | FaultGameSplitDepth is the depth at which the fault dispute game splits from output roots to execution trace claims.                                                                                                                                                                             |
| `faultGameWithdrawalDelay`        | number       | FaultGameWithdrawalDelay is the number of seconds that users must wait before withdrawing ETH from a fault game.                                                                                                                                                                                 |
| `preimageOracleMinProposalSize`   | number       | PreimageOracleMinProposalSize is the minimum number of bytes that a large preimage oracle proposal can be.                                                                                                                                                                                       |
| `preimageOracleChallengePeriod`   | number       | PreimageOracleChallengePeriod is the number of seconds that challengers have to challenge a large preimage proposal.                                                                                                                                                                             |
| `proofMaturityDelaySeconds`       | number       | ProofMaturityDelaySeconds is the number of seconds that a proof must be mature before it can be used to finalize a withdrawal.                                                                                                                                                                   |
| `disputeGameFinalityDelaySeconds` | number       | DisputeGameFinalityDelaySeconds is an additional number of seconds a dispute game must wait before it can be used to finalize a withdrawal.                                                                                                                                                      |
| `respectedGameType`               | number       | RespectedGameType is the dispute game type that the OptimismPortal contract will respect for finalizing withdrawals.                                                                                                                                                                             |

### L1 dependency addresses

L1DependenciesConfig is the set of addresses that affect the L2 genesis construction, and is dependent on prior deployment of contracts to L1. This is generally not configured in deploy-config JSON, but rather merged in through a L1 deployments JSON file.

| JSON key                      | Type    | Description                                                                                                                                       |
| ----------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| `l1StandardBridgeProxy`       | address | L1StandardBridgeProxy represents the address of the L1StandardBridgeProxy on L1 and is used as part of building the L2 genesis state.             |
| `l1CrossDomainMessengerProxy` | address | L1CrossDomainMessengerProxy represents the address of the L1CrossDomainMessengerProxy on L1 and is used as part of building the L2 genesis state. |
| `l1ERC721BridgeProxy`         | address | L1ERC721BridgeProxy represents the address of the L1ERC721Bridge on L1 and is used as part of building the L2 genesis state.                      |
| `systemConfigProxy`           | address | SystemConfigProxy represents the address of the SystemConfigProxy on L1 and is used as part of the derivation pipeline.                           |
| `optimismPortalProxy`         | address | OptimismPortalProxy represents the address of the OptimismPortalProxy on L1 and is used as part of the derivation pipeline.                       |
| `daChallengeProxy`            | address | DAChallengeProxy represents the L1 address of the DataAvailabilityChallenge contract.                                                             |

### Legacy fields

LegacyDeployConfig retains legacy DeployConfig attributes. The genesis generation may log warnings, do a best-effort support attempt, or ignore these attributes completely.

| JSON key                      | Type   | Description                                                                                                                                    |
| ----------------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `deploymentWaitConfirmations` | number | DeploymentWaitConfirmations is the number of confirmations to wait during deployment. This is DEPRECATED and should be removed in a future PR. |
| `channelTimeoutGranite`       | number | —                                                                                                                                              |

## Guidance and standard-configuration requirements

The tables above are the exhaustive schema. This section carries the
hand-maintained guidance for the values chain operators most often need to
reason about: recommended values, validation constraints, and the
standard-configuration requirements from the draft
[Standard Rollup Charter](https://gov.optimism.io/t/season-6-draft-standard-rollup-charter/8135).

### Hardfork activation guidance

* The standard configuration requires network upgrades (hardforks) to be
  activated. New chains set each `l2Genesis<Fork>TimeOffset` to `"0x0"` so
  every governance-approved upgrade is active at genesis; a nil (omitted)
  offset disables the fork.
* Later forks cannot activate before earlier ones, and two forks cannot
  activate at the same post-genesis time.
* The interoperability hardfork activation offset is a non-standard feature:
  interoperability is still [experimental](https://specs.optimism.io/interop/overview.html?utm_source=op-docs\&utm_medium=docs).

### Roles and ownership requirements

* `finalSystemOwner`: must not be `address(0)`. It is recommended to have a
  single admin address to retain a common security model. Standard
  configuration: must be the Chain Governor or Servicer; however, the L1
  ProxyAdmin owner must be held by the Optimism Security Council. At the
  moment, the L1 ProxyAdmin owner is transferred from the Chain Governor or
  Servicer to [0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A](https://etherscan.io/address/0x5a0Aae59D09fccBdDb6C6CcEB07B7279367C3d2A).
* `proxyAdminOwner`: owns the `ProxyAdmin` predeploy on L2, which owns all of
  the Proxy contracts for every predeployed contract in the range
  `0x42...0000` to `0x42...2048`, making predeploys upgradeable. Must not be
  `address(0)`; a single admin address is recommended.
* `superchainConfigGuardian`: standard configuration requires
  [0x09f7150D8c019BeF34450d6920f6B3608ceFdAf2](https://etherscan.io/address/0x09f7150D8c019BeF34450d6920f6B3608ceFdAf2),
  a 1/1 Safe owned by the Security Council Safe, with the
  [Deputy Pause Module](https://specs.optimism.io/protocol/deputy-pause-module.html?utm_source=op-docs\&utm_medium=docs)
  enabled to allow the Optimism Foundation to act as Pause Deputy.
* `p2pSequencerAddress` and `batchSenderAddress`: hot-key addresses you
  control — the sequencer's block-signing key and the batcher account whose
  transactions to the batch inbox are considered valid. Neither may be
  `address(0)`. `batchSenderAddress` can be updated later via the
  `SystemConfig` contract on L1. No standard requirement.
* The [L1 dependency addresses](#l1-dependency-addresses)
  (`l1StandardBridgeProxy`, `l1CrossDomainMessengerProxy`,
  `l1ERC721BridgeProxy`, `systemConfigProxy`, `optimismPortalProxy`): filled
  in from the L1 deployment rather than hand-configured; none of them may be
  `address(0)`. Standard
  configuration requires the implementation contracts to be the most
  up-to-date, governance-approved version of the OP Stack codebase — and, if
  the chain has been upgraded in the past, that the previous versions were a
  standard release of the codebase.

### Sequencing and batching guidance

* `l2BlockTime`: must be nonzero, a whole number, and less than the L1 block
  time (12 seconds on Ethereum mainnet and Sepolia). Standard configuration:
  1 or 2 seconds.
* `maxSequencerDrift`: must be nonzero. 1800 (30 minutes) is the constant
  that takes effect with the
  [Fjord activation](/op-stack/protocol/network-upgrades#activations).
* `sequencerWindowSize`: must be nonzero. Standard configuration: 3\_600 base
  layer blocks (12 hours for an L2 on Ethereum, assuming 12 second L1
  blocktime). This is an important value for constraining the sequencer's
  ability to re-order transactions; higher values would pose a risk to user
  protections.
* `channelTimeout`: the default of 50 was introduced in the
  [Granite network upgrade](/op-stack/protocol/network-upgrades#activations).
* `batchInboxAddress`: standard configuration convention is
  `versionByte || keccak256(bytes32(chainId))[:19]`, where `||` denotes
  concatenation, `versionByte` is `0x00`, and `chainId` is a `uint256`. This
  covers the full range of chain IDs, up to the full `uint256` size:

  ```solidity theme={null}
  bytes32 hash = keccak256(abi.encodePacked(bytes32(uint256(chainId))));
  // take the first 19 bytes of the hash, then prepend a version byte of 0x00
  // batchInboxAddress = 0x00{hash[:19]}
  ```
* `systemConfigStartBlock`: standard configuration: the block where the
  `SystemConfig` was initialized.
* `l1StartingBlockTag`: it is generally recommended to use a finalized L1
  block to avoid issues with reorgs.

### Chain ID requirements

* `l1ChainID`: must be nonzero. 1 for Ethereum mainnet, 11155111 for the
  Sepolia test network; see [chainlist](https://chainlist.org/?testnets=true)
  for other networks. Standard configuration: 1 (Ethereum).
* `l2ChainID`: must be nonzero and, for security reasons, unique. Standard
  configuration: a Foundation-approved, globally unique value. Chains should
  add their chain IDs to
  [ethereum-lists/chains](https://github.com/ethereum-lists/chains).

### Gas and fee guidance

* `l2GenesisBlockGasLimit`: must be nonzero and greater than
  `MaxResourceLimit + SystemTxMaxGas` (the gas a deposit plus the system
  transaction can use). Standard configuration: no higher than 200\_000\_000
  gas; chain operators are driven to maintain a stable and reliable chain,
  so careful deliberation is necessary when considering a change.
* `l2GenesisBlockBaseFeePerGas`: cannot be nil.
* `gasPriceOracleBaseFeeScalar` and `gasPriceOracleBlobBaseFeeScalar`: should
  not be 0. Standard configuration: set such that the fee margin is between
  0 and 50%. See [transaction fees](/op-stack/transactions/fees) for how the
  scalars enter the fee calculation.
* `eip1559Elasticity` and `eip1559Denominator`: must be nonzero.
  `eip1559DenominatorCanyon` must be nonzero if Canyon is activated; 250 is
  the recommended value.
* `minBaseFee`: an absolute minimum base fee in wei, to help shorten the
  length of priority fee auctions; 0 disables it (the default). 100000 wei
  is the recommended value; setting the minimum too high may make
  transactions harder to get included for users. Standard configuration:
  must not be set higher than 10000000000 wei. See the
  [minimum base fee specs](https://specs.optimism.io/protocol/jovian/exec-engine.html#minimum-base-fee)
  for more detail.
* `daFootprintGasScalar`: multiplied by the DA usage estimate to limit the
  total estimated compressed transaction data that can fit into a block; 400
  is the recommended value. As of Jovian, the base fee update calculation
  uses `gasMetered := max(gasUsed, blobGasUsed)` in place of `gasUsed`, so
  blocks with high DA usage may cause the base fee to increase in subsequent
  blocks. See the
  [DA footprint block limit specs](https://specs.optimism.io/protocol/jovian/exec-engine.html#da-footprint-block-limit)
  for more detail.

### Fee vault guidance

* The `*FeeVaultRecipient` addresses must not be `address(0)`; a single
  admin address is recommended to retain a common security model.
* The `*FeeVaultWithdrawalNetwork` values choose where each vault withdraws:
  `"remote"` sends fees to the recipient address on L1, `"local"` on L2.
  Withdrawals to L1 are more expensive. Note that when the config is
  re-emitted (for example by `op-deployer inspect deploy-config`), these
  values marshal in the legacy numeric form: `0` for `"remote"`, `1` for
  `"local"`.
* The `*FeeVaultMinimumWithdrawalAmount` values exist because withdrawals to
  L1 are expensive: the minimum prevents the overhead cost of continuous
  tiny withdrawals that would cost more to execute than they return.

### Withdrawal finality guidance

* `finalizationPeriodSeconds`: must be nonzero. 12 seconds is recommended on
  test networks, seven days on production ones. Standard configuration: 7
  days — a high-security, excessively safe upper bound that leaves enough
  time to consider social-layer solutions to a hack if necessary, and allows
  other network participants to challenge the integrity of the corresponding
  output root.

### Legacy output-oracle guidance

These apply only to chains still on the legacy `L2OutputOracle` proposal
system; new chains use [fault proofs](#fault-proofs) instead.

* `l2OutputOracleSubmissionInterval`: must be nonzero; 120 blocks (4
  minutes) is suggested.
* `l2OutputOracleStartingBlockNumber`: should be 0 for new chains; may be
  non-zero for networks upgraded from a legacy system (like OP Mainnet).
* `l2OutputOracleStartingTimestamp`: MUST be the timestamp corresponding to
  the block defined by `l1StartingBlockTag`.
* `l2OutputOracleProposer`: must not be `address(0)`. No standard
  requirement. This role is only active when the `OptimismPortal` respected
  game type is `PERMISSIONED_CANNON`. The L1 ProxyAdmin sets the
  implementation of the `PERMISSIONED_CANNON` game type, and thus determines
  the proposer configuration of the permissioned dispute game.
* `l2OutputOracleChallenger`: must not be `address(0)`; a single admin
  address is recommended to retain a common security model.

### Fault-proof value guidance

You should understand the implications of running a fault-proof chain before
setting `useFaultProofs`; see the
[fault proofs explainer](/op-stack/fault-proofs/explainer).
`proofMaturityDelaySeconds` and `disputeGameFinalityDelaySeconds` should not
be 0. `faultGameMaxDepth` should be conservatively set so that there is always
enough room for a full Cannon trace.

### Alt-DA guidance

Alt-DA mode is a non-standard feature. It enables integration of Data
Availability layers into the OP Stack regardless of their commitment type; see
[Alt-DA mode](/op-stack/features/experimental/alt-da-mode).

* `daCommitmentType`: must be either `KeccakCommitment` or
  `GenericCommitment` (recommended); `KeccakCommitment` will be deprecated.
* `daChallengeWindow` and `daResolveWindow`: must be nonzero when using
  Alt-DA mode with Keccak commitments.
* `daChallengeProxy`: must not be `address(0)` when using Alt-DA mode with
  Keccak commitments, and must be `address(0)` with generic commitments.

### Governance and development settings

* `enableGovernance`: false is recommended; the governance token predeploy
  is exclusive to OP Mainnet and the testing of OP-Mainnet-like chains.
* `fundDevAccounts` and the [development L1 genesis](#development-l1-genesis)
  values are for devnet deployments only; a production L2 deployment does
  not use them, except for the `l1BlockTime` sanity check (12 for Ethereum).
