[codex] support reth execution client in devnet#947
Conversation
📝 WalkthroughWalkthroughThis PR refactors the devnet infrastructure to support dynamic execution client selection (geth/reth) and standardizes execution layer service naming from ChangesExecution Layer Refactor & Execution Client Selection
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
Makefile (1)
186-218: ⚡ Quick winAdd
-rethwrappers fordevnet-downanddevnet-logsfor symmetry.
devnet-clean-build-rethexists, butdevnet-down/devnet-logsrely onEXECUTION_CLIENTbeing passed every invocation. After runningmake devnet-up-reth, a follow-upmake devnet-downdefaults toEXECUTION_CLIENT=gethand only referencesdocker-compose-4nodes.yml. Containers will still stop by name (services are reused), but anything declared only indocker-compose-reth.yml(extra volumes/networks/anonymous mounts) won't be cleaned bydown --volumes.♻️ Proposed wrappers
devnet-down: cd ops/docker && docker compose $(DEVNET_COMPOSE_FILES) down .PHONY: devnet-down +devnet-down-reth: + $(MAKE) devnet-down EXECUTION_CLIENT=reth +.PHONY: devnet-down-reth + devnet-clean-build: devnet-l1-clean @@ devnet-logs: @(cd ops/docker && docker compose $(DEVNET_COMPOSE_FILES) logs -f) .PHONY: devnet-logs + +devnet-logs-reth: + $(MAKE) devnet-logs EXECUTION_CLIENT=reth +.PHONY: devnet-logs-reth🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Makefile` around lines 186 - 218, Add symmetric wrapper targets devnet-down-reth and devnet-logs-reth that invoke the existing devnet-down and devnet-logs targets with EXECUTION_CLIENT=reth so the reth-specific compose file/volumes/networks are honored; implement them similarly to devnet-clean-build-reth (e.g., have devnet-down-reth run $(MAKE) devnet-down EXECUTION_CLIENT=reth and devnet-logs-reth run $(MAKE) devnet-logs EXECUTION_CLIENT=reth) and mark both .PHONY.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@Makefile`:
- Around line 186-218: Add symmetric wrapper targets devnet-down-reth and
devnet-logs-reth that invoke the existing devnet-down and devnet-logs targets
with EXECUTION_CLIENT=reth so the reth-specific compose file/volumes/networks
are honored; implement them similarly to devnet-clean-build-reth (e.g., have
devnet-down-reth run $(MAKE) devnet-down EXECUTION_CLIENT=reth and
devnet-logs-reth run $(MAKE) devnet-logs EXECUTION_CLIENT=reth) and mark both
.PHONY.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: bfa20dbb-5265-4d94-9c82-036def2ab39b
📒 Files selected for processing (12)
Makefilenode/ops-morph/docker-compose.ymlnode/ops-morph/testnet/docker-compose.ymlnode/ops-morph/testnet/static-nodes.jsonops/devnet-morph/devnet/__init__.pyops/docker-sequencer-test/docker-compose.override.ymlops/docker-sequencer-test/run-test.shops/docker-sequencer-test/scripts/tx-generator.shops/docker/docker-compose-4nodes.ymlops/docker/docker-compose-reth.ymlops/docker/static-nodes.jsonoracle/docker-compose.yml
Replace the internal codename "bitget" with the neutral term "polyrepo" in build context references, variable names, and container paths.
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
ops/devnet-morph/devnet/__init__.py (1)
272-283:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winPassing
GETH_DATA_DIRto reth is dead configuration.The reth service definition in docker-compose-reth.yml hardcodes
--datadir=/dband never references theGETH_DATA_DIRenvironment variable. Whenexecution_client == 'reth', this variable is still injected unconditionally in the Python code, creating unused and misleading configuration. An operator reading the code might expectGETH_DATA_DIRto control reth's data directory location, when in fact it is ignored.Consider either:
- Conditionally supply
GETH_DATA_DIRonly whenexecution_client != 'reth'- Or ensure and document that the reth compose override intentionally hardcodes the path
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@ops/devnet-morph/devnet/__init__.py` around lines 272 - 283, The env dict passed to run_command (see the run_command call and compose_file_args usage and the execution_client variable) incorrectly always injects GETH_DATA_DIR even though the reth compose file hardcodes --datadir=/db; change the call to build the environment dict first and only add the 'GETH_DATA_DIR' key when execution_client != 'reth' (or when a helper like compose_file_args indicates a non-reth client), so that GETH_DATA_DIR is not supplied for reth and no longer produces misleading configuration.
🧹 Nitpick comments (1)
ops/docker-sequencer-test/Dockerfile.l2-node-test (1)
38-45: 💤 Low valueFinal stage reuses the heavy builder image.
The final stage is
FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.24-ubuntu— the same image used for compilation — which bundles the full Go toolchain. For a test image this is not a blocker, but it inflates the image size considerably vs. a slim base (e.g.ubuntu:22.04orgcr.io/distroless/base). The binary-only artifacts (tendermint,morphnode) are copied in, so no Go toolchain is needed at runtime.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@ops/docker-sequencer-test/Dockerfile.l2-node-test` around lines 38 - 45, Final stage uses the heavy builder image (ghcr.io/morph-l2/go-ubuntu-builder:go-1.24-ubuntu) which unnecessarily includes the Go toolchain; change the final FROM to a slim runtime base (e.g., ubuntu:22.04 or gcr.io/distroless/base) and ensure any runtime packages like ca-certificates are installed, then keep the existing COPY --from=builder lines that copy the binary artifacts (COPY --from=builder /polyrepo/morph/node/build/bin/tendermint /usr/local/bin/ and COPY --from=builder /polyrepo/morph/node/build/bin/morphnode /usr/local/bin/) so only the runtime image with required deps contains the binaries.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@ops/docker-sequencer-test/Dockerfile.l2-node-test`:
- Around line 25-26: The Dockerfile uses incorrect source paths with a
"./morph/" prefix that doesn't exist, causing COPY to fail; update every COPY
that references "./morph/..." (for example the entries that should copy go.work,
node/go.mod, bindings/go.mod) to use the correct root-level paths (remove the
"./morph/" prefix) so sources like ./go.work, ./node/go.mod, ./bindings/go.mod
are used, and keep the existing targets (e.g., /polyrepo/morph/,
/polyrepo/morph/node/) so WORKDIR and RUN go mod download -x remain valid.
---
Outside diff comments:
In `@ops/devnet-morph/devnet/__init__.py`:
- Around line 272-283: The env dict passed to run_command (see the run_command
call and compose_file_args usage and the execution_client variable) incorrectly
always injects GETH_DATA_DIR even though the reth compose file hardcodes
--datadir=/db; change the call to build the environment dict first and only add
the 'GETH_DATA_DIR' key when execution_client != 'reth' (or when a helper like
compose_file_args indicates a non-reth client), so that GETH_DATA_DIR is not
supplied for reth and no longer produces misleading configuration.
---
Nitpick comments:
In `@ops/docker-sequencer-test/Dockerfile.l2-node-test`:
- Around line 38-45: Final stage uses the heavy builder image
(ghcr.io/morph-l2/go-ubuntu-builder:go-1.24-ubuntu) which unnecessarily includes
the Go toolchain; change the final FROM to a slim runtime base (e.g.,
ubuntu:22.04 or gcr.io/distroless/base) and ensure any runtime packages like
ca-certificates are installed, then keep the existing COPY --from=builder lines
that copy the binary artifacts (COPY --from=builder
/polyrepo/morph/node/build/bin/tendermint /usr/local/bin/ and COPY
--from=builder /polyrepo/morph/node/build/bin/morphnode /usr/local/bin/) so only
the runtime image with required deps contains the binaries.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 8043b7fb-d5e8-4d13-b100-a5286467e21e
📒 Files selected for processing (4)
ops/devnet-morph/devnet/__init__.pyops/docker-sequencer-test/Dockerfile.l2-geth-testops/docker-sequencer-test/Dockerfile.l2-node-testops/docker-sequencer-test/run-test.sh
✅ Files skipped from review due to trivial changes (1)
- ops/docker-sequencer-test/Dockerfile.l2-geth-test
🚧 Files skipped from review as they are similar to previous changes (1)
- ops/docker-sequencer-test/run-test.sh
|
Re: CodeRabbit's
cd "$POLYREPO_ROOT" # e.g. /workspace (parent of morph/)
docker build -f morph/ops/docker-sequencer-test/Dockerfile.l2-node-test .With this context, |
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
Cover the rest of the file with one-line docstrings to satisfy CodeRabbit's docstring coverage threshold.
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
…g Dockerfile.l2-geth Move the morph-el-0 build: section from docker-compose-4nodes.yml into a dedicated docker-compose-geth-build.yml, included only when EXECUTION_CLIENT=geth. The reth overlay now sees no build: on morph-el-0, eliminating the risk of docker compose up building geth code and tagging it as the reth image when the reth image is absent.
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
Makefile (1)
146-147: ⚡ Quick winPin the default reth image instead of using
:latest.Lines 146-147 use a mutable image tag by default, so the same checkout can pull different binaries over time. This makes local failures and CI drift harder to reproduce. Use an immutable image digest or explicit version tag, and leave
latestas an optional override.♻️ Suggested change
-MORPH_RETH_IMAGE ?= ghcr.io/morph-l2/morph-reth:latest +MORPH_RETH_IMAGE ?= ghcr.io/morph-l2/morph-reth@sha256:<published-digest>🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Makefile` around lines 146 - 147, The default MORPH_RETH_IMAGE currently uses the mutable ":latest" tag which causes non-reproducible pulls; change the default value of MORPH_RETH_IMAGE to an immutable tag (e.g., a specific version like "ghcr.io/morph-l2/morph-reth:vX.Y.Z" or a digest "ghcr.io/morph-l2/morph-reth@sha256:...") while keeping MORPH_RETH_ENTRYPOINT as-is and still allowing consumers to override MORPH_RETH_IMAGE externally; update the Makefile assignment for MORPH_RETH_IMAGE to use that explicit version/digest instead of ":latest".
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Makefile`:
- Around line 161-173: The Makefile currently validates EXECUTION_CLIENT at
parse time (the conditional block setting DEVNET_EXECUTION_DEPS /
DEVNET_COMPOSE_FILES and the $(error ...)) which can abort unrelated targets;
move this validation into the devnet-specific target logic or switch to a
separate variable name (e.g. DEVNET_EXECUTION_CLIENT) to avoid global parse-time
evaluation. Specifically, replace references to EXECUTION_CLIENT with
DEVNET_EXECUTION_CLIENT (or wrap the existing conditional inside the devnet
target recipe) and ensure MORPH_RETH_BUILD_FROM_SOURCE, DEVNET_EXECUTION_DEPS
and DEVNET_COMPOSE_FILES are set only when the devnet target is invoked; remove
or relocate the $(error ...) so it runs at target execution time rather than
during Makefile parsing.
---
Nitpick comments:
In `@Makefile`:
- Around line 146-147: The default MORPH_RETH_IMAGE currently uses the mutable
":latest" tag which causes non-reproducible pulls; change the default value of
MORPH_RETH_IMAGE to an immutable tag (e.g., a specific version like
"ghcr.io/morph-l2/morph-reth:vX.Y.Z" or a digest
"ghcr.io/morph-l2/morph-reth@sha256:...") while keeping MORPH_RETH_ENTRYPOINT
as-is and still allowing consumers to override MORPH_RETH_IMAGE externally;
update the Makefile assignment for MORPH_RETH_IMAGE to use that explicit
version/digest instead of ":latest".
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: b2adfdd8-cbb2-48cb-9d53-0169baaaccdc
📒 Files selected for processing (4)
Makefileops/devnet-morph/devnet/__init__.pyops/docker/docker-compose-4nodes.ymlops/docker/docker-compose-geth-build.yml
✅ Files skipped from review due to trivial changes (1)
- ops/docker/docker-compose-geth-build.yml
🚧 Files skipped from review as they are similar to previous changes (2)
- ops/devnet-morph/devnet/init.py
- ops/docker/docker-compose-4nodes.yml
| ifeq ($(EXECUTION_CLIENT),geth) | ||
| DEVNET_EXECUTION_DEPS := submodules | ||
| DEVNET_COMPOSE_FILES += -f docker-compose-geth-build.yml | ||
| else ifeq ($(EXECUTION_CLIENT),reth) | ||
| DEVNET_COMPOSE_FILES += -f docker-compose-reth.yml | ||
| ifeq ($(MORPH_RETH_BUILD_FROM_SOURCE),true) | ||
| DEVNET_EXECUTION_DEPS := reth | ||
| else | ||
| DEVNET_EXECUTION_DEPS := reth-image | ||
| endif | ||
| else | ||
| $(error unsupported EXECUTION_CLIENT "$(EXECUTION_CLIENT)", expected "geth" or "reth") | ||
| endif |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -eu
cat >/tmp/exec-client-parse.mk <<'EOF'
EXECUTION_CLIENT ?= bad
ifeq ($(EXECUTION_CLIENT),geth)
else ifeq ($(EXECUTION_CLIENT),reth)
else
$(error unsupported EXECUTION_CLIENT "$(EXECUTION_CLIENT)")
endif
lint:
@:
EOF
env EXECUTION_CLIENT=bad make -f /tmp/exec-client-parse.mk lintRepository: morph-l2/morph
Length of output: 99
🏁 Script executed:
sed -n '161,173p' MakefileRepository: morph-l2/morph
Length of output: 490
Avoid validating EXECUTION_CLIENT at parse time.
Line 172 is evaluated while Make parses the file, so an inherited EXECUTION_CLIENT=foo will break unrelated targets like make lint before target resolution. Please scope this check to the devnet targets, or rename the knob to something less collision-prone such as DEVNET_EXECUTION_CLIENT.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@Makefile` around lines 161 - 173, The Makefile currently validates
EXECUTION_CLIENT at parse time (the conditional block setting
DEVNET_EXECUTION_DEPS / DEVNET_COMPOSE_FILES and the $(error ...)) which can
abort unrelated targets; move this validation into the devnet-specific target
logic or switch to a separate variable name (e.g. DEVNET_EXECUTION_CLIENT) to
avoid global parse-time evaluation. Specifically, replace references to
EXECUTION_CLIENT with DEVNET_EXECUTION_CLIENT (or wrap the existing conditional
inside the devnet target recipe) and ensure MORPH_RETH_BUILD_FROM_SOURCE,
DEVNET_EXECUTION_DEPS and DEVNET_COMPOSE_FILES are set only when the devnet
target is invoked; remove or relocate the $(error ...) so it runs at target
execution time rather than during Makefile parsing.
Keep the base devnet compose file self-contained for geth while using the reth overlay to explicitly reset inherited geth build definitions. Constraint: Do not include the devnet execution-client test file in this commit Rejected: Keep a separate geth build compose file | changes direct base compose usage Confidence: high Scope-risk: narrow
There was a problem hiding this comment.
♻️ Duplicate comments (1)
Makefile (1)
161-172:⚠️ Potential issue | 🟠 Major | ⚡ Quick winParse-time
EXECUTION_CLIENTvalidation still affects unrelated targets.The
$(error …)on line 171 fires while Make parses the file, so an inherited or staleEXECUTION_CLIENT=foowill abort non-devnet targets likemake lintormake bindings. Either gate the validation behind the devnet recipes or rename to a devnet-scoped variable (e.g.DEVNET_EXECUTION_CLIENT).🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Makefile` around lines 161 - 172, The parse-time error triggered by the top-level EXECUTION_CLIENT conditional should be moved so it only runs for devnet workflows: either rename EXECUTION_CLIENT to a devnet-scoped variable (e.g. DEVNET_EXECUTION_CLIENT) and update all references (DEVNET_EXECUTION_DEPS, DEVNET_COMPOSE_FILES, MORPH_RETH_BUILD_FROM_SOURCE checks) accordingly, or keep EXECUTION_CLIENT but remove the top-level $(error …) and instead perform the validation inside the devnet target recipe (or a devnet-specific include) so the error is only raised when running devnet-related targets; update the conditional branches (the geth/reth/else logic) to use the chosen variable placement so non-devnet targets like lint or bindings are not affected during Makefile parse time.
🧹 Nitpick comments (1)
Makefile (1)
186-218: ⚡ Quick winAdd reth-specific lifecycle targets for consistency.
After
make devnet-up-reth, thedevnet-downanddevnet-logstargets default back toEXECUTION_CLIENT=gethsince they don't propagate this variable (unlikedevnet-up-rethanddevnet-clean-build-reth). This causes services exclusive to the reth overlay—morph-el-0,morph-el-1,morph-el-2,morph-el-3,sentry-el-0,validator-el—to be orphaned on shutdown and omitted from log tails.♻️ Suggested convenience targets
devnet-down: cd ops/docker && docker compose $(DEVNET_COMPOSE_FILES) down .PHONY: devnet-down + +devnet-down-reth: + $(MAKE) devnet-down EXECUTION_CLIENT=reth +.PHONY: devnet-down-reth @@ devnet-logs: @(cd ops/docker && docker compose $(DEVNET_COMPOSE_FILES) logs -f) .PHONY: devnet-logs + +devnet-logs-reth: + $(MAKE) devnet-logs EXECUTION_CLIENT=reth +.PHONY: devnet-logs-reth🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Makefile` around lines 186 - 218, devnet-down and devnet-logs don't honor EXECUTION_CLIENT=reth so reth services get orphaned; add reth-specific targets (e.g., devnet-down-reth and devnet-logs-reth) that invoke the existing commands with EXECUTION_CLIENT=reth (mirror how devnet-clean-build-reth calls devnet-clean-build) or modify devnet-down and devnet-logs to accept and forward the EXECUTION_CLIENT variable into the docker compose invocation; reference targets: devnet-down, devnet-logs, devnet-clean-build-reth, and the new devnet-down-reth/devnet-logs-reth to ensure shutdown and log-follow include the reth overlay.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Duplicate comments:
In `@Makefile`:
- Around line 161-172: The parse-time error triggered by the top-level
EXECUTION_CLIENT conditional should be moved so it only runs for devnet
workflows: either rename EXECUTION_CLIENT to a devnet-scoped variable (e.g.
DEVNET_EXECUTION_CLIENT) and update all references (DEVNET_EXECUTION_DEPS,
DEVNET_COMPOSE_FILES, MORPH_RETH_BUILD_FROM_SOURCE checks) accordingly, or keep
EXECUTION_CLIENT but remove the top-level $(error …) and instead perform the
validation inside the devnet target recipe (or a devnet-specific include) so the
error is only raised when running devnet-related targets; update the conditional
branches (the geth/reth/else logic) to use the chosen variable placement so
non-devnet targets like lint or bindings are not affected during Makefile parse
time.
---
Nitpick comments:
In `@Makefile`:
- Around line 186-218: devnet-down and devnet-logs don't honor
EXECUTION_CLIENT=reth so reth services get orphaned; add reth-specific targets
(e.g., devnet-down-reth and devnet-logs-reth) that invoke the existing commands
with EXECUTION_CLIENT=reth (mirror how devnet-clean-build-reth calls
devnet-clean-build) or modify devnet-down and devnet-logs to accept and forward
the EXECUTION_CLIENT variable into the docker compose invocation; reference
targets: devnet-down, devnet-logs, devnet-clean-build-reth, and the new
devnet-down-reth/devnet-logs-reth to ensure shutdown and log-follow include the
reth overlay.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 14303773-835c-4e07-bf9a-ca2ce3646d7b
📒 Files selected for processing (4)
Makefileops/devnet-morph/devnet/__init__.pyops/docker/docker-compose-4nodes.ymlops/docker/docker-compose-reth.yml
✅ Files skipped from review due to trivial changes (1)
- ops/docker/docker-compose-reth.yml
🚧 Files skipped from review as they are similar to previous changes (2)
- ops/devnet-morph/devnet/init.py
- ops/docker/docker-compose-4nodes.yml
Summary
EXECUTION_CLIENT=geth|rethdevnet selection andmake devnet-up-reth/make devnet-clean-build-rethhelpers.morph-el-*,validator-el) for geth/reth parity.ghcr.io/morph-l2/morph-reth:latest, while preserving local source builds viaMORPH_RETH_BUILD_FROM_SOURCE=true.--nat=noneplus--disable-discovery.*-elwhere the same wiring is shared by both clients.Notes
The default reth image is multi-arch and uses
/usr/local/bin/morph-rethas its entrypoint. Local source builds still use the builder target and/app/morph-reth.This PR intentionally does not fix the tx-submitter cold-start panic observed when the submitter queries block 1 while the L2 latest block is still 0. That behavior was reproduced in both geth and reth cold starts and should be handled as a separate tx-submitter boundary fix.
Validation
make -n devnet-up-rethmake -n devnet-up-reth MORPH_RETH_BUILD_FROM_SOURCE=truemake -n devnet-clean-build-rethdocker compose -f ops/docker/docker-compose-4nodes.yml configdocker compose -f ops/docker/docker-compose-4nodes.yml -f ops/docker/docker-compose-reth.yml configdocker manifest inspect ghcr.io/morph-l2/morph-reth:latestSummary by CodeRabbit
New Features
--execution-clientoptiondevnet-logs,devnet-up-reth, anddevnet-clean-build-rethtargetsChores