Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
38dbfbe
chore: migrate hedera local node to solo (#1668)
BartoszSolkaBD May 5, 2026
2082e9e
chore: updated node version in workflows using solo (#1668)
BartoszSolkaBD May 5, 2026
9360233
chore: added node-aliases variable to relayNode (#1668)
BartoszSolkaBD May 5, 2026
7fca801
debug: added debug step to get relay pod logs (#1668)
BartoszSolkaBD May 5, 2026
ed5112b
debug: added debug step to get relay pod logs (#1668)
BartoszSolkaBD May 5, 2026
3eb4a12
debug: added debug step to get relay pod logs (#1668)
BartoszSolkaBD May 5, 2026
96f8b97
debug: added custom namespace to solo falcon deploy (#1668)
BartoszSolkaBD May 6, 2026
9a0462c
debug: added force-port-forward flag (#1668)
BartoszSolkaBD May 6, 2026
3a20706
debug: removed external-address parameter (#1668)
BartoszSolkaBD May 6, 2026
9f2abc0
debug: added force-port-forward for relay (#1668)
BartoszSolkaBD May 6, 2026
a1f9234
debug: cleanup of debug scripts and unncessary parameters (#1668)
BartoszSolkaBD May 6, 2026
a66a630
debug: added namespace definition (#1668)
BartoszSolkaBD May 6, 2026
08ac25e
chore: updated solo version (#1668)
BartoszSolkaBD May 6, 2026
dd7c686
chore: added node-aliases to consensus node (#1668)
BartoszSolkaBD May 6, 2026
9cc5e2e
debug: add more diagnostics to localize the root issue (#1668)
BartoszSolkaBD May 6, 2026
5b19c19
chore: downgraded mirror node version (#1668)
BartoszSolkaBD May 6, 2026
04bf278
chore: downgraded mirror node version (#1668)
BartoszSolkaBD May 6, 2026
e428a71
chore: downgraded mirror node version (#1668)
BartoszSolkaBD May 6, 2026
e9a8837
chore: migrate hedera local node to solo (#1668)
BartoszSolkaBD May 7, 2026
6f2cd2a
chore: migrate hedera local node to solo (#1668)
BartoszSolkaBD May 7, 2026
d741c7d
docs: updated workflows_documentation file with new upgrade strategy …
BartoszSolkaBD May 7, 2026
791c5da
chore: migrate hedera local node to solo (#1668)
BartoszSolkaBD May 7, 2026
c981e30
chore: removed unused script (#1668)
BartoszSolkaBD May 7, 2026
f9e0c62
docs: documentation update (#1668)
BartoszSolkaBD May 7, 2026
3e832c8
chore: fixed package.json comma issue (#1668)
BartoszSolkaBD May 7, 2026
759bcaf
chore: enabled debug api in relay; regenerated opcodeLoggerBesuResult…
BartoszSolkaBD May 7, 2026
0ce3412
chore: forwarded ports required for SDK (#1668)
BartoszSolkaBD May 8, 2026
f105e3c
chore: fixed opcodeLogger tests; added verification after solo startu…
BartoszSolkaBD May 8, 2026
86d9d15
chore: removed timeout-minutes from composite action (#1668)
BartoszSolkaBD May 8, 2026
c7a23c3
chore: no forwarding test (#1668)
jasuwienas May 8, 2026
29270d0
chore: no forwarding test (#1668)
jasuwienas May 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 99 additions & 0 deletions .github/actions/setup-solo-stack/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
name: Setup Solo stack (Kind + Falcon one-shot)
description: Deploys a local Hiero network using Solo Falcon one-shot on Kind.

inputs:
network-tag:
description: Consensus / network node container image tag (--release-tag)
required: false
default: "v0.72.0"
mirror-tag:
description: Mirror node chart/image version (--mirror-node-version)
required: false
default: "v0.151.0"
solo-version:
description: npm package version for @hashgraph/solo
required: false
default: "0.72.0"
relay-tag:
description: JSON-RPC relay image/chart tag (--relay-release)
required: false
default: "0.76.2"

outputs:
deployment_name:
description: Solo deployment name created by the action.
value: ${{ steps.solo_deploy.outputs.deployment_name }}
namespace:
description: Kubernetes namespace used by the Solo deployment.
value: ${{ steps.solo_deploy.outputs.namespace }}

runs:
using: composite
steps:
- name: Generate falcon-values config file
shell: bash
run: |
cat > .github/falcon.yml <<EOF
network:
--release-tag: "${{ inputs.network-tag }}"
setup:
--release-tag: "${{ inputs.network-tag }}"
consensusNode:
--force-port-forward: true
--node-aliases: "node1"
mirrorNode:
--enable-ingress: true
--pinger: true
--mirror-node-version: "${{ inputs.mirror-tag }}"
--values-file: .github/mirror-node-values.yaml
--force-port-forward: true
relayNode:
--relay-release: "${{ inputs.relay-tag }}"
--values-file: .github/relay-values.yaml
--node-aliases: "node1"
--force-port-forward: true
EOF

- name: Setup Kind
uses: helm/kind-action@ef37e7f390d99f746eb8b610417061a60e82a6cc # v1.14.0
with:
install_only: true
node_image: kindest/node:v1.32.5@sha256:e3b2327e3a5ab8c76f5ece68936e4cafaa82edf58486b769727ab0b3b97a5b0d
version: v0.29.0
kubectl_version: v1.32.5
verbosity: 3
wait: 120s

- name: Start the Solo node
id: solo_deploy
shell: bash
run: |
NS_BASE="sc-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}-${GITHUB_JOB}"
SOLO_NS="$(echo "$NS_BASE" | tr '[:upper:]_' '[:lower:]-' | cut -c1-63)"
SOLO_DEPLOYMENT="$SOLO_NS"

echo "deployment_name=${SOLO_DEPLOYMENT}" >> "$GITHUB_OUTPUT"
echo "namespace=${SOLO_NS}" >> "$GITHUB_OUTPUT"

npx @hashgraph/solo@${{ inputs.solo-version }} one-shot falcon deploy \
--values-file .github/falcon.yml \
--dev \
--deploy-explorer=false \
--deployment "$SOLO_DEPLOYMENT" \
--namespace "$SOLO_NS"

- name: Verify Mirror REST API
shell: bash
run: |
echo "Waiting for mirror node REST API..."
for i in $(seq 1 30); do
response=$(curl -sf http://localhost:38081/api/v1/accounts 2>/dev/null || true)
if echo "${response}" | grep -q '"accounts"'; then
echo "Mirror REST API is up."
exit 0
fi
echo "Attempt ${i}/30: not ready, retrying in 10s..."
sleep 10
done
echo "ERROR: Mirror REST API did not become available."
exit 1
32 changes: 32 additions & 0 deletions .github/actions/solo-kubectl-port-forward/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Solo kubectl port forwards (50211 / 8545)
description: >-
Starts background kubectl port-forward processes so localhost matches @hashgraph/sdk
local-node expectations (127.0.0.1:50211 → consensus via HAProxy) and mirror Web3
(127.0.0.1:8545 → svc/mirror-1-web3), consistent with hiero-sdk-js solo-lib.js.

inputs:
namespace:
description: Kubernetes namespace from setup-solo-stack outputs (`steps.*.outputs.namespace`).
required: true

runs:
using: composite
steps:
- name: Start kubectl port forwards
shell: bash
run: |
set -euo pipefail
NS="${{ inputs.namespace }}"

kubectl get svc haproxy-node1-svc -n "$NS"
kubectl port-forward -n "$NS" svc/haproxy-node1-svc 50211:50211 &
echo "Forwarding svc/haproxy-node1-svc → localhost:50211 (consensus gRPC for local-node)"

if kubectl get svc mirror-1-web3 -n "$NS" &>/dev/null; then
kubectl port-forward -n "$NS" svc/mirror-1-web3 8545:80 &
echo "Forwarding svc/mirror-1-web3 → localhost:8545 (mirror Web3)"
else
echo "::warning::svc/mirror-1-web3 not found in $NS; skipping 8545 forward"
fi

sleep 3
17 changes: 17 additions & 0 deletions .github/falcon.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
network:
--release-tag: "v0.72.0"
setup:
--release-tag: "v0.72.0"
consensusNode:
--force-port-forward: true
mirrorNode:
--enable-ingress: true
--pinger: true
--mirror-node-version: "v0.151.0"
--values-file: .github/mirror-node-values.yaml
--force-port-forward: true
relayNode:
--relay-release: "0.76.2"
--node-aliases: "node1"
--values-file: .github/relay-values.yaml
--force-port-forward: true
4 changes: 4 additions & 0 deletions .github/mirror-node-values.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
web3:
env:
HIERO_MIRROR_WEB3_OPCODE_TRACER_ENABLED: "true"
HIERO_MIRROR_WEB3_EVM_NETWORK: "OTHER"
6 changes: 6 additions & 0 deletions .github/relay-values.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
relay:
config:
DEBUG_API_ENABLED: "true"
ws:
config:
DEBUG_API_ENABLED: "true"
4 changes: 2 additions & 2 deletions .github/workflows/erc-registry-indexer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,10 @@ jobs:
with:
submodules: recursive

- name: Use Node.js [20]
- name: Use Node.js [22]
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
node-version: 22

- name: Set Environment Variables
run: |
Expand Down
38 changes: 30 additions & 8 deletions .github/workflows/erc-registry-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@ jobs:
with:
submodules: recursive

- name: Use Node.js [20]
- name: Use Node.js [22]
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
node-version: 22

- name: Create .env file
run: cp ${{env.INDEXER_PATH}}/local.env ${{env.INDEXER_PATH}}/.env
Expand All @@ -46,15 +46,37 @@ jobs:
cd ${{env.INDEXER_PATH}}
npm run test:unit

- name: Start the local node
run: npx hedera start -d --verbose=trace
timeout-minutes: 5
- name: Deploy local Hiero network (Solo / Kind)
id: solo_stack
uses: ./.github/actions/setup-solo-stack
with:
solo-version: "0.71.0"
timeout-minutes: 15

- name: Solo kubectl port forwards (50211 / 8545)
uses: ./.github/actions/solo-kubectl-port-forward
with:
namespace: ${{ steps.solo_stack.outputs.namespace }}

- name: Run Acceptance Tests
run: |
cd ${{env.INDEXER_PATH}}
npm run test:acceptance

- name: Stop the local node
if: ${{ !cancelled() }}
run: npx hedera stop
- name: One-shot Falcon destroy
if: always()
run: |
npx @hashgraph/solo@0.71.0 one-shot falcon destroy \
--deployment "${{ steps.solo_stack.outputs.deployment_name }}" \
--dev \
--quiet-mode || true

- name: Upload Solo logs
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: solo-logs
path: ~/.solo/logs/*
overwrite: true
if-no-files-found: warn

4 changes: 2 additions & 2 deletions .github/workflows/foundry_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ jobs:
with:
submodules: recursive

- name: Use Node.js [20]
- name: Use Node.js [22]
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
node-version: 22
#cache: npm Disabling this because it causes the workflow to hang and eventually timeout

- name: Create .env file
Expand Down
105 changes: 80 additions & 25 deletions .github/workflows/migration-testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ on:
description: 'Specify post-migration test tags'
required: false
default: '@post-migration'
soloVersion:
description: 'npm version for @hashgraph/solo (Falcon one-shot on Kind)'
required: false
default: '0.71.0'

jobs:
check:
Expand All @@ -53,10 +57,10 @@ jobs:
with:
submodules: recursive

- name: Use Node.js [20]
- name: Use Node.js [22]
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 20
node-version: 22
#cache: npm Disabling this because it causes the workflow to hang and eventually timeout

- name: Create .env file
Expand All @@ -70,36 +74,87 @@ jobs:
with:
version: stable

- name: Start the local node with N:${{ inputs.initialNetworkNodeTag }}, M:${{ inputs.initialMirrorNodeTag }}, R:${{ inputs.initialRelayTag }}
run: npx hedera start -d --full --network-tag=${{inputs.initialNetworkNodeTag}} --mirror-tag=${{inputs.initialMirrorNodeTag}} --relay-tag=${{inputs.initialRelayTag}}
timeout-minutes: 5
# Initial stack (Solo / Kind). Image tags come from workflow_dispatch inputs.
- name: Deploy local Hiero network — initial tags (Solo / Kind)
id: initial_solo
uses: ./.github/actions/setup-solo-stack
with:
network-tag: ${{ inputs.initialNetworkNodeTag }}
mirror-tag: ${{ inputs.initialMirrorNodeTag }}
relay-tag: ${{ inputs.initialRelayTag }}
solo-version: ${{ inputs.soloVersion }}
timeout-minutes: 15

- name: Solo kubectl port forwards (50211 / 8545)
uses: ./.github/actions/solo-kubectl-port-forward
with:
namespace: ${{ steps.initial_solo.outputs.namespace }}

- name: Run pre-migration tests
run: npx hardhat test --grep ${{ inputs.preMigrationTestTags }}
timeout-minutes: 15

- name: Freeze the network
run: |
npx hardhat run scripts/freeze-network-node.js
sleep 30
timeout-minutes: 5

- name: Stop docker containers (network node)
run: docker stop network-node json-rpc-relay json-rpc-relay-ws
timeout-minutes: 5

- name: Run the local node with N:${{ inputs.targetNetworkNodeTag }}, M:${{ inputs.targetMirrorNodeTag }}, R:${{ inputs.targetRelayTag }}
env:
NETWORK_NODE_IMAGE_TAG: ${{inputs.targetNetworkNodeTag}}
MIRROR_IMAGE_TAG: ${{inputs.targetMirrorNodeTag}}
RELAY_IMAGE_TAG: ${{inputs.targetRelayTag}}
NETWORK_NODE_LOGS_ROOT_PATH: ~/.local/share/hedera-local/network-logs/node
- name: Upgrade local Hiero network in place — target tags (Solo / Kind)
run: |
docker compose -f docker-compose-state-migration.yml up -d
sleep 5
working-directory: node_modules/@hashgraph/hedera-local/
timeout-minutes: 5
set -euo pipefail

DEPLOYMENT="${{ steps.initial_solo.outputs.deployment_name }}"
INITIAL_NETWORK_TAG="${{ inputs.initialNetworkNodeTag }}"
TARGET_NETWORK_TAG="${{ inputs.targetNetworkNodeTag }}"
INITIAL_MIRROR_TAG="${{ inputs.initialMirrorNodeTag }}"
TARGET_MIRROR_TAG="${{ inputs.targetMirrorNodeTag }}"
INITIAL_RELAY_TAG="${{ inputs.initialRelayTag }}"
TARGET_RELAY_TAG="${{ inputs.targetRelayTag }}"

normalize_version() {
printf '%s' "$1" | sed 's/^v//'
}

if [[ "$(normalize_version "$INITIAL_NETWORK_TAG")" != "$(normalize_version "$TARGET_NETWORK_TAG")" ]]; then
npx @hashgraph/solo@${{ inputs.soloVersion }} consensus network upgrade \
--deployment "$DEPLOYMENT" \
--upgrade-version "$(normalize_version "$TARGET_NETWORK_TAG")" \
--dev \
--force
fi

if [[ "$(normalize_version "$INITIAL_MIRROR_TAG")" != "$(normalize_version "$TARGET_MIRROR_TAG")" ]]; then
npx @hashgraph/solo@${{ inputs.soloVersion }} mirror node upgrade \
--deployment "$DEPLOYMENT" \
--mirror-node-version "$TARGET_MIRROR_TAG" \
--values-file .github/mirror-node-values.yaml \
--enable-ingress \
--pinger \
--force-port-forward
fi

if [[ "$(normalize_version "$INITIAL_RELAY_TAG")" != "$(normalize_version "$TARGET_RELAY_TAG")" ]]; then
npx @hashgraph/solo@${{ inputs.soloVersion }} relay node upgrade \
--deployment "$DEPLOYMENT" \
--relay-release "$TARGET_RELAY_TAG" \
--node-aliases "node1" \
--values-file .github/relay-values.yaml
--force-port-forward
fi
timeout-minutes: 30

- name: Run post-migration tests
run: npx hardhat test --grep ${{ inputs.postMigrationTestTags }}
timeout-minutes: 15

- name: One-shot Falcon destroy
if: always()
run: |
npx @hashgraph/solo@${{ inputs.soloVersion }} one-shot falcon destroy \
--deployment "${{ steps.initial_solo.outputs.deployment_name }}" \
--dev \
--quiet-mode || true

- name: Upload Solo logs
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: solo-logs
path: ~/.solo/logs/*
overwrite: true
if-no-files-found: warn
Loading
Loading