From 84c45bc3217ac21d47d4b548f2b5e5165baaa21c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Wed, 8 Oct 2025 09:17:54 +0200 Subject: [PATCH 01/19] Add flag and help --- test-node.bash | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test-node.bash b/test-node.bash index 79912d93..0928e274 100755 --- a/test-node.bash +++ b/test-node.bash @@ -60,6 +60,7 @@ devprivkey=b6b15c8cb491557369f3c7d2c287b053eb229daa9c22138887752191c9520659 l1chainid=1337 simple=true l2anytrust=false +l2referenceda=false l2timeboost=false # Use the dev versions of nitro/blockscout @@ -262,6 +263,10 @@ while [[ $# -gt 0 ]]; do l2anytrust=true shift ;; + --l2-referenceda) + l2referenceda=true + shift + ;; --l2-timeboost) l2timeboost=true shift @@ -301,6 +306,7 @@ while [[ $# -gt 0 ]]; do echo --l3-fee-token-decimals Number of decimals to use for custom fee token. Only valid if also '--l3-fee-token' is provided echo --l3-token-bridge Deploy L2-L3 token bridge. Only valid if also '--l3node' is provided echo --l2-anytrust run the L2 as an AnyTrust chain + echo --l2-referenceda run the L2 with reference external data availability provider echo --l2-timeboost run the L2 with Timeboost enabled, including auctioneer and bid validator echo --batchposters batch posters [0-3] echo --redundantsequencers redundant sequencers [0-3] From 26011c83a006cce6c20a42220d37945c3b5faed8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Wed, 8 Oct 2025 10:54:00 +0200 Subject: [PATCH 02/19] Add new service --- docker-compose.yaml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docker-compose.yaml b/docker-compose.yaml index d2a082ae..7013a303 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -431,6 +431,18 @@ services: command: - --conf.file=/config/l2_das_mirror.json + referenceda-provider: + pid: host # allow debugging + image: nitro-node-dev-testnode + entrypoint: /usr/local/bin/daprovider + ports: + - "127.0.0.1:9880:9880" + volumes: + - "config:/config" + - "referenceda-provider:/data" + command: + - --conf.file=/config/referenceda_provider.json + timeboost-auctioneer: pid: host # allow debugging image: nitro-node-dev-testnode @@ -481,4 +493,5 @@ volumes: das-committee-a-data: das-committee-b-data: das-mirror-data: + referenceda-provider: timeboost-auctioneer-data: From 704b1d03063a47c93110e9ed389a200b9018557f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Wed, 8 Oct 2025 10:54:19 +0200 Subject: [PATCH 03/19] Ensure that at most 1 mode is selected --- test-node.bash | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test-node.bash b/test-node.bash index 0928e274..04eaf2e9 100755 --- a/test-node.bash +++ b/test-node.bash @@ -357,6 +357,10 @@ if [ $batchposters -gt 2 ]; then NODES="$NODES poster_c" fi +if $l2anytrust && $l2referenceda; then + echo "Error: --l2-anytrust and --l2-referenceda cannot be enabled at the same time." + exit 1 +fi if $validate; then NODES="$NODES validator" From 9dd13b8478fec9c28e13aebd8374e0a4c1b115b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Wed, 8 Oct 2025 11:12:04 +0200 Subject: [PATCH 04/19] Write chain config --- scripts/config.ts | 7 ++++++- test-node.bash | 9 ++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/scripts/config.ts b/scripts/config.ts index 7eb256e2..c342a0bb 100644 --- a/scripts/config.ts +++ b/scripts/config.ts @@ -407,7 +407,7 @@ function writeL2ChainConfig(argv: any) { "arbitrum": { "EnableArbOS": true, "AllowDebugPrecompiles": true, - "DataAvailabilityCommittee": argv.anytrust, + "DataAvailabilityCommittee": argv.anytrust || argv.referenceda, "InitialArbOSVersion": 40, "InitialChainOwner": argv.l2owner, "GenesisBlockNum": 0 @@ -650,6 +650,11 @@ export const writeL2ChainConfigCommand = { describe: "enable anytrust in chainconfig", default: false }, + referenceda: { + boolean: true, + describe: "enable reference DA in chainconfig", + default: false + } }, handler: (argv: any) => { writeL2ChainConfig(argv) diff --git a/test-node.bash b/test-node.bash index 04eaf2e9..084cce9a 100755 --- a/test-node.bash +++ b/test-node.bash @@ -493,10 +493,13 @@ if $force_init; then if $l2anytrust; then echo "== Writing l2 chain config (anytrust enabled)" - run_script --l2owner $l2ownerAddress write-l2-chain-config --anytrust + run_script --l2owner $l2ownerAddress write-l2-chain-config --anytrust + elif $l2referenceda; then + echo "== Writing l2 chain config (reference da enabled)" + run_script --l2owner $l2ownerAddress write-l2-chain-config --referenceda else - echo == Writing l2 chain config - run_script --l2owner $l2ownerAddress write-l2-chain-config + echo "== Writing l2 chain config" + run_script --l2owner $l2ownerAddress write-l2-chain-config fi sequenceraddress=`run_script print-address --account sequencer | tail -n 1 | tr -d '\r\n'` From 0c5e35ba64d58c42cd6ca83f5f3d80772d1e6b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Wed, 8 Oct 2025 11:39:55 +0200 Subject: [PATCH 05/19] Unify argument to chain config command --- scripts/config.ts | 11 +++-------- test-node.bash | 9 +++------ 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/scripts/config.ts b/scripts/config.ts index c342a0bb..f8864a22 100644 --- a/scripts/config.ts +++ b/scripts/config.ts @@ -407,7 +407,7 @@ function writeL2ChainConfig(argv: any) { "arbitrum": { "EnableArbOS": true, "AllowDebugPrecompiles": true, - "DataAvailabilityCommittee": argv.anytrust || argv.referenceda, + "DataAvailabilityCommittee": argv.daCommittee, "InitialArbOSVersion": 40, "InitialChainOwner": argv.l2owner, "GenesisBlockNum": 0 @@ -645,14 +645,9 @@ export const writeL2ChainConfigCommand = { command: "write-l2-chain-config", describe: "writes l2 chain config file", builder: { - anytrust: { - boolean: true, - describe: "enable anytrust in chainconfig", - default: false - }, - referenceda: { + daCommittee: { boolean: true, - describe: "enable reference DA in chainconfig", + describe: "enable DA committee in chainconfig", default: false } }, diff --git a/test-node.bash b/test-node.bash index 084cce9a..ffdae7d0 100755 --- a/test-node.bash +++ b/test-node.bash @@ -491,12 +491,9 @@ if $force_init; then l2ownerAddress=`run_script print-address --account l2owner | tail -n 1 | tr -d '\r\n'` - if $l2anytrust; then - echo "== Writing l2 chain config (anytrust enabled)" - run_script --l2owner $l2ownerAddress write-l2-chain-config --anytrust - elif $l2referenceda; then - echo "== Writing l2 chain config (reference da enabled)" - run_script --l2owner $l2ownerAddress write-l2-chain-config --referenceda + if $l2anytrust || $l2referenceda; then + echo "== Writing l2 chain config (DA committee enabled)" + run_script --l2owner $l2ownerAddress write-l2-chain-config --da-committee else echo "== Writing l2 chain config" run_script --l2owner $l2ownerAddress write-l2-chain-config From 404ae84b3a9ab3370ad76282c954a7a884b900eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Wed, 8 Oct 2025 13:03:31 +0200 Subject: [PATCH 06/19] Register new command, start configuring --- scripts/config.ts | 25 ++++++++++++++++++++++++- scripts/index.ts | 2 ++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/scripts/config.ts b/scripts/config.ts index f8864a22..f8bc2c4f 100644 --- a/scripts/config.ts +++ b/scripts/config.ts @@ -1,7 +1,7 @@ import * as fs from 'fs'; import * as consts from './consts' import { ethers } from "ethers"; -import { namedAccount, namedAddress } from './accounts' +import { namedAddress } from './accounts' const path = require("path"); @@ -519,6 +519,22 @@ function writeL2DASKeysetConfig(argv: any) { fs.writeFileSync(path.join(consts.configpath, "l2_das_keyset.json"), l2DASKeysetConfigJSON) } +function writeL2ReferenceDAConfig(argv: any) { + const l2ReferenceDAConfig = { + "mode": "referenceda", + "referenceda": { + "enable": true, + "validator-contract": "0x5E1497dD1f08C87b2d8FE23e9AAB6c1De833D927", + // "signing-key": TODO + }, + "provider-server": { + "enable-da-writer": true, + } + } + const l2ReferenceDAConfigJSON = JSON.stringify(l2ReferenceDAConfig) + fs.writeFileSync(path.join(consts.configpath, "referenceda_provider.json"), l2ReferenceDAConfigJSON) +} + function dasBackendsJsonConfig(argv: any) { const backends = { "enable": false, @@ -701,3 +717,10 @@ export const writeL2DASKeysetConfigCommand = { } } +export const writeL2ReferenceDAConfigCommand = { + command: "write-l2-referenceda-config", + describe: "writes reference DA config file", + handler: (argv: any) => { + writeL2ReferenceDAConfig(argv) + } +} diff --git a/scripts/index.ts b/scripts/index.ts index a16b7e15..ff8924b8 100644 --- a/scripts/index.ts +++ b/scripts/index.ts @@ -11,6 +11,7 @@ import { writeL2DASCommitteeConfigCommand, writeL2DASMirrorConfigCommand, writeL2DASKeysetConfigCommand, + writeL2ReferenceDAConfigCommand, writeTimeboostConfigsCommand } from "./config"; import { @@ -72,6 +73,7 @@ async function main() { .command(writeL2DASCommitteeConfigCommand) .command(writeL2DASMirrorConfigCommand) .command(writeL2DASKeysetConfigCommand) + .command(writeL2ReferenceDAConfigCommand) .command(writePrysmCommand) .command(writeAccountsCommand) .command(writeTimeboostConfigsCommand) From 6029149a03c62f49f336cd839514b22a0909b09d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Wed, 8 Oct 2025 13:26:18 +0200 Subject: [PATCH 07/19] This should start the server --- docker-compose.yaml | 6 +++--- scripts/config.ts | 4 +++- test-node.bash | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 7013a303..c2350fc9 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -391,7 +391,7 @@ services: - "das-committee-a-data:/das-committee-a" - "das-committee-b-data:/das-committee-b" - "das-mirror-data:/das-mirror" - command: + - "referenceda-provider-data:/referenceda-provider" das-committee-a: pid: host # allow debugging @@ -439,7 +439,7 @@ services: - "127.0.0.1:9880:9880" volumes: - "config:/config" - - "referenceda-provider:/data" + - "referenceda-provider-data:/data" command: - --conf.file=/config/referenceda_provider.json @@ -493,5 +493,5 @@ volumes: das-committee-a-data: das-committee-b-data: das-mirror-data: - referenceda-provider: + referenceda-provider-data: timeboost-auctioneer-data: diff --git a/scripts/config.ts b/scripts/config.ts index f8bc2c4f..c8d0c3a1 100644 --- a/scripts/config.ts +++ b/scripts/config.ts @@ -524,8 +524,10 @@ function writeL2ReferenceDAConfig(argv: any) { "mode": "referenceda", "referenceda": { "enable": true, + "signing-key": { + "key-file": "/data/keys/ecdsa" + }, "validator-contract": "0x5E1497dD1f08C87b2d8FE23e9AAB6c1De833D927", - // "signing-key": TODO }, "provider-server": { "enable-da-writer": true, diff --git a/test-node.bash b/test-node.bash index ffdae7d0..ea8ccaba 100755 --- a/test-node.bash +++ b/test-node.bash @@ -543,6 +543,21 @@ if $l2anytrust; then fi fi +# Remaining init may require Reference DA service to have been started +if $l2referenceda; then + if $force_init; then + echo "== Generating Reference DA Config" + docker compose run --rm --user root --entrypoint sh datool -c "mkdir /referenceda-provider/keys && chown -R 1000:1000 /referenceda-provider*" + docker compose run --rm datool keygen --dir /referenceda-provider/keys --ecdsa + run_script write-l2-referenceda-config + fi + + if $run; then + echo "== Starting Reference DA service" + docker compose up --wait referenceda-provider + fi +fi + if $force_init; then if $l2timeboost; then timeboostNodeConfigLine="--timeboost" From 5c8882b56f65061c76bcd81756fc7b9a8eb29cef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Wed, 8 Oct 2025 14:08:13 +0200 Subject: [PATCH 08/19] Leave todo regarding validator deployment for now --- scripts/config.ts | 9 ++++++++- test-node.bash | 6 +++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/scripts/config.ts b/scripts/config.ts index c8d0c3a1..bbd1ffe3 100644 --- a/scripts/config.ts +++ b/scripts/config.ts @@ -527,7 +527,7 @@ function writeL2ReferenceDAConfig(argv: any) { "signing-key": { "key-file": "/data/keys/ecdsa" }, - "validator-contract": "0x5E1497dD1f08C87b2d8FE23e9AAB6c1De833D927", + "validator-contract": argv.validatorAddress, }, "provider-server": { "enable-da-writer": true, @@ -722,6 +722,13 @@ export const writeL2DASKeysetConfigCommand = { export const writeL2ReferenceDAConfigCommand = { command: "write-l2-referenceda-config", describe: "writes reference DA config file", + builder: { + validatorAddress: { + string: true, + describe: "L2 validator contract address", + demandOption: true + } + }, handler: (argv: any) => { writeL2ReferenceDAConfig(argv) } diff --git a/test-node.bash b/test-node.bash index ea8ccaba..b67c61ed 100755 --- a/test-node.bash +++ b/test-node.bash @@ -510,6 +510,10 @@ if $force_init; then else docker compose run --rm --entrypoint sh rollupcreator -c "jq [.[]] /config/deployed_chain_info.json > /config/l2_chain_info.json" fi + if $l2referenceda; then + l2referenceDAValidatorAddress=0x5E1497dD1f08C87b2d8FE23e9AAB6c1De833D927 + # TODO: deploy contracts-local/ReferenceDAProofValidator.sol, save its address and pass to daprovider config + fi fi # $force_init @@ -549,7 +553,7 @@ if $l2referenceda; then echo "== Generating Reference DA Config" docker compose run --rm --user root --entrypoint sh datool -c "mkdir /referenceda-provider/keys && chown -R 1000:1000 /referenceda-provider*" docker compose run --rm datool keygen --dir /referenceda-provider/keys --ecdsa - run_script write-l2-referenceda-config + run_script write-l2-referenceda-config --validator-address $l2referenceDAValidatorAddress fi if $run; then From 37b1fa63de819a0003063f186f5f033598af8549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Wed, 8 Oct 2025 16:47:55 +0200 Subject: [PATCH 09/19] Almost working --- scripts/config.ts | 35 ++++++++++++++++++++++++++++++++++- test-node.bash | 7 +++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/scripts/config.ts b/scripts/config.ts index bbd1ffe3..1ae4dd1a 100644 --- a/scripts/config.ts +++ b/scripts/config.ts @@ -260,7 +260,7 @@ function writeConfigs(argv: any) { } }, "data-availability": { - "enable": argv.anytrust, + "enable": argv.anytrust || argv.referenceDA, "rpc-aggregator": dasBackendsJsonConfig(argv), "rest-aggregator": { "enable": true, @@ -294,6 +294,23 @@ function writeConfigs(argv: any) { const baseConfJSON = JSON.stringify(baseConfig) + const configureReferenceDA = (config: any) => { + config.node["da"] = { + "mode": "referenceda", + "referenceda": { + "enable": true, + "validator-contract": argv.referenceDAValidatorContract, + }, + "external-provider": { + "enable": true, + "with-writer": true, + "rpc": { + "url": "http://0.0.0.0:9880" + } + } + } + } + if (argv.simple) { let simpleConfig = JSON.parse(baseConfJSON) simpleConfig.node.staker.enable = true @@ -308,6 +325,9 @@ function writeConfigs(argv: any) { if (argv.anytrust) { simpleConfig.node["data-availability"]["rpc-aggregator"].enable = true } + if (argv.referenceDA) { + configureReferenceDA(simpleConfig) + } fs.writeFileSync(path.join(consts.configpath, "sequencer_config.json"), JSON.stringify(simpleConfig)) } else { let validatorConfig = JSON.parse(baseConfJSON) @@ -339,6 +359,9 @@ function writeConfigs(argv: any) { if (argv.anytrust) { posterConfig.node["data-availability"]["rpc-aggregator"].enable = true } + if (argv.referenceDA) { + configureReferenceDA(posterConfig) + } fs.writeFileSync(path.join(consts.configpath, "poster_config.json"), JSON.stringify(posterConfig)) } @@ -632,6 +655,16 @@ export const writeConfigCommand = { describe: "DAS committee member B BLS pub key", default: "" }, + referenceDA: { + boolean: true, + describe: "run nodes in reference DA mode", + default: false + }, + referenceDAValidatorContract: { + string: true, + describe: "L2 reference DA validator contract address", + default: "" + }, timeboost: { boolean: true, describe: "run sequencer in timeboost mode", diff --git a/test-node.bash b/test-node.bash index b67c61ed..0960ea23 100755 --- a/test-node.bash +++ b/test-node.bash @@ -518,6 +518,7 @@ if $force_init; then fi # $force_init anytrustNodeConfigLine="" +referenceDaNodeConfigLine="" timeboostNodeConfigLine="" # Remaining init may require AnyTrust committee/mirrors to have been started @@ -554,6 +555,8 @@ if $l2referenceda; then docker compose run --rm --user root --entrypoint sh datool -c "mkdir /referenceda-provider/keys && chown -R 1000:1000 /referenceda-provider*" docker compose run --rm datool keygen --dir /referenceda-provider/keys --ecdsa run_script write-l2-referenceda-config --validator-address $l2referenceDAValidatorAddress + + referenceDaNodeConfigLine="--referenceDA --referenceDAValidatorContract $l2referenceDAValidatorAddress" fi if $run; then @@ -568,10 +571,10 @@ if $force_init; then fi if $simple; then echo == Writing configs - run_script write-config --simple $anytrustNodeConfigLine $timeboostNodeConfigLine + run_script write-config --simple $anytrustNodeConfigLine $referenceDaNodeConfigLine $timeboostNodeConfigLine else echo == Writing configs - run_script write-config $anytrustNodeConfigLine $timeboostNodeConfigLine + run_script write-config $anytrustNodeConfigLine $referenceDaNodeConfigLine $timeboostNodeConfigLine echo == Initializing redis docker compose up --wait redis From 684b55f1901b505d59b24fb88e98a1614e1001b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Thu, 9 Oct 2025 14:32:37 +0200 Subject: [PATCH 10/19] Deploy the validator contract --- docker-compose.yaml | 8 +++++++- test-node.bash | 5 +++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index c2350fc9..8c96ad68 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -381,7 +381,9 @@ services: NITRO_CONTRACTS_BRANCH: ${NITRO_CONTRACTS_BRANCH:-} volumes: - "config:/config" - - /var/run/docker.sock:/var/run/docker.sock + - "/var/run/docker.sock:/var/run/docker.sock" + - "contracts:/contracts" + - "contracts-local:/contracts-local" datool: image: nitro-node-dev-testnode @@ -440,6 +442,8 @@ services: volumes: - "config:/config" - "referenceda-provider-data:/data" + - "contracts:/contracts" + - "contracts-local:/contracts-local" command: - --conf.file=/config/referenceda_provider.json @@ -495,3 +499,5 @@ volumes: das-mirror-data: referenceda-provider-data: timeboost-auctioneer-data: + contracts: + contracts-local: diff --git a/test-node.bash b/test-node.bash index 0960ea23..4c53772d 100755 --- a/test-node.bash +++ b/test-node.bash @@ -511,8 +511,9 @@ if $force_init; then docker compose run --rm --entrypoint sh rollupcreator -c "jq [.[]] /config/deployed_chain_info.json > /config/l2_chain_info.json" fi if $l2referenceda; then - l2referenceDAValidatorAddress=0x5E1497dD1f08C87b2d8FE23e9AAB6c1De833D927 - # TODO: deploy contracts-local/ReferenceDAProofValidator.sol, save its address and pass to daprovider config + echo "== Deploying Reference DA Proof Validator contract on L2" + docker compose run --rm --entrypoint sh referenceda-provider -c "true" # Noop to mount shared volumes with contracts for manual build and deployment + l2referenceDAValidatorAddress=`docker compose run --rm --entrypoint sh rollupcreator -c "cd /contracts-local && forge create src/osp/ReferenceDAProofValidator.sol:ReferenceDAProofValidator --rpc-url http://geth:8545 --private-key $l2ownerKey --broadcast --constructor-args [$sequenceraddress]" | awk '/Deployed to:/ {print $NF}'` fi fi # $force_init From 974f21934edb0cf0c472b1f7e66381cb098a7712 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Thu, 9 Oct 2025 16:42:21 +0200 Subject: [PATCH 11/19] Add chain ID --- test-node.bash | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test-node.bash b/test-node.bash index 4c53772d..af0a01f3 100755 --- a/test-node.bash +++ b/test-node.bash @@ -323,7 +323,7 @@ while [[ $# -gt 0 ]]; do echo --no-build-dev-blockscout don\'t rebuild dev blockscout docker image echo --build-utils rebuild scripts, rollupcreator, token bridge docker images echo --no-build-utils don\'t rebuild scripts, rollupcreator, token bridge docker images - echo --force-build-utils force rebuilding utils, useful if NITRO_CONTRACTS_ or TOKEN_BRIDGE_BRANCH changes + echo --force-build-utils force rebuilding utils, useful if NITRO_CONTRACTS_BRANCH or TOKEN_BRIDGE_BRANCH changes echo echo script runs inside a separate docker. For SCRIPT-ARGS, run $0 script --help exit 0 @@ -503,7 +503,7 @@ if $force_init; then l2ownerKey=`run_script print-private-key --account l2owner | tail -n 1 | tr -d '\r\n'` wasmroot=`docker compose run --rm --entrypoint sh sequencer -c "cat /home/user/target/machines/latest/module-root.txt"` - echo == Deploying L2 chain + echo "== Deploying L2 chain" docker compose run --rm -e PARENT_CHAIN_RPC="http://geth:8545" -e DEPLOYER_PRIVKEY=$l2ownerKey -e PARENT_CHAIN_ID=$l1chainid -e CHILD_CHAIN_NAME="arb-dev-test" -e MAX_DATA_SIZE=117964 -e OWNER_ADDRESS=$l2ownerAddress -e WASM_MODULE_ROOT=$wasmroot -e SEQUENCER_ADDRESS=$sequenceraddress -e AUTHORIZE_VALIDATORS=10 -e CHILD_CHAIN_CONFIG_PATH="/config/l2_chain_config.json" -e CHAIN_DEPLOYMENT_INFO="/config/deployment.json" -e CHILD_CHAIN_INFO="/config/deployed_chain_info.json" rollupcreator create-rollup-testnode if $l2timeboost; then docker compose run --rm --entrypoint sh rollupcreator -c 'jq ".[] | .\"track-block-metadata-from\"=1 | [.]" /config/deployed_chain_info.json > /config/l2_chain_info.json' From ca2824c126ded6a855ff1de1141014b1a8b9425b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Thu, 9 Oct 2025 17:13:21 +0200 Subject: [PATCH 12/19] Allow pre-eip155 txs --- docker-compose.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yaml b/docker-compose.yaml index 8c96ad68..d4a63504 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -83,6 +83,7 @@ services: - --mine - --miner.etherbase=0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E - --gcmode=archive + - --rpc.allow-unprotected-txs # Creates a genesis state for the beacon chain using a YAML configuration file and # a deterministic set of validators From 0481a9ecb6c7d706301ab17618ac26622a7b4ebb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Fri, 10 Oct 2025 14:12:07 +0200 Subject: [PATCH 13/19] Change configuration for all services --- scripts/config.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/scripts/config.ts b/scripts/config.ts index 1ae4dd1a..ac76ed3a 100644 --- a/scripts/config.ts +++ b/scripts/config.ts @@ -334,10 +334,16 @@ function writeConfigs(argv: any) { validatorConfig.node.staker.enable = true validatorConfig.node.staker["use-smart-contract-wallet"] = false // TODO: set to true when fixed let validconfJSON = JSON.stringify(validatorConfig) + if (argv.referenceDA) { + configureReferenceDA(validatorConfig) + } fs.writeFileSync(path.join(consts.configpath, "validator_config.json"), validconfJSON) let unsafeStakerConfig = JSON.parse(validconfJSON) unsafeStakerConfig.node.staker.dangerous["without-block-validator"] = true + if (argv.referenceDA) { + configureReferenceDA(unsafeStakerConfig) + } fs.writeFileSync(path.join(consts.configpath, "unsafe_staker_config.json"), JSON.stringify(unsafeStakerConfig)) let sequencerConfig = JSON.parse(baseConfJSON) @@ -351,6 +357,9 @@ function writeConfigs(argv: any) { "redis-url": argv.redisUrl }; } + if (argv.referenceDA) { + configureReferenceDA(sequencerConfig) + } fs.writeFileSync(path.join(consts.configpath, "sequencer_config.json"), JSON.stringify(sequencerConfig)) let posterConfig = JSON.parse(baseConfJSON) From d77df076381ce57b86fa4eda2249a66f7cf02342 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Fri, 10 Oct 2025 23:10:08 +0200 Subject: [PATCH 14/19] Get it righter --- scripts/config.ts | 65 +++++++++++++++-------------------------------- test-node.bash | 8 +++--- 2 files changed, 25 insertions(+), 48 deletions(-) diff --git a/scripts/config.ts b/scripts/config.ts index ac76ed3a..4152c41d 100644 --- a/scripts/config.ts +++ b/scripts/config.ts @@ -187,7 +187,7 @@ function getChainInfo(): ChainInfo { function writeConfigs(argv: any) { const valJwtSecret = path.join(consts.configpath, "val_jwt.hex") const chainInfoFile = path.join(consts.configpath, "l2_chain_info.json") - let baseConfig = { + let baseConfig: any = { "ensure-rollup-deployment": false, "parent-chain": { "connection": { @@ -260,7 +260,7 @@ function writeConfigs(argv: any) { } }, "data-availability": { - "enable": argv.anytrust || argv.referenceDA, + "enable": argv.anytrust, "rpc-aggregator": dasBackendsJsonConfig(argv), "rest-aggregator": { "enable": true, @@ -292,27 +292,21 @@ function writeConfigs(argv: any) { baseConfig.node["data-availability"]["sequencer-inbox-address"] = ethers.utils.hexlify(getChainInfo()[0]["rollup"]["sequencer-inbox"]); - const baseConfJSON = JSON.stringify(baseConfig) - - const configureReferenceDA = (config: any) => { - config.node["da"] = { - "mode": "referenceda", - "referenceda": { - "enable": true, - "validator-contract": argv.referenceDAValidatorContract, - }, + if (argv.referenceDA) { + baseConfig.node["da"] = { + "mode": "external", "external-provider": { "enable": true, - "with-writer": true, + "with-writer": false, "rpc": { - "url": "http://0.0.0.0:9880" + "url": "http://referenceda-provider:9880" } } } } if (argv.simple) { - let simpleConfig = JSON.parse(baseConfJSON) + let simpleConfig = baseConfig simpleConfig.node.staker.enable = true simpleConfig.node.staker["use-smart-contract-wallet"] = false // TODO: set to true when fixed simpleConfig.node.staker.dangerous["without-block-validator"] = true @@ -325,28 +319,18 @@ function writeConfigs(argv: any) { if (argv.anytrust) { simpleConfig.node["data-availability"]["rpc-aggregator"].enable = true } - if (argv.referenceDA) { - configureReferenceDA(simpleConfig) - } fs.writeFileSync(path.join(consts.configpath, "sequencer_config.json"), JSON.stringify(simpleConfig)) } else { - let validatorConfig = JSON.parse(baseConfJSON) + let validatorConfig = baseConfig validatorConfig.node.staker.enable = true validatorConfig.node.staker["use-smart-contract-wallet"] = false // TODO: set to true when fixed - let validconfJSON = JSON.stringify(validatorConfig) - if (argv.referenceDA) { - configureReferenceDA(validatorConfig) - } - fs.writeFileSync(path.join(consts.configpath, "validator_config.json"), validconfJSON) + fs.writeFileSync(path.join(consts.configpath, "validator_config.json"), JSON.stringify(validatorConfig)) - let unsafeStakerConfig = JSON.parse(validconfJSON) + let unsafeStakerConfig = validatorConfig unsafeStakerConfig.node.staker.dangerous["without-block-validator"] = true - if (argv.referenceDA) { - configureReferenceDA(unsafeStakerConfig) - } fs.writeFileSync(path.join(consts.configpath, "unsafe_staker_config.json"), JSON.stringify(unsafeStakerConfig)) - let sequencerConfig = JSON.parse(baseConfJSON) + let sequencerConfig = baseConfig sequencerConfig.node.sequencer = true sequencerConfig.node["seq-coordinator"].enable = true sequencerConfig.execution["sequencer"].enable = true @@ -357,24 +341,21 @@ function writeConfigs(argv: any) { "redis-url": argv.redisUrl }; } - if (argv.referenceDA) { - configureReferenceDA(sequencerConfig) - } fs.writeFileSync(path.join(consts.configpath, "sequencer_config.json"), JSON.stringify(sequencerConfig)) - let posterConfig = JSON.parse(baseConfJSON) + let posterConfig = baseConfig posterConfig.node["seq-coordinator"].enable = true posterConfig.node["batch-poster"].enable = true if (argv.anytrust) { posterConfig.node["data-availability"]["rpc-aggregator"].enable = true } if (argv.referenceDA) { - configureReferenceDA(posterConfig) + posterConfig.node["da"]["external-provider"]["with-writer"] = true } fs.writeFileSync(path.join(consts.configpath, "poster_config.json"), JSON.stringify(posterConfig)) } - let l3Config = JSON.parse(baseConfJSON) + let l3Config = baseConfig l3Config["parent-chain"].connection.url = argv.l2url // use the same account for l2 and l3 staker // l3Config.node.staker["parent-chain-wallet"].account = namedAddress("l3owner") @@ -394,7 +375,7 @@ function writeConfigs(argv: any) { l3Config.node["batch-poster"]["redis-url"] = "" fs.writeFileSync(path.join(consts.configpath, "l3node_config.json"), JSON.stringify(l3Config)) - let validationNodeConfig = JSON.parse(JSON.stringify({ + let validationNodeConfig = { "persistent": { "chain": "local" }, @@ -412,7 +393,7 @@ function writeConfigs(argv: any) { "jwtsecret": valJwtSecret, "addr": "0.0.0.0", }, - })) + } fs.writeFileSync(path.join(consts.configpath, "validation_node_config.json"), JSON.stringify(validationNodeConfig)) } @@ -439,7 +420,7 @@ function writeL2ChainConfig(argv: any) { "arbitrum": { "EnableArbOS": true, "AllowDebugPrecompiles": true, - "DataAvailabilityCommittee": argv.daCommittee, + "DataAvailabilityCommittee": argv.anytrust, "InitialArbOSVersion": 40, "InitialChainOwner": argv.l2owner, "GenesisBlockNum": 0 @@ -562,6 +543,7 @@ function writeL2ReferenceDAConfig(argv: any) { "validator-contract": argv.validatorAddress, }, "provider-server": { + "addr": "0.0.0.0", "enable-da-writer": true, } } @@ -669,11 +651,6 @@ export const writeConfigCommand = { describe: "run nodes in reference DA mode", default: false }, - referenceDAValidatorContract: { - string: true, - describe: "L2 reference DA validator contract address", - default: "" - }, timeboost: { boolean: true, describe: "run sequencer in timeboost mode", @@ -705,9 +682,9 @@ export const writeL2ChainConfigCommand = { command: "write-l2-chain-config", describe: "writes l2 chain config file", builder: { - daCommittee: { + anytrust: { boolean: true, - describe: "enable DA committee in chainconfig", + describe: "enable anytrust in chainconfig", default: false } }, diff --git a/test-node.bash b/test-node.bash index af0a01f3..16457340 100755 --- a/test-node.bash +++ b/test-node.bash @@ -491,9 +491,9 @@ if $force_init; then l2ownerAddress=`run_script print-address --account l2owner | tail -n 1 | tr -d '\r\n'` - if $l2anytrust || $l2referenceda; then - echo "== Writing l2 chain config (DA committee enabled)" - run_script --l2owner $l2ownerAddress write-l2-chain-config --da-committee + if $l2anytrust; then + echo "== Writing l2 chain config (anytrust enabled)" + run_script --l2owner $l2ownerAddress write-l2-chain-config --anytrust else echo "== Writing l2 chain config" run_script --l2owner $l2ownerAddress write-l2-chain-config @@ -557,7 +557,7 @@ if $l2referenceda; then docker compose run --rm datool keygen --dir /referenceda-provider/keys --ecdsa run_script write-l2-referenceda-config --validator-address $l2referenceDAValidatorAddress - referenceDaNodeConfigLine="--referenceDA --referenceDAValidatorContract $l2referenceDAValidatorAddress" + referenceDaNodeConfigLine="--referenceDA" fi if $run; then From 425948aa40b7f9e44aa90c08ee21dfc442959471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Sat, 11 Oct 2025 00:01:37 +0200 Subject: [PATCH 15/19] Use new configuration --- scripts/config.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/config.ts b/scripts/config.ts index 4152c41d..70aede80 100644 --- a/scripts/config.ts +++ b/scripts/config.ts @@ -541,11 +541,12 @@ function writeL2ReferenceDAConfig(argv: any) { "key-file": "/data/keys/ecdsa" }, "validator-contract": argv.validatorAddress, + "parent-chain-node-url": argv.l1url, }, "provider-server": { "addr": "0.0.0.0", "enable-da-writer": true, - } + }, } const l2ReferenceDAConfigJSON = JSON.stringify(l2ReferenceDAConfig) fs.writeFileSync(path.join(consts.configpath, "referenceda_provider.json"), l2ReferenceDAConfigJSON) @@ -746,7 +747,7 @@ export const writeL2ReferenceDAConfigCommand = { string: true, describe: "L2 validator contract address", demandOption: true - } + }, }, handler: (argv: any) => { writeL2ReferenceDAConfig(argv) From 9196edfb90d834e78e751d05c877b9a58c7b5dae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Sat, 11 Oct 2025 01:30:03 +0200 Subject: [PATCH 16/19] Compute signer address --- docker-compose.yaml | 1 + test-node.bash | 36 +++++++++++++++++++----------------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index d4a63504..d33ec6b1 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -385,6 +385,7 @@ services: - "/var/run/docker.sock:/var/run/docker.sock" - "contracts:/contracts" - "contracts-local:/contracts-local" + - "referenceda-provider-data:/referenceda-provider" datool: image: nitro-node-dev-testnode diff --git a/test-node.bash b/test-node.bash index 43361edf..74abbd25 100755 --- a/test-node.bash +++ b/test-node.bash @@ -524,10 +524,21 @@ if $force_init; then else docker compose run --rm --entrypoint sh rollupcreator -c "jq [.[]] /config/deployed_chain_info.json > /config/l2_chain_info.json" fi + if $l2referenceda; then - echo "== Deploying Reference DA Proof Validator contract on L2" docker compose run --rm --entrypoint sh referenceda-provider -c "true" # Noop to mount shared volumes with contracts for manual build and deployment - l2referenceDAValidatorAddress=`docker compose run --rm --entrypoint sh rollupcreator -c "cd /contracts-local && forge create src/osp/ReferenceDAProofValidator.sol:ReferenceDAProofValidator --rpc-url http://geth:8545 --private-key $l2ownerKey --broadcast --constructor-args [$sequenceraddress]" | awk '/Deployed to:/ {print $NF}'` + + echo "== Generating Reference DA keys" + docker compose run --rm --user root --entrypoint sh datool -c "mkdir /referenceda-provider/keys && chown -R 1000:1000 /referenceda-provider*" + docker compose run --rm datool keygen --dir /referenceda-provider/keys --ecdsa + + referenceDASignerAddress=`docker compose run --rm --entrypoint sh rollupcreator -c "cat /referenceda-provider/keys/ecdsa.pub | sed 's/^04//' | tr -d '\n' | cast keccak | tail -c 41 | cast to-check-sum-address"` + + echo "== Deploying Reference DA Proof Validator contract on L2" + l2referenceDAValidatorAddress=`docker compose run --rm --entrypoint sh rollupcreator -c "cd /contracts-local && forge create src/osp/ReferenceDAProofValidator.sol:ReferenceDAProofValidator --rpc-url http://geth:8545 --private-key $l2ownerKey --broadcast --constructor-args [$referenceDASignerAddress]" | awk '/Deployed to:/ {print $NF}'` + + echo "== Generating Reference DA Config" + run_script write-l2-referenceda-config --validator-address $l2referenceDAValidatorAddress fi fi # $force_init @@ -563,27 +574,18 @@ if $l2anytrust; then fi fi -# Remaining init may require Reference DA service to have been started -if $l2referenceda; then - if $force_init; then - echo "== Generating Reference DA Config" - docker compose run --rm --user root --entrypoint sh datool -c "mkdir /referenceda-provider/keys && chown -R 1000:1000 /referenceda-provider*" - docker compose run --rm datool keygen --dir /referenceda-provider/keys --ecdsa - run_script write-l2-referenceda-config --validator-address $l2referenceDAValidatorAddress - - referenceDaNodeConfigLine="--referenceDA" - fi - - if $run; then - echo "== Starting Reference DA service" - docker compose up --wait referenceda-provider - fi +if $l2referenceda && $run; then + echo "== Starting Reference DA service" + docker compose up --wait referenceda-provider fi if $force_init; then if $l2timeboost; then timeboostNodeConfigLine="--timeboost" fi + if $l2referenceda; then + referenceDaNodeConfigLine="--referenceDA" + fi if $simple; then echo == Writing configs run_script write-config --simple $anytrustNodeConfigLine $referenceDaNodeConfigLine $timeboostNodeConfigLine From eb7af3865c8c81845de8d0b3c6136ba46832c362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Sun, 12 Oct 2025 23:15:59 +0200 Subject: [PATCH 17/19] Fix address derivation --- test-node.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-node.bash b/test-node.bash index 74abbd25..456434c8 100755 --- a/test-node.bash +++ b/test-node.bash @@ -532,7 +532,7 @@ if $force_init; then docker compose run --rm --user root --entrypoint sh datool -c "mkdir /referenceda-provider/keys && chown -R 1000:1000 /referenceda-provider*" docker compose run --rm datool keygen --dir /referenceda-provider/keys --ecdsa - referenceDASignerAddress=`docker compose run --rm --entrypoint sh rollupcreator -c "cat /referenceda-provider/keys/ecdsa.pub | sed 's/^04//' | tr -d '\n' | cast keccak | tail -c 41 | cast to-check-sum-address"` + referenceDASignerAddress=`docker compose run --rm --entrypoint sh rollupcreator -c "cat /referenceda-provider/keys/ecdsa.pub | sed 's/^04/0x/' | tr -d '\n' | cast keccak | tail -c 41 | cast to-check-sum-address"` echo "== Deploying Reference DA Proof Validator contract on L2" l2referenceDAValidatorAddress=`docker compose run --rm --entrypoint sh rollupcreator -c "cd /contracts-local && forge create src/osp/ReferenceDAProofValidator.sol:ReferenceDAProofValidator --rpc-url http://geth:8545 --private-key $l2ownerKey --broadcast --constructor-args [$referenceDASignerAddress]" | awk '/Deployed to:/ {print $NF}'` From ba4b246567986e6c2ecc8e9b2d98ba64154fb066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Mon, 13 Oct 2025 00:35:28 +0200 Subject: [PATCH 18/19] maybe these will fix mysterious ci fails --- scripts/config.ts | 26 +++++++++++++++----------- test-node.bash | 4 ++-- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/scripts/config.ts b/scripts/config.ts index 70aede80..56251c29 100644 --- a/scripts/config.ts +++ b/scripts/config.ts @@ -187,7 +187,7 @@ function getChainInfo(): ChainInfo { function writeConfigs(argv: any) { const valJwtSecret = path.join(consts.configpath, "val_jwt.hex") const chainInfoFile = path.join(consts.configpath, "l2_chain_info.json") - let baseConfig: any = { + let baseConfig = { "ensure-rollup-deployment": false, "parent-chain": { "connection": { @@ -269,7 +269,8 @@ function writeConfigs(argv: any) { // TODO Fix das config to not need this redundant config "parent-chain-node-url": argv.l1url, "sequencer-inbox-address": "not_set" - } + }, + "da": {}, }, "execution": { "sequencer": { @@ -305,8 +306,10 @@ function writeConfigs(argv: any) { } } + const baseConfJSON = JSON.stringify(baseConfig) + if (argv.simple) { - let simpleConfig = baseConfig + let simpleConfig = JSON.parse(baseConfJSON) simpleConfig.node.staker.enable = true simpleConfig.node.staker["use-smart-contract-wallet"] = false // TODO: set to true when fixed simpleConfig.node.staker.dangerous["without-block-validator"] = true @@ -321,16 +324,17 @@ function writeConfigs(argv: any) { } fs.writeFileSync(path.join(consts.configpath, "sequencer_config.json"), JSON.stringify(simpleConfig)) } else { - let validatorConfig = baseConfig + let validatorConfig = JSON.parse(baseConfJSON) validatorConfig.node.staker.enable = true validatorConfig.node.staker["use-smart-contract-wallet"] = false // TODO: set to true when fixed - fs.writeFileSync(path.join(consts.configpath, "validator_config.json"), JSON.stringify(validatorConfig)) + let validconfJSON = JSON.stringify(validatorConfig) + fs.writeFileSync(path.join(consts.configpath, "validator_config.json"), validconfJSON) - let unsafeStakerConfig = validatorConfig + let unsafeStakerConfig = JSON.parse(validconfJSON) unsafeStakerConfig.node.staker.dangerous["without-block-validator"] = true fs.writeFileSync(path.join(consts.configpath, "unsafe_staker_config.json"), JSON.stringify(unsafeStakerConfig)) - let sequencerConfig = baseConfig + let sequencerConfig = JSON.parse(baseConfJSON) sequencerConfig.node.sequencer = true sequencerConfig.node["seq-coordinator"].enable = true sequencerConfig.execution["sequencer"].enable = true @@ -343,7 +347,7 @@ function writeConfigs(argv: any) { } fs.writeFileSync(path.join(consts.configpath, "sequencer_config.json"), JSON.stringify(sequencerConfig)) - let posterConfig = baseConfig + let posterConfig = JSON.parse(baseConfJSON) posterConfig.node["seq-coordinator"].enable = true posterConfig.node["batch-poster"].enable = true if (argv.anytrust) { @@ -355,7 +359,7 @@ function writeConfigs(argv: any) { fs.writeFileSync(path.join(consts.configpath, "poster_config.json"), JSON.stringify(posterConfig)) } - let l3Config = baseConfig + let l3Config = JSON.parse(baseConfJSON) l3Config["parent-chain"].connection.url = argv.l2url // use the same account for l2 and l3 staker // l3Config.node.staker["parent-chain-wallet"].account = namedAddress("l3owner") @@ -375,7 +379,7 @@ function writeConfigs(argv: any) { l3Config.node["batch-poster"]["redis-url"] = "" fs.writeFileSync(path.join(consts.configpath, "l3node_config.json"), JSON.stringify(l3Config)) - let validationNodeConfig = { + let validationNodeConfig = JSON.parse(JSON.stringify({ "persistent": { "chain": "local" }, @@ -393,7 +397,7 @@ function writeConfigs(argv: any) { "jwtsecret": valJwtSecret, "addr": "0.0.0.0", }, - } + })) fs.writeFileSync(path.join(consts.configpath, "validation_node_config.json"), JSON.stringify(validationNodeConfig)) } diff --git a/test-node.bash b/test-node.bash index 456434c8..cc8400d0 100755 --- a/test-node.bash +++ b/test-node.bash @@ -586,11 +586,11 @@ if $force_init; then if $l2referenceda; then referenceDaNodeConfigLine="--referenceDA" fi + + echo "== Writing configs" if $simple; then - echo == Writing configs run_script write-config --simple $anytrustNodeConfigLine $referenceDaNodeConfigLine $timeboostNodeConfigLine else - echo == Writing configs run_script write-config $anytrustNodeConfigLine $referenceDaNodeConfigLine $timeboostNodeConfigLine echo == Initializing redis From dab3581974b278077a068a01ec0a889d9e354d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Miko=C5=82ajczyk?= Date: Mon, 13 Oct 2025 00:45:13 +0200 Subject: [PATCH 19/19] this? --- scripts/config.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/config.ts b/scripts/config.ts index 56251c29..0803230f 100644 --- a/scripts/config.ts +++ b/scripts/config.ts @@ -269,8 +269,7 @@ function writeConfigs(argv: any) { // TODO Fix das config to not need this redundant config "parent-chain-node-url": argv.l1url, "sequencer-inbox-address": "not_set" - }, - "da": {}, + } }, "execution": { "sequencer": { @@ -294,7 +293,7 @@ function writeConfigs(argv: any) { baseConfig.node["data-availability"]["sequencer-inbox-address"] = ethers.utils.hexlify(getChainInfo()[0]["rollup"]["sequencer-inbox"]); if (argv.referenceDA) { - baseConfig.node["da"] = { + (baseConfig as any).node["da"] = { "mode": "external", "external-provider": { "enable": true,