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 below.
The recommended way to deploy an OP Stack chain is OP Deployer.
OP Deployer takes a declarative intent file (
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
OP Deployer also supports.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) describe the legacy L2OutputOracle proposal system and apply only to chains still on that system. Chains using permissionless fault proofs — the standard configuration for new OP Stack chains — set the fault-proof deployment values instead: useFaultProofs together with the faultGame*, preimageOracle*, proofMaturityDelaySeconds, disputeGameFinalityDelaySeconds, and respectedGameType fields.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
and the actual requirements in the OP Stack Configurability Specification.
Configuration values
Generated from theDeployConfig struct
in op-chain-ops/genesis at op-deployer/v0.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
L2 genesis block
Ownership
OwnershipDeployConfig defines the ownership of an L2 chain deployment. This excludes superchain-wide contracts.Fee vaults
Governance token
GovernanceDeployConfig is exclusive to OP-Mainnet and the testing of OP-Mainnet-like chains.Gas price oracle
GasPriceOracleDeployConfig configures the GasPriceOracle L2 predeploy.Custom gas token
GasTokenDeployConfig configures the optional custom gas token functionality.Operator addresses
OperatorDeployConfig configures the hot-key addresses for operations such as sequencing and batch-submission.EIP-1559 fee market
EIP1559DeployConfig configures the EIP-1559 parameters of the chain.Network upgrade (hardfork) activations
UpgradeScheduleDeployConfig configures when network upgrades activate.Core protocol parameters
L2CoreDeployConfig configures the core protocol parameters of the chain.Fee market limits
Alt-DA mode
AltDADeployConfig configures optional AltDA functionality.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).L1 starting block
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.Legacy output oracle
OutputOracleDeployConfig configures the legacy OutputOracle deployment to L1. This is obsoleted with Fault Proofs. See FaultProofDeployConfig.Fault proofs
FaultProofDeployConfig configures the fault-proof deployment to L1.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.Legacy fields
LegacyDeployConfig retains legacy DeployConfig attributes. The genesis generation may log warnings, do a best-effort support attempt, or ignore these attributes completely.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.Hardfork activation guidance
- The standard configuration requires network upgrades (hardforks) to be
activated. New chains set each
l2Genesis<Fork>TimeOffsetto"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.
Roles and ownership requirements
finalSystemOwner: must not beaddress(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.proxyAdminOwner: owns theProxyAdminpredeploy on L2, which owns all of the Proxy contracts for every predeployed contract in the range0x42...0000to0x42...2048, making predeploys upgradeable. Must not beaddress(0); a single admin address is recommended.superchainConfigGuardian: standard configuration requires 0x09f7150D8c019BeF34450d6920f6B3608ceFdAf2, a 1/1 Safe owned by the Security Council Safe, with the Deputy Pause Module enabled to allow the Optimism Foundation to act as Pause Deputy.p2pSequencerAddressandbatchSenderAddress: 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 beaddress(0).batchSenderAddresscan be updated later via theSystemConfigcontract on L1. No standard requirement.- The L1 dependency addresses
(
l1StandardBridgeProxy,l1CrossDomainMessengerProxy,l1ERC721BridgeProxy,systemConfigProxy,optimismPortalProxy): filled in from the L1 deployment rather than hand-configured; none of them may beaddress(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. -
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. -
batchInboxAddress: standard configuration convention isversionByte || keccak256(bytes32(chainId))[:19], where||denotes concatenation,versionByteis0x00, andchainIdis auint256. This covers the full range of chain IDs, up to the fulluint256size: -
systemConfigStartBlock: standard configuration: the block where theSystemConfigwas 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 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.
Gas and fee guidance
l2GenesisBlockGasLimit: must be nonzero and greater thanMaxResourceLimit + 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.gasPriceOracleBaseFeeScalarandgasPriceOracleBlobBaseFeeScalar: should not be 0. Standard configuration: set such that the fee margin is between 0 and 50%. See transaction fees for how the scalars enter the fee calculation.eip1559Elasticityandeip1559Denominator: must be nonzero.eip1559DenominatorCanyonmust 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 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 usesgasMetered := max(gasUsed, blobGasUsed)in place ofgasUsed, so blocks with high DA usage may cause the base fee to increase in subsequent blocks. See the DA footprint block limit specs for more detail.
Fee vault guidance
- The
*FeeVaultRecipientaddresses must not beaddress(0); a single admin address is recommended to retain a common security model. - The
*FeeVaultWithdrawalNetworkvalues 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 byop-deployer inspect deploy-config), these values marshal in the legacy numeric form:0for"remote",1for"local". - The
*FeeVaultMinimumWithdrawalAmountvalues 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 legacyL2OutputOracle proposal
system; new chains use 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 byl1StartingBlockTag.l2OutputOracleProposer: must not beaddress(0). No standard requirement. This role is only active when theOptimismPortalrespected game type isPERMISSIONED_CANNON. The L1 ProxyAdmin sets the implementation of thePERMISSIONED_CANNONgame type, and thus determines the proposer configuration of the permissioned dispute game.l2OutputOracleChallenger: must not beaddress(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 settinguseFaultProofs; see the
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.daCommitmentType: must be eitherKeccakCommitmentorGenericCommitment(recommended);KeccakCommitmentwill be deprecated.daChallengeWindowanddaResolveWindow: must be nonzero when using Alt-DA mode with Keccak commitments.daChallengeProxy: must not beaddress(0)when using Alt-DA mode with Keccak commitments, and must beaddress(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.fundDevAccountsand the development L1 genesis values are for devnet deployments only; a production L2 deployment does not use them, except for thel1BlockTimesanity check (12 for Ethereum).