From c1a5d143f8e0bd0440ecda619a0556488562e961 Mon Sep 17 00:00:00 2001 From: Joshua Gutow Date: Thu, 28 Jul 2022 22:12:54 +0200 Subject: [PATCH 1/6] ops: Use starting L1 Block for timestamp everywhere This transitions the starting timestamp to a new flow. The L2 rollup is anchored on a L1 block. The L2 genesis block & rollup config use the timestamp of the L1 start block as the their time. Properly threading this through the HH tasks is a little tricky but possible. This is because we have two flows: creating a L1 network & placing the rollup on that and creating a rollup on an existing L1 network (like goerli). There is still a L1 starting time for the first flow. This also fixes a circular dependcy that previously existed. The starting timestamp was provided and served as the starting timestamp for the L1 genesis & the "L2 Starting Time" in the L2 Output Oracle. The actual L2 genesis & rollup start time were based on when the Optimism Portal contract was deployed (after the L2 Output Oracle contract must have been deployed). The rollup is resilient to being started before contracts are fully deployed, so using a specific L1 block as the start is the cleanest solution I have seen. --- ops-bedrock/devnet-up.sh | 12 ++++++------ .../contracts-bedrock/deploy-config/devnetL1.ts | 9 +++++---- packages/contracts-bedrock/deploy-config/goerli.ts | 5 +++-- .../contracts-bedrock/deploy-config/hardhat.ts | 9 +++++---- .../deploy/000-L2OutputOracle.deploy.ts | 14 ++++---------- packages/contracts-bedrock/hardhat.config.ts | 9 +++------ packages/contracts-bedrock/tasks/genesis-l1.ts | 2 +- packages/contracts-bedrock/tasks/genesis-l2.ts | 3 +-- packages/contracts-bedrock/tasks/rollup-config.ts | 6 +++--- 9 files changed, 31 insertions(+), 38 deletions(-) diff --git a/ops-bedrock/devnet-up.sh b/ops-bedrock/devnet-up.sh index 3e562cfc3f0c..f98db3c4a06d 100755 --- a/ops-bedrock/devnet-up.sh +++ b/ops-bedrock/devnet-up.sh @@ -58,9 +58,9 @@ function wait_up { mkdir -p ./.devnet if [ ! -f ./.devnet/rollup.json ]; then - GENESIS_TIMESTAMP=$(date +%s | xargs printf "0x%x") + L1_GENESIS_TIMESTAMP=$(date +%s | xargs printf "0x%x") else - GENESIS_TIMESTAMP=$(jq '.timestamp' < .devnet/genesis-l1.json) + L1_GENESIS_TIMESTAMP=$(jq '.timestamp' < .devnet/genesis-l1.json) fi # Regenerate the L1 genesis file if necessary. The existence of the genesis @@ -69,7 +69,7 @@ if [ ! -f ./.devnet/genesis-l1.json ]; then echo "Regenerating L1 genesis." ( cd $CONTRACTS_BEDROCK - L2OO_STARTING_BLOCK_TIMESTAMP=$GENESIS_TIMESTAMP npx hardhat genesis-l1 \ + L1_GENESIS_TIMESTAMP=$L1_GENESIS_TIMESTAMP npx hardhat genesis-l1 \ --outfile genesis-l1.json mv genesis-l1.json ../../.devnet/genesis-l1.json ) @@ -89,7 +89,7 @@ if [ ! -d $CONTRACTS_BEDROCK/deployments/$NETWORK ]; then ( echo "Deploying contracts." cd $CONTRACTS_BEDROCK - L2OO_STARTING_BLOCK_TIMESTAMP=$GENESIS_TIMESTAMP yarn hardhat --network $NETWORK deploy + L1_GENESIS_TIMESTAMP=$L1_GENESIS_TIMESTAMP yarn hardhat --network $NETWORK deploy ) else echo "Contracts already deployed, skipping." @@ -99,7 +99,7 @@ if [ ! -f ./.devnet/genesis-l2.json ]; then ( echo "Creating L2 genesis file." cd $CONTRACTS_BEDROCK - L2OO_STARTING_BLOCK_TIMESTAMP=$GENESIS_TIMESTAMP npx hardhat --network $NETWORK genesis-l2 + L1_GENESIS_TIMESTAMP=$L1_GENESIS_TIMESTAMP npx hardhat --network $NETWORK genesis-l2 mv genesis.json ../../.devnet/genesis-l2.json echo "Created L2 genesis." ) @@ -120,7 +120,7 @@ if [ ! -f ./.devnet/rollup.json ]; then ( echo "Building rollup config..." cd $CONTRACTS_BEDROCK - L2OO_STARTING_BLOCK_TIMESTAMP=$GENESIS_TIMESTAMP npx hardhat --network $NETWORK rollup-config + L1_GENESIS_TIMESTAMP=$L1_GENESIS_TIMESTAMP npx hardhat --network $NETWORK rollup-config mv rollup.json ../../.devnet/rollup.json ) else diff --git a/packages/contracts-bedrock/deploy-config/devnetL1.ts b/packages/contracts-bedrock/deploy-config/devnetL1.ts index b52637588c79..183398b51331 100644 --- a/packages/contracts-bedrock/deploy-config/devnetL1.ts +++ b/packages/contracts-bedrock/deploy-config/devnetL1.ts @@ -2,19 +2,20 @@ import { ethers } from 'ethers' const { env } = process -const startingTimestamp = - typeof env.L2OO_STARTING_BLOCK_TIMESTAMP === 'string' - ? ethers.BigNumber.from(env.L2OO_STARTING_BLOCK_TIMESTAMP).toNumber() +const l1GenesisTimestamp = + typeof env.L1_GENESIS_TIMESTAMP === 'string' + ? ethers.BigNumber.from(env.L1_GENESIS_TIMESTAMP).toNumber() : Math.floor(Date.now() / 1000) const config = { submissionInterval: 6, genesisOutput: ethers.constants.HashZero, historicalBlocks: 0, + l1StartingBlockTag: 'earliest', startingBlockNumber: 0, l2BlockTime: 2, - startingTimestamp, + l1GenesisTimestamp, sequencerAddress: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', l2CrossDomainMessengerOwner: ethers.constants.AddressZero, diff --git a/packages/contracts-bedrock/deploy-config/goerli.ts b/packages/contracts-bedrock/deploy-config/goerli.ts index 3398fd6eb33c..57c69294d5d9 100644 --- a/packages/contracts-bedrock/deploy-config/goerli.ts +++ b/packages/contracts-bedrock/deploy-config/goerli.ts @@ -1,7 +1,8 @@ import { ethers } from 'ethers' + const sequencerAddress = '0x6c23a0dcdfc44b7a57bed148de598895e398d984' -const startingTimestamp = 1658777882 +const l1StartingBlockTag = '' const config = { submissionInterval: 6, @@ -9,7 +10,7 @@ const config = { historicalBlocks: 0, startingBlockNumber: 0, l2BlockTime: 2, - startingTimestamp, + l1StartingBlockTag, sequencerAddress, l2CrossDomainMessengerOwner: ethers.constants.AddressZero, diff --git a/packages/contracts-bedrock/deploy-config/hardhat.ts b/packages/contracts-bedrock/deploy-config/hardhat.ts index 217c63a20321..596c5b03c625 100644 --- a/packages/contracts-bedrock/deploy-config/hardhat.ts +++ b/packages/contracts-bedrock/deploy-config/hardhat.ts @@ -2,9 +2,9 @@ import { ethers } from 'ethers' const { env } = process -const startingTimestamp = - typeof env.L2OO_STARTING_BLOCK_TIMESTAMP === 'string' - ? ethers.BigNumber.from(env.L2OO_STARTING_BLOCK_TIMESTAMP).toNumber() +const l1GenesisTimestamp = + typeof env.L1_GENESIS_TIMESTAMP === 'string' + ? ethers.BigNumber.from(env.L1_GENESIS_TIMESTAMP).toNumber() : Math.floor(Date.now() / 1000) const config = { @@ -12,8 +12,9 @@ const config = { genesisOutput: ethers.constants.HashZero, historicalBlocks: 0, startingBlockNumber: 0, + l1StartingBlockTag: 'earliest', l2BlockTime: 2, - startingTimestamp, + l1GenesisTimestamp, sequencerAddress: '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', maxSequencerDrift: 10, sequencerWindowSize: 4, diff --git a/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts b/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts index 0cc44305e7b0..5eda929a2533 100644 --- a/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts +++ b/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts @@ -10,14 +10,8 @@ const deployFn: DeployFunction = async (hre) => { const { deployer } = await hre.getNamedAccounts() const { deployConfig } = hre - if ( - typeof deployConfig.startingTimestamp !== 'number' || - isNaN(deployConfig.startingTimestamp) - ) { - throw new Error( - 'Cannot deploy L2OutputOracle without specifying a valid startingTimestamp.' - ) - } + const l1 = hre.ethers.getDefaultProvider() + const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag) await deploy('L2OutputOracleProxy', { contract: 'Proxy', @@ -34,7 +28,7 @@ const deployFn: DeployFunction = async (hre) => { deployConfig.genesisOutput, deployConfig.historicalBlocks, deployConfig.startingBlockNumber, - deployConfig.startingTimestamp, + l1StartingBlock.timestamp, deployConfig.l2BlockTime, deployConfig.sequencerAddress, deployConfig.outputOracleOwner, @@ -84,7 +78,7 @@ const deployFn: DeployFunction = async (hre) => { } const startingTimestamp = await L2OutputOracle.STARTING_TIMESTAMP() - if (!startingTimestamp.eq(BigNumber.from(deployConfig.startingTimestamp))) { + if (!startingTimestamp.eq(BigNumber.from(l1StartingBlock.timestamp))) { throw new Error('starting timestamp misconfigured') } const l2BlockTime = await L2OutputOracle.L2_BLOCK_TIME() diff --git a/packages/contracts-bedrock/hardhat.config.ts b/packages/contracts-bedrock/hardhat.config.ts index ac1579be21e7..f197799bd8f6 100644 --- a/packages/contracts-bedrock/hardhat.config.ts +++ b/packages/contracts-bedrock/hardhat.config.ts @@ -72,18 +72,15 @@ const config: HardhatUserConfig = { historicalBlocks: { type: 'number', }, - startingBlockNumber: { - type: 'number', - }, - startingTimestamp: { - type: 'number', - }, sequencerAddress: { type: 'address', }, outputOracleOwner: { type: 'address', }, + l1StartingBlockTag: { + type: 'string', + }, }, external: { contracts: [ diff --git a/packages/contracts-bedrock/tasks/genesis-l1.ts b/packages/contracts-bedrock/tasks/genesis-l1.ts index e01043582f54..deac7649c116 100644 --- a/packages/contracts-bedrock/tasks/genesis-l1.ts +++ b/packages/contracts-bedrock/tasks/genesis-l1.ts @@ -61,7 +61,7 @@ task('genesis-l1', 'create a genesis config') } } - const timestamp = hre.deployConfig.startingTimestamp + const timestamp = hre.deployConfig.l1GenesisTimestamp if (timestamp === undefined) { throw new Error('Must configure starting block timestamp') } diff --git a/packages/contracts-bedrock/tasks/genesis-l2.ts b/packages/contracts-bedrock/tasks/genesis-l2.ts index 7aa1d1fab1fb..8c7d2b659266 100644 --- a/packages/contracts-bedrock/tasks/genesis-l2.ts +++ b/packages/contracts-bedrock/tasks/genesis-l2.ts @@ -270,8 +270,7 @@ task('genesis-l2', 'create a genesis config') } } - const portal = await hre.deployments.get('OptimismPortalProxy') - const l1StartingBlock = await l1.getBlock(portal.receipt.blockHash) + const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag) const genesis: OptimismGenesis = { config: { diff --git a/packages/contracts-bedrock/tasks/rollup-config.ts b/packages/contracts-bedrock/tasks/rollup-config.ts index 268d2b39e47f..540db994ed52 100644 --- a/packages/contracts-bedrock/tasks/rollup-config.ts +++ b/packages/contracts-bedrock/tasks/rollup-config.ts @@ -23,13 +23,13 @@ task('rollup-config', 'create a genesis config') const l2Genesis = await l2.getBlock('earliest') const portal = await hre.deployments.get('OptimismPortalProxy') - const l1StartingBlock = await l1.getBlock(portal.receipt.blockHash) + const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag) const config: OpNodeConfig = { genesis: { l1: { - hash: portal.receipt.blockHash, - number: portal.receipt.blockNumber, + hash: l1StartingBlock.hash, + number: l1StartingBlock.number, }, l2: { hash: l2Genesis.hash, From 50960955c90dd8d7e2ed31967d323462bfba3c71 Mon Sep 17 00:00:00 2001 From: Matthew Slipper Date: Fri, 29 Jul 2022 08:03:15 -0600 Subject: [PATCH 2/6] Fix lint --- packages/contracts-bedrock/deploy-config/goerli.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/contracts-bedrock/deploy-config/goerli.ts b/packages/contracts-bedrock/deploy-config/goerli.ts index 57c69294d5d9..673db6ad0a67 100644 --- a/packages/contracts-bedrock/deploy-config/goerli.ts +++ b/packages/contracts-bedrock/deploy-config/goerli.ts @@ -1,6 +1,5 @@ import { ethers } from 'ethers' - const sequencerAddress = '0x6c23a0dcdfc44b7a57bed148de598895e398d984' const l1StartingBlockTag = '' From e504528a97a5c27abcabc2c4626643ecadc73097 Mon Sep 17 00:00:00 2001 From: Joshua Gutow Date: Fri, 29 Jul 2022 10:27:03 -0700 Subject: [PATCH 3/6] Update packages/contracts-bedrock/deploy-config/goerli.ts --- packages/contracts-bedrock/deploy-config/goerli.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/contracts-bedrock/deploy-config/goerli.ts b/packages/contracts-bedrock/deploy-config/goerli.ts index 673db6ad0a67..ae022661da5c 100644 --- a/packages/contracts-bedrock/deploy-config/goerli.ts +++ b/packages/contracts-bedrock/deploy-config/goerli.ts @@ -1,7 +1,7 @@ import { ethers } from 'ethers' const sequencerAddress = '0x6c23a0dcdfc44b7a57bed148de598895e398d984' -const l1StartingBlockTag = '' +const l1StartingBlockTag = '0xafce66a0a2446856112e4069b275ad32b1f4a607888f9c4c59eddf9be81f8670' const config = { submissionInterval: 6, From 6f1184d6f6ac05bd4a53b04ace6d7ad52040db8e Mon Sep 17 00:00:00 2001 From: Joshua Gutow Date: Fri, 29 Jul 2022 11:54:00 -0700 Subject: [PATCH 4/6] Add undefined checks to l1StartingBlockTag --- packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts | 3 +++ packages/contracts-bedrock/tasks/genesis-l2.ts | 3 +++ packages/contracts-bedrock/tasks/rollup-config.ts | 3 +++ 3 files changed, 9 insertions(+) diff --git a/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts b/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts index 5eda929a2533..e46280d9df1d 100644 --- a/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts +++ b/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts @@ -11,6 +11,9 @@ const deployFn: DeployFunction = async (hre) => { const { deployConfig } = hre const l1 = hre.ethers.getDefaultProvider() + if (deployConfig.l1StartingBlockTag === undefined) { + throw new Error("must provide L1 Starting Block Tag") + } const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag) await deploy('L2OutputOracleProxy', { diff --git a/packages/contracts-bedrock/tasks/genesis-l2.ts b/packages/contracts-bedrock/tasks/genesis-l2.ts index 8c7d2b659266..8c1e006d8610 100644 --- a/packages/contracts-bedrock/tasks/genesis-l2.ts +++ b/packages/contracts-bedrock/tasks/genesis-l2.ts @@ -270,6 +270,9 @@ task('genesis-l2', 'create a genesis config') } } + if (deployConfig.l1StartingBlockTag === undefined) { + throw new Error("must provide L1 Starting Block Tag") + } const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag) const genesis: OptimismGenesis = { diff --git a/packages/contracts-bedrock/tasks/rollup-config.ts b/packages/contracts-bedrock/tasks/rollup-config.ts index 540db994ed52..680214273b4c 100644 --- a/packages/contracts-bedrock/tasks/rollup-config.ts +++ b/packages/contracts-bedrock/tasks/rollup-config.ts @@ -23,6 +23,9 @@ task('rollup-config', 'create a genesis config') const l2Genesis = await l2.getBlock('earliest') const portal = await hre.deployments.get('OptimismPortalProxy') + if (deployConfig.l1StartingBlockTag === undefined) { + throw new Error("must provide L1 Starting Block Tag") + } const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag) const config: OpNodeConfig = { From aa6710d642ad47ddaffa2bf2457db4f2beaf631b Mon Sep 17 00:00:00 2001 From: Joshua Gutow Date: Fri, 29 Jul 2022 11:56:02 -0700 Subject: [PATCH 5/6] lint --- packages/contracts-bedrock/deploy-config/goerli.ts | 3 ++- .../contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts | 2 +- packages/contracts-bedrock/tasks/genesis-l2.ts | 2 +- packages/contracts-bedrock/tasks/rollup-config.ts | 2 +- packages/contracts-bedrock/tsconfig.json | 4 +--- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/contracts-bedrock/deploy-config/goerli.ts b/packages/contracts-bedrock/deploy-config/goerli.ts index ae022661da5c..93347179520e 100644 --- a/packages/contracts-bedrock/deploy-config/goerli.ts +++ b/packages/contracts-bedrock/deploy-config/goerli.ts @@ -1,7 +1,8 @@ import { ethers } from 'ethers' const sequencerAddress = '0x6c23a0dcdfc44b7a57bed148de598895e398d984' -const l1StartingBlockTag = '0xafce66a0a2446856112e4069b275ad32b1f4a607888f9c4c59eddf9be81f8670' +const l1StartingBlockTag = + '0xafce66a0a2446856112e4069b275ad32b1f4a607888f9c4c59eddf9be81f8670' const config = { submissionInterval: 6, diff --git a/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts b/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts index e46280d9df1d..c070d8061f9c 100644 --- a/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts +++ b/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts @@ -12,7 +12,7 @@ const deployFn: DeployFunction = async (hre) => { const l1 = hre.ethers.getDefaultProvider() if (deployConfig.l1StartingBlockTag === undefined) { - throw new Error("must provide L1 Starting Block Tag") + throw new Error('must provide L1 Starting Block Tag') } const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag) diff --git a/packages/contracts-bedrock/tasks/genesis-l2.ts b/packages/contracts-bedrock/tasks/genesis-l2.ts index 8c1e006d8610..84a70e025e33 100644 --- a/packages/contracts-bedrock/tasks/genesis-l2.ts +++ b/packages/contracts-bedrock/tasks/genesis-l2.ts @@ -271,7 +271,7 @@ task('genesis-l2', 'create a genesis config') } if (deployConfig.l1StartingBlockTag === undefined) { - throw new Error("must provide L1 Starting Block Tag") + throw new Error('must provide L1 Starting Block Tag') } const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag) diff --git a/packages/contracts-bedrock/tasks/rollup-config.ts b/packages/contracts-bedrock/tasks/rollup-config.ts index 680214273b4c..e5c489c119c9 100644 --- a/packages/contracts-bedrock/tasks/rollup-config.ts +++ b/packages/contracts-bedrock/tasks/rollup-config.ts @@ -24,7 +24,7 @@ task('rollup-config', 'create a genesis config') const portal = await hre.deployments.get('OptimismPortalProxy') if (deployConfig.l1StartingBlockTag === undefined) { - throw new Error("must provide L1 Starting Block Tag") + throw new Error('must provide L1 Starting Block Tag') } const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag) diff --git a/packages/contracts-bedrock/tsconfig.json b/packages/contracts-bedrock/tsconfig.json index 5cb4fda3c546..e5df8a66de31 100644 --- a/packages/contracts-bedrock/tsconfig.json +++ b/packages/contracts-bedrock/tsconfig.json @@ -4,7 +4,5 @@ "rootDir": "./src", "outDir": "./dist" }, - "include": [ - "src/**/*" - ] + "include": ["src/**/*"] } From 427c0c2e3963452b264afbb2de5fa1a68503eb79 Mon Sep 17 00:00:00 2001 From: Joshua Gutow Date: Fri, 29 Jul 2022 12:21:54 -0700 Subject: [PATCH 6/6] fix checks --- .../contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts | 6 +++--- packages/contracts-bedrock/tasks/genesis-l2.ts | 8 +++++--- packages/contracts-bedrock/tasks/rollup-config.ts | 8 +++++--- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts b/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts index c070d8061f9c..c7602623ebc9 100644 --- a/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts +++ b/packages/contracts-bedrock/deploy/000-L2OutputOracle.deploy.ts @@ -11,10 +11,10 @@ const deployFn: DeployFunction = async (hre) => { const { deployConfig } = hre const l1 = hre.ethers.getDefaultProvider() - if (deployConfig.l1StartingBlockTag === undefined) { - throw new Error('must provide L1 Starting Block Tag') - } const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag) + if (l1StartingBlock === null) { + throw new Error(`Cannot fetch block tag ${deployConfig.l1StartingBlockTag}`) + } await deploy('L2OutputOracleProxy', { contract: 'Proxy', diff --git a/packages/contracts-bedrock/tasks/genesis-l2.ts b/packages/contracts-bedrock/tasks/genesis-l2.ts index 84a70e025e33..fe872216109a 100644 --- a/packages/contracts-bedrock/tasks/genesis-l2.ts +++ b/packages/contracts-bedrock/tasks/genesis-l2.ts @@ -270,10 +270,12 @@ task('genesis-l2', 'create a genesis config') } } - if (deployConfig.l1StartingBlockTag === undefined) { - throw new Error('must provide L1 Starting Block Tag') - } const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag) + if (l1StartingBlock === null) { + throw new Error( + `Cannot fetch block tag ${deployConfig.l1StartingBlockTag}` + ) + } const genesis: OptimismGenesis = { config: { diff --git a/packages/contracts-bedrock/tasks/rollup-config.ts b/packages/contracts-bedrock/tasks/rollup-config.ts index e5c489c119c9..f80b0d523341 100644 --- a/packages/contracts-bedrock/tasks/rollup-config.ts +++ b/packages/contracts-bedrock/tasks/rollup-config.ts @@ -23,10 +23,12 @@ task('rollup-config', 'create a genesis config') const l2Genesis = await l2.getBlock('earliest') const portal = await hre.deployments.get('OptimismPortalProxy') - if (deployConfig.l1StartingBlockTag === undefined) { - throw new Error('must provide L1 Starting Block Tag') - } const l1StartingBlock = await l1.getBlock(deployConfig.l1StartingBlockTag) + if (l1StartingBlock === null) { + throw new Error( + `Cannot fetch block tag ${deployConfig.l1StartingBlockTag}` + ) + } const config: OpNodeConfig = { genesis: {