diff --git a/op-chain-ops/genesis/config.go b/op-chain-ops/genesis/config.go index c91b5bc42..d5cd937c2 100644 --- a/op-chain-ops/genesis/config.go +++ b/op-chain-ops/genesis/config.go @@ -694,7 +694,8 @@ func (d *DeployConfig) WrightTime(genesisTime uint64) *uint64 { // RollupConfig converts a DeployConfig to a rollup.Config. If Ecotone is active at genesis, the // Overhead value is considered a noop. -func (d *DeployConfig) RollupConfig(l1StartBlock *types.Block, l2GenesisBlockHash common.Hash, l2GenesisBlockNumber uint64) (*rollup.Config, error) { +func (d *DeployConfig) RollupConfig(l1StartBlock *types.Block, l2GenesisBlockHash common.Hash, l2GenesisBlockNumber uint64, + l2GenesisStateRoot common.Hash) (*rollup.Config, error) { if d.OptimismPortalProxy == (common.Address{}) { return nil, errors.New("OptimismPortalProxy cannot be address(0)") } @@ -728,6 +729,7 @@ func (d *DeployConfig) RollupConfig(l1StartBlock *types.Block, l2GenesisBlockHas Scalar: eth.Bytes32(d.FeeScalar()), GasLimit: uint64(d.L2GenesisBlockGasLimit), }, + L2GenesisStateRoot: l2GenesisStateRoot, }, BlockTime: d.L2BlockTime, MaxSequencerDrift: d.MaxSequencerDrift, diff --git a/op-e2e/op_geth.go b/op-e2e/op_geth.go index d356068cf..fdf8664c8 100644 --- a/op-e2e/op_geth.go +++ b/op-e2e/op_geth.go @@ -104,7 +104,8 @@ func NewOpGeth(t testing.TB, ctx context.Context, cfg *SystemConfig) (*OpGeth, e require.NoError(t, err) // Finally create the engine client - rollupCfg, err := cfg.DeployConfig.RollupConfig(l1Block, l2GenesisBlock.Hash(), l2GenesisBlock.NumberU64()) + rollupCfg, err := cfg.DeployConfig.RollupConfig(l1Block, l2GenesisBlock.Hash(), l2GenesisBlock.NumberU64(), + l2GenesisBlock.Header().Root) require.NoError(t, err) rollupCfg.Genesis = rollupGenesis l2Engine, err := sources.NewEngineClient( diff --git a/op-node/cmd/genesis/cmd.go b/op-node/cmd/genesis/cmd.go index 6d3d68744..b144dbf91 100644 --- a/op-node/cmd/genesis/cmd.go +++ b/op-node/cmd/genesis/cmd.go @@ -225,7 +225,8 @@ var Subcommands = cli.Commands{ } l2GenesisBlock := l2Genesis.ToBlock() - rollupConfig, err := config.RollupConfig(l1StartBlock, l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64()) + rollupConfig, err := config.RollupConfig(l1StartBlock, l2GenesisBlock.Hash(), l2GenesisBlock.Number().Uint64(), + l2GenesisBlock.Header().Root) if err != nil { return err } diff --git a/op-node/rollup/types.go b/op-node/rollup/types.go index b8658a96d..21349b1b2 100644 --- a/op-node/rollup/types.go +++ b/op-node/rollup/types.go @@ -54,6 +54,8 @@ type Genesis struct { // The L2 genesis block may not include transactions, and thus cannot encode the config values, // unlike later L2 blocks. SystemConfig eth.SystemConfig `json:"system_config"` + // The genesis state root of L2 genesis block + L2GenesisStateRoot common.Hash `json:"l2_genesis_state_root,omitempty"` } type PlasmaConfig struct {