Skip to content

Commit d74b956

Browse files
committed
devnet fixes
1 parent 5a11faa commit d74b956

File tree

4 files changed

+179
-20
lines changed

4 files changed

+179
-20
lines changed

Makefile.devnet

Lines changed: 150 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
.PHONY: devnet-build devnet-tests-build devnet-up devnet-reset devnet-up-detach devnet-down devnet-stop devnet-clean devnet-deploy-tar devnet-upgrade devnet-new devnet-start
2-
.PHONY: devnet-build-default _check-devnet-default-cfg _devnet-select-default-genesis devnet-upgrade-binaries devnet-upgrade-binaries-default devnet-update-scripts
1+
.PHONY: devnet-build devnet-tests-build devnet-up devnet-reset devnet-up-detach devnet-down devnet-stop devnet-clean devnet-deploy-tar devnet-upgrade devnet-new devnet-start devnet-evm-upgrade
2+
.PHONY: devnet-build-default _check-devnet-default-cfg _devnet-select-default-genesis devnet-refresh-bin devnet-upgrade-binaries devnet-upgrade-binaries-default devnet-update-scripts
33
.PHONY: devnet-evmigration-sync-bin devnet-evmigration-prepare devnet-evmigration-estimate devnet-evmigration-migrate devnet-evmigration-migrate-validator devnet-evmigration-cleanup
4+
.PHONY: devnet-evmigrationp-prepare devnet-evmigrationp-estimate devnet-evmigrationp-migrate devnet-evmigrationp-migrate-validator devnet-evmigrationp-cleanup
45

56
##### Devnet Makefile ########################################
67
#
@@ -345,6 +346,28 @@ devnet-upgrade-binaries-default:
345346
echo "Using upgrade release $$release_name"; \
346347
./devnet/scripts/upgrade-binaries.sh "${DEVNET_BIN_DIR}" "$$release_name"
347348

349+
devnet-refresh-bin:
350+
@mkdir -p "${DEVNET_BIN_DIR}"; \
351+
$(MAKE) build; \
352+
if [ ! -f "${BUILD_DIR}/lumerad" ]; then \
353+
echo "Cannot find lumerad binary [${BUILD_DIR}/lumerad]"; \
354+
exit 1; \
355+
fi; \
356+
cp -f "${BUILD_DIR}/lumerad" "${DEVNET_BIN_DIR}/lumerad"; \
357+
if [ -f "${BUILD_DIR}/libwasmvm.x86_64.so" ]; then \
358+
cp -f "${BUILD_DIR}/libwasmvm.x86_64.so" "${DEVNET_BIN_DIR}/libwasmvm.x86_64.so"; \
359+
else \
360+
go get github.com/CosmWasm/wasmvm/$(WASMVM_VERSION) && \
361+
WASMVM_SO="$$(find $$(go env GOPATH)/pkg/mod/github.com/!cosm!wasm/wasmvm/$(WASMVM_VERSION) -name "libwasmvm.x86_64.so" -print -quit)" && \
362+
if [ -z "$$WASMVM_SO" ]; then \
363+
echo "Unable to locate libwasmvm.x86_64.so in GOPATH"; \
364+
exit 1; \
365+
fi; \
366+
cp -f "$$WASMVM_SO" "${DEVNET_BIN_DIR}/libwasmvm.x86_64.so"; \
367+
fi; \
368+
chmod +x "${DEVNET_BIN_DIR}/lumerad"; \
369+
echo "Refreshed ${DEVNET_BIN_DIR} from current repo build."
370+
348371
devnet-update-scripts:
349372
@if [ ! -f "$(COMPOSE_FILE)" ]; then \
350373
echo "Missing $(COMPOSE_FILE); run 'make devnet-build' first."; \
@@ -405,6 +428,7 @@ devnet-upgrade-1110:
405428
@cd devnet/scripts && ./upgrade.sh v1.11.0 auto-height ../bin-v1.11.0
406429

407430
devnet-upgrade-1120:
431+
@$(MAKE) devnet-refresh-bin
408432
@cd devnet/scripts && ./upgrade.sh v1.12.0 auto-height ../bin
409433

410434
devnet-new-172:
@@ -428,6 +452,70 @@ devnet-new-1110:
428452
sleep 10
429453
$(MAKE) devnet-up
430454

455+
devnet-evm-upgrade:
456+
@set -eu; \
457+
echo "==> Stage: install v1.11.0 devnet"; \
458+
if ! $(MAKE) devnet-down; then \
459+
echo "ERROR: stage 'install v1.11.0 devnet' failed during devnet-down" >&2; \
460+
exit 1; \
461+
fi; \
462+
if ! $(MAKE) devnet-clean; then \
463+
echo "ERROR: stage 'install v1.11.0 devnet' failed during devnet-clean" >&2; \
464+
exit 1; \
465+
fi; \
466+
if ! $(MAKE) devnet-build-1110; then \
467+
echo "ERROR: stage 'install v1.11.0 devnet' failed during devnet-build-1110" >&2; \
468+
exit 1; \
469+
fi; \
470+
sleep 10; \
471+
if ! $(MAKE) devnet-up-detach; then \
472+
echo "ERROR: stage 'install v1.11.0 devnet' failed during devnet-up-detach" >&2; \
473+
exit 1; \
474+
fi; \
475+
echo "==> Stage: wait for height 40"; \
476+
if ! ./devnet/scripts/wait-for-height.sh 40; then \
477+
echo "ERROR: stage 'wait for height 40' failed" >&2; \
478+
exit 1; \
479+
fi; \
480+
echo "==> Stage: devnet-evmigrationp-prepare"; \
481+
if ! $(MAKE) devnet-evmigrationp-prepare; then \
482+
echo "ERROR: stage 'devnet-evmigrationp-prepare' failed" >&2; \
483+
exit 1; \
484+
fi; \
485+
current_height="$$(docker compose -f $(COMPOSE_FILE) exec -T supernova_validator_1 \
486+
lumerad status 2>/dev/null | jq -r '.sync_info.latest_block_height // empty' 2>/dev/null || true)"; \
487+
if ! echo "$$current_height" | grep -Eq '^[0-9]+$$'; then \
488+
echo "ERROR: stage 'post-prepare wait' failed to determine current chain height" >&2; \
489+
exit 1; \
490+
fi; \
491+
target_height=$$((current_height + 5)); \
492+
echo "==> Stage: wait for height $${target_height}"; \
493+
if ! ./devnet/scripts/wait-for-height.sh "$$target_height"; then \
494+
echo "ERROR: stage 'post-prepare wait' failed while waiting for height $${target_height}" >&2; \
495+
exit 1; \
496+
fi; \
497+
echo "==> Stage: devnet-upgrade-1120"; \
498+
if ! $(MAKE) devnet-upgrade-1120; then \
499+
echo "ERROR: stage 'devnet-upgrade-1120' failed" >&2; \
500+
exit 1; \
501+
fi; \
502+
echo "==> Stage: devnet-evmigrationp-estimate"; \
503+
if ! $(MAKE) devnet-evmigrationp-estimate; then \
504+
echo "ERROR: stage 'devnet-evmigrationp-estimate' failed" >&2; \
505+
exit 1; \
506+
fi; \
507+
echo "==> Stage: devnet-evmigrationp-migrate-validator"; \
508+
if ! $(MAKE) devnet-evmigrationp-migrate-validator; then \
509+
echo "ERROR: stage 'devnet-evmigrationp-migrate-validator' failed" >&2; \
510+
exit 1; \
511+
fi; \
512+
echo "==> Stage: devnet-evmigrationp-migrate"; \
513+
if ! $(MAKE) devnet-evmigrationp-migrate; then \
514+
echo "ERROR: stage 'devnet-evmigrationp-migrate' failed" >&2; \
515+
exit 1; \
516+
fi; \
517+
echo "devnet-evm-upgrade completed successfully."
518+
431519
devnet-deploy-tar:
432520
# Ensure required files exist from previous build
433521
@if [ ! -f "devnet/docker-compose.yml" ] || [ ! -f "devnet/bin/lumerad" ] || [ ! -f "devnet/bin/libwasmvm.x86_64.so" ]; then \
@@ -552,3 +640,63 @@ devnet-evmigration-migrate-validator: devnet-evmigration-sync-bin
552640

553641
devnet-evmigration-cleanup: devnet-evmigration-sync-bin
554642
$(call _run_evmigration_in_containers,cleanup)
643+
644+
##### Parallel EVM Migration targets ##########################
645+
#
646+
# Same as the sequential targets above, but all validators run
647+
# concurrently. Output is prefixed with the service name.
648+
649+
define _run_evmigration_in_containers_parallel
650+
@if [ ! -f "$(COMPOSE_FILE)" ]; then \
651+
echo "docker-compose.yml not found; run 'make devnet-build' first"; \
652+
exit 1; \
653+
fi; \
654+
services="$(_EVMIGRATION_SERVICES)"; \
655+
if [ -z "$$services" ]; then \
656+
echo "No running supernova_validator_* services found; is the devnet up?"; \
657+
exit 1; \
658+
fi; \
659+
tmpdir="$$(mktemp -d)"; \
660+
pids=""; \
661+
for svc in $$services; do \
662+
accounts_path="$(_EVMIGRATION_ACCOUNTS_CONTAINER_PREFIX)-$${svc}.json"; \
663+
echo "=== $(1) on $${svc} (parallel) ==="; \
664+
( docker compose -f $(COMPOSE_FILE) exec -T "$${svc}" \
665+
"$(_EVMIGRATION_BIN_CONTAINER)" \
666+
$(_evmigration_common_container) \
667+
-accounts="$${accounts_path}" \
668+
-mode="$(1)" \
669+
$(2) > "$${tmpdir}/$${svc}.out" 2>&1 ; \
670+
echo $$? > "$${tmpdir}/$${svc}.rc" \
671+
) & \
672+
pids="$$pids $$!"; \
673+
done; \
674+
wait $$pids; \
675+
failed=0; \
676+
for svc in $$services; do \
677+
rc="$$(cat "$${tmpdir}/$${svc}.rc" 2>/dev/null || echo 1)"; \
678+
echo "=== output from $${svc} (exit $$rc) ==="; \
679+
sed "s/^/[$${svc}] /" < "$${tmpdir}/$${svc}.out" 2>/dev/null || true; \
680+
if [ "$$rc" != "0" ]; then \
681+
echo "FAIL: $(1) on $${svc} exited with code $$rc"; \
682+
failed=1; \
683+
fi; \
684+
done; \
685+
rm -rf "$$tmpdir"; \
686+
if [ "$$failed" = "1" ]; then exit 1; fi
687+
endef
688+
689+
devnet-evmigrationp-prepare: devnet-evmigration-sync-bin
690+
$(call _run_evmigration_in_containers_parallel,prepare,-num-accounts=$(EVMIGRATION_NUM_ACCOUNTS) -num-extra=$(EVMIGRATION_NUM_EXTRA))
691+
692+
devnet-evmigrationp-estimate: devnet-evmigration-sync-bin
693+
$(call _run_evmigration_in_containers_parallel,estimate)
694+
695+
devnet-evmigrationp-migrate: devnet-evmigration-sync-bin
696+
$(call _run_evmigration_in_containers_parallel,migrate)
697+
698+
devnet-evmigrationp-migrate-validator: devnet-evmigration-sync-bin
699+
$(call _run_evmigration_in_containers_parallel,migrate-validator)
700+
701+
devnet-evmigrationp-cleanup: devnet-evmigration-sync-bin
702+
$(call _run_evmigration_in_containers_parallel,cleanup)

devnet/dockerfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ ARG SCRIPTS_DEST_DIR=/root/scripts
99
LABEL Name="${APP_NAME}" \
1010
Version="${APP_VERSION}"
1111

12+
# Use bash as default shell (debian:slim defaults to dash)
13+
SHELL ["/bin/bash", "-c"]
14+
1215
RUN apt-get update && apt-get install -y --no-install-recommends \
1316
curl \
1417
jq \
@@ -23,6 +26,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
2326
lnav \
2427
mc \
2528
nginx-light \
29+
ripgrep \
2630
&& rm -rf /var/lib/apt/lists/*
2731

2832
# Install Node.js (for network-maker UI tooling) using NodeSource 25.x

devnet/scripts/supernode-setup.sh

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,25 @@ TX_GAS_PRICES="${TX_GAS_PRICES:-0.03ulume}"
2626
# its own denom (e.g. aatom/alume). Query the feemarket params at runtime and
2727
# override TX_GAS_PRICES so bank-send txs satisfy the check.
2828
update_gas_prices_for_evm() {
29-
local params base_fee fee_denom
29+
local params evm_config base_fee fee_denom
3030
params="$($DAEMON q feemarket params --output json 2>/dev/null || true)"
3131
if [[ -z "$params" ]]; then
3232
return
3333
fi
3434
fee_denom="$(echo "$params" | jq -r '.params.fee_denom // empty' 2>/dev/null || true)"
35-
base_fee="$(echo "$params" | jq -r '.params.base_fee // empty' 2>/dev/null || true)"
35+
base_fee="$(echo "$params" | jq -r '.params.base_fee // .params.min_gas_price // empty' 2>/dev/null || true)"
36+
if [[ -z "$fee_denom" ]]; then
37+
evm_config="$($DAEMON q evm config --output json 2>/dev/null || true)"
38+
fee_denom="$(echo "$evm_config" | jq -r '.config.denom // empty' 2>/dev/null || true)"
39+
fi
3640
if [[ -n "$fee_denom" && -n "$base_fee" ]]; then
3741
# Use 2× base fee as gas price to ensure acceptance under fee fluctuation
3842
local price
39-
price="$(echo "$base_fee" | awk '{printf "%.0f", $1 * 2}')"
40-
# Ensure price is at least 1
41-
[[ "$price" == "0" || -z "$price" ]] && price="1"
43+
price="$(jq -nr --arg base_fee "$base_fee" '
44+
($base_fee | tonumber * 2)
45+
| if . < 0.000001 then 0.000001 else . end
46+
' 2>/dev/null || true)"
47+
[[ -z "$price" || "$price" == "null" ]] && price="0.000001"
4248
TX_GAS_PRICES="${price}${fee_denom}"
4349
echo "[SN] Feemarket active: using gas price ${TX_GAS_PRICES} (base_fee=${base_fee}${fee_denom})"
4450
fi

devnet/scripts/wait-for-height.sh

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,18 @@ INTERVAL="${INTERVAL:-5}"
2020
TIMEOUT_SECONDS="${TIMEOUT_SECONDS:-600}"
2121

2222
deadline=$((SECONDS + TIMEOUT_SECONDS))
23-
CONSECUTIVE_FAILURES=0
23+
CONSECUTIVE_PENDING_POLLS=0
2424
MAX_FAILURES_BEFORE_LOG_CHECK="${MAX_FAILURES_BEFORE_LOG_CHECK:-3}"
2525

26+
detect_upgrade_halt() {
27+
local logs
28+
logs="$(docker compose -f "${COMPOSE_FILE}" logs --tail=50 "${SERVICE}" 2>/dev/null || true)"
29+
if echo "${logs}" | grep -qE "UPGRADE.*NEEDED.*height.*${TARGET_HEIGHT}|UPGRADE.*NEEDED at height: ${TARGET_HEIGHT}"; then
30+
return 0
31+
fi
32+
return 1
33+
}
34+
2635
echo "Waiting for block height >= ${TARGET_HEIGHT} (service=${SERVICE}, timeout=${TIMEOUT_SECONDS}s)..."
2736

2837
while ((SECONDS < deadline)); do
@@ -34,18 +43,10 @@ while ((SECONDS < deadline)); do
3443
exit 0
3544
fi
3645

37-
# Detect node crash due to upgrade halt
38-
if [[ "$height" == "0" ]]; then
39-
CONSECUTIVE_FAILURES=$((CONSECUTIVE_FAILURES + 1))
40-
if ((CONSECUTIVE_FAILURES >= MAX_FAILURES_BEFORE_LOG_CHECK)); then
41-
logs="$(docker compose -f "${COMPOSE_FILE}" logs --tail=50 "${SERVICE}" 2>/dev/null || true)"
42-
if echo "${logs}" | grep -qE "UPGRADE.*NEEDED.*height.*${TARGET_HEIGHT}|UPGRADE.*NEEDED at height: ${TARGET_HEIGHT}"; then
43-
echo "Node halted for upgrade at height ${TARGET_HEIGHT} (detected from container logs)."
44-
exit 0
45-
fi
46-
fi
47-
else
48-
CONSECUTIVE_FAILURES=0
46+
CONSECUTIVE_PENDING_POLLS=$((CONSECUTIVE_PENDING_POLLS + 1))
47+
if ((CONSECUTIVE_PENDING_POLLS >= MAX_FAILURES_BEFORE_LOG_CHECK)) && detect_upgrade_halt; then
48+
echo "Node halted for upgrade at height ${TARGET_HEIGHT} (detected from container logs)."
49+
exit 0
4950
fi
5051

5152
echo "Current height ${height}."

0 commit comments

Comments
 (0)