Repository: hashgraph/hedera-local-node
Pull request #701 (2024-07-17 09:12:07)

chore: Bump cypress from 13.13.0 to 13.13.1 in /test/cypress
Bumps [cypress](https://github.com/cypress-io/cypress) from 13.13.0 to 13.13.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/cypress-io/cypress/releases">cypress's releases</a>.</em></p>
<blockquote>
<h2>v13.13.1</h2>
<p>Changelog: <a href="https://docs.cypress.io/guides/references/changelog#13-13-1">https://docs.cypress.io/guides/references/changelog#13-13-1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/cypress-io/cypress/commit/5c9dc77708391655141b6ab1321e82c397f1234e"><code>5c9dc77</code></a> chore: release 13.13.1 (<a href="https://redirect.github.com/cypress-io/cypress/issues/29868">#29868</a>)</li>
<li><a href="https://github.com/cypress-io/cypress/commit/279a372bacad8e6bbfb6beea4e1ed8b9e84fff75"><code>279a372</code></a> chore: bumps ts libs used by driver (<a href="https://redirect.github.com/cypress-io/cypress/issues/29865">#29865</a>)</li>
<li><a href="https://github.com/cypress-io/cypress/commit/8a48ee7cdf92a1659524876cd25457fd51fbfeb3"><code>8a48ee7</code></a> fix: Unhandled &quot;WebSocket connection closed&quot; when CDP connection is unstable ...</li>
<li><a href="https://github.com/cypress-io/cypress/commit/cbbc8ee21beea08ce0e347f9bb2e95da83b9849d"><code>cbbc8ee</code></a> chore: Update v8 snapshot cache (<a href="https://redirect.github.com/cypress-io/cypress/issues/29862">#29862</a>)</li>
<li><a href="https://github.com/cypress-io/cypress/commit/62d30daf6139b22acbabd36b542a0a83123d25f3"><code>62d30da</code></a> chore: collect additional ci envs (<a href="https://redirect.github.com/cypress-io/cypress/issues/29845">#29845</a>)</li>
<li><a href="https://github.com/cypress-io/cypress/commit/217f27f3ef3ea3f1aa5b65816a199c886d388b84"><code>217f27f</code></a> chore: increase electron node version print timeout to pass binary jobs on da...</li>
<li><a href="https://github.com/cypress-io/cypress/commit/4bc8996568cda8f04f157e7f9746a27a0038fee3"><code>4bc8996</code></a> chore: fix duplicate changelog entry (<a href="https://redirect.github.com/cypress-io/cypress/issues/29857">#29857</a>)</li>
<li><a href="https://github.com/cypress-io/cypress/commit/034c3f2e0fa643dc12394777a8fb78f452dfa64f"><code>034c3f2</code></a> chore: Update v8 snapshot cache (<a href="https://redirect.github.com/cypress-io/cypress/issues/29848">#29848</a>)</li>
<li><a href="https://github.com/cypress-io/cypress/commit/4755bd9012f2c81246ec24ec6c4c8632386bc95a"><code>4755bd9</code></a> dependency: Replace jsonlint with json-parse-even-better-errors (<a href="https://redirect.github.com/cypress-io/cypress/issues/29673">#29673</a>)</li>
<li><a href="https://github.com/cypress-io/cypress/commit/bbfd9a60a5176dff303754937cc7aeece5cab484"><code>bbfd9a6</code></a> chore: Update v8 snapshot cache (<a href="https://redirect.github.com/cypress-io/cypress/issues/29847">#29847</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/cypress-io/cypress/compare/v13.13.0...v13.13.1">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=cypress&package-manager=npm_and_yarn&previous-version=13.13.0&new-version=13.13.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>

sonarcloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=hashgraph_hedera-local-node&pullRequest=701) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=hashgraph_hedera-local-node&pullRequest=701&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=hashgraph_hedera-local-node&pullRequest=701&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=hashgraph_hedera-local-node&pullRequest=701&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=hashgraph_hedera-local-node&pullRequest=701&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=hashgraph_hedera-local-node&pullRequest=701&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarCloud](https://sonarcloud.io/dashboard?id=hashgraph_hedera-local-node&pullRequest=701)



Patch:
diff --git a/.env b/.env
index 5e6ef80..1cb974a 100644
--- a/.env
+++ b/.env
@@ -1,11 +1,11 @@
 #### Image Names & Prefixes ####
 HAVEGED_IMAGE_PREFIX=gcr.io/hedera-registry/
 NETWORK_NODE_IMAGE_PREFIX=gcr.io/hedera-registry/
-NETWORK_NODE_IMAGE_NAME=main-network-node
+NETWORK_NODE_IMAGE_NAME=consensus-node
 
 #### Image Tags/Hashes ####
-NETWORK_NODE_IMAGE_TAG=0.52.0-alpha.4
-HAVEGED_IMAGE_TAG=0.52.0-alpha.4
+NETWORK_NODE_IMAGE_TAG=0.52.0
+HAVEGED_IMAGE_TAG=0.52.0-alpha.6
 
 #### Java Process Settings ####
 PLATFORM_JAVA_HEAP_MIN=256m
@@ -29,10 +29,10 @@ PYTHON_VERSION=python3.7
 
 #### MirrorNode Prefixes & Tags ####
 MIRROR_IMAGE_PREFIX=gcr.io/mirrornode/
-MIRROR_IMAGE_TAG=0.108.0
+MIRROR_IMAGE_TAG=0.110.0-rc2
 
 #### MirrorNode settings ####
-MIRROR_POSTGRES_IMAGE=postgres:14-alpine
+MIRROR_POSTGRES_IMAGE=ghcr.io/mhga24/postgres:latest
 MIRROR_GRPC_MEM_LIMIT=512m
 MIRROR_IMPORTER_MEM_LIMIT=768m
 MIRROR_REST_MEM_LIMIT=512m
@@ -45,7 +45,7 @@ MINIO_ROOT_PASSWORD=minioadmin
 
 #### JSON RPC Relay Prefixes & Tags ####
 RELAY_IMAGE_PREFIX=ghcr.io/hashgraph/
-RELAY_IMAGE_TAG=0.51.1
+RELAY_IMAGE_TAG=0.52.1
 
 #### JSON RPC Relay limits ####
 RELAY_MEM_LIMIT=768m
@@ -85,7 +85,7 @@ STREAM_EXTENSION=rcd.gz
 STREAM_SIG_EXTENSION=rcd_sig
 
 #### ENVOY ####
-ENVOY_IMAGE_PREFIX=envoyproxy/
+ENVOY_IMAGE_PREFIX=ghcr.io/mhga24/envoyproxy/
 ENVOY_IMAGE_TAG=v1.22.0
 
 #### Mirror Node Explorer Prefixes & Tags ####
@@ -97,9 +97,9 @@ DOCKER_LOCAL_MIRROR_NODE_MENU_NAME=LOCALNET
 DOCKER_LOCAL_MIRROR_NODE_URL=http://127.0.0.1:5551/
 
 ### Prometheus ####
-PROMETHEUS_IMAGE_NAME=prom/prometheus
+PROMETHEUS_IMAGE_NAME=ghcr.io/mhga24/prom/prometheus
 PROMETHEUS_IMAGE_TAG=v2.41.0
 
 ### Grafana ####
-GRAFANA_IMAGE_NAME=grafana/grafana
+GRAFANA_IMAGE_NAME=ghcr.io/mhga24/grafana/grafana
 GRAFANA_IMAGE_TAG=8.5.16
diff --git a/.github/workflows/flow-pull-request-checks.yaml b/.github/workflows/flow-pull-request-checks.yaml
index 72ea37d..99241b8 100644
--- a/.github/workflows/flow-pull-request-checks.yaml
+++ b/.github/workflows/flow-pull-request-checks.yaml
@@ -64,7 +64,7 @@ jobs:
           npm ci
 
       - name: Start the local node
-        run: npm run start -- -d
+        run: npm run start -- -d --verbose=trace
 
       - name: Run smoke test
         uses: step-security/retry@052d8009a065e321fd72db951d7e412f8063b9e5 # v3.0.0
@@ -103,7 +103,7 @@ jobs:
           npm ci
 
       - name: Start local node
-        run: npm run start -- -d
+        run: npm run start -- -d --verbose=trace
 
       - name: Prepare and run the tests
         run: |
diff --git a/README.md b/README.md
index e50d9d2..7ce1e73 100644
--- a/README.md
+++ b/README.md
@@ -90,6 +90,7 @@ npm install && npm install -g
 
 > **_NOTE:_**  If you want to use any of the CLI options listed below, you'd need to pass `--` after `npm run start` (for example) and then specify the wanted option. For example, if you want to start in detached mode, you can use `npm run start -- -d`
 
+> **_WARNING:_** While stopping the networks, we will first list all Docker networks with the `hedera-` prefix in their names. This operation may affect not only the networks initiated by the `npm run start` command from this repository but also any other networks you have created with this prefix. Network termination can be triggered both by a direct `npm run stop` call and by the `npm run start` script if the initial startup process fails and failover recovery is activated. One of the recovery steps includes attempting to close all previously started networks with the `hedera-` prefix.
 
 ## Using hedera-local
 
diff --git a/compose-network/mirror-node/application.yml b/compose-network/mirror-node/application.yml
index ace701b..bd9e30f 100644
--- a/compose-network/mirror-node/application.yml
+++ b/compose-network/mirror-node/application.yml
@@ -11,6 +11,7 @@ hedera:
             persist:
               transactionBytes: false
               transactionRecordBytes: false
+              transactionHash: true
             redis:
               enabled: false
           sidecar:
diff --git a/compose-network/mirror-node/init.sh b/compose-network/mirror-node/init.sh
index ea1b137..c47666f 100755
--- a/compose-network/mirror-node/init.sh
+++ b/compose-network/mirror-node/init.sh
@@ -6,7 +6,8 @@ export PGDATABASE="${POSTGRES_DB:-postgres}"
 export PGHOST="${PGHOST}"
 export PGUSER="${POSTGRES_USER:-postgres}"
 
-DB_SPECIFIC_EXTENSION_SQL="create extension btree_gist;"
+DB_SPECIFIC_EXTENSION_SQL="create extension btree_gist;
+                           create extension pg_trgm;"
 # PostgreSQL 16 requires role A to have Admin privilege on role B in order to grant role B to any other role, and there
 # are several versioned v1 migrations that grant :importerUsername to :ownerUsername.
 DB_SPECIFIC_IMPORTER_ROLE_ADMIN="admin :ownerUsername"
@@ -15,6 +16,7 @@ DB_SPECIFIC_SQL="alter user :ownerUsername with createrole;"
 # v2 schema no longer creates the REST API user, while v1 schema still does
 if [[ "${SCHEMA_V2}" == "true" ]]; then
   DB_SPECIFIC_EXTENSION_SQL="create extension if not exists btree_gist;
+                             create extension if not exists pg_trgm;
                              create extension citus;
                              grant all privileges on database :dbName to :ownerUsername;
                              grant create on database :dbName to :ownerUsername;
diff --git a/docker-compose-state-migration.yml b/docker-compose-state-migration.yml
index 771dfd1..233abc1 100644
--- a/docker-compose-state-migration.yml
+++ b/docker-compose-state-migration.yml
@@ -356,7 +356,7 @@ services:
 
 networks:
   network-node-bridge:
-    name: network-node-bridge
+    name: hedera-network-node-bridge
     driver: bridge
     ipam:
       driver: default
@@ -365,10 +365,10 @@ networks:
           ip_range: 172.27.0.0/24
           gateway: 172.27.0.254
   mirror-node:
-    name: mirror-node
+    name: hedera-mirror-node
     driver: bridge
   cloud-storage:
-    name: cloud-storage
+    name: hedera-cloud-storage
     driver: bridge
 
 volumes:
diff --git a/docker-compose.evm.yml b/docker-compose.evm.yml
index 3c1ca83..b6fc180 100644
--- a/docker-compose.evm.yml
+++ b/docker-compose.evm.yml
@@ -8,6 +8,7 @@ services:
         "echo 'Deleting old recordStream files.';find /records/ -type f -delete;echo 'This container is intentionally disabled by the EVM profile.';"
       ]
     command: []
+
   account-balances-uploader:
     restart: "no"
     entrypoint:
@@ -17,6 +18,7 @@ services:
         "echo 'Deleting old accountBalances files.';find /balances/ -type f -delete;echo 'This container is intentionally disabled by the EVM profile.';"
       ]
     command: []
+
   record-sidecar-uploader:
     restart: "no"
     entrypoint:
@@ -26,6 +28,7 @@ services:
         "echo 'Deleting old sidecars files.';find /sidecar-files/ -type f -delete;echo 'This container is intentionally disabled by the EVM profile.';"
       ]
     command: []
+
   minio:
     restart: "no"
     entrypoint:
@@ -34,6 +37,7 @@ services:
         "This container is intentionally disabled by the EVM profile."
       ]
     command: []
+
   importer:
     user: root
     volumes:
diff --git a/docker-compose.yml b/docker-compose.yml
index 2ec9fb7..49a260f 100755
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -172,7 +172,7 @@ services:
       - --debug
 
   minio:
-    image: minio/minio
+    image: ghcr.io/mhga24/minio/minio
     container_name: minio
     entrypoint: sh
     command: -c 'mkdir -p /data/hedera-streams && minio server /data --console-address ":9001"'
@@ -288,6 +288,8 @@ services:
     environment:
       DOCKER_LOCAL_MIRROR_NODE_MENU_NAME: ${DOCKER_LOCAL_MIRROR_NODE_MENU_NAME}
       DOCKER_LOCAL_MIRROR_NODE_URL: ${DOCKER_LOCAL_MIRROR_NODE_URL}
+    networks:
+      - mirror-node
 
   web3:
     image: "${MIRROR_IMAGE_PREFIX}hedera-mirror-web3:${MIRROR_WEB3_IMAGE_TAG:-${MIRROR_IMAGE_TAG}}"
@@ -486,7 +488,7 @@ services:
         ipv4_address: 172.27.0.5
 
   cache:
-    image: redis:6-alpine
+    image: ghcr.io/mhga24/redis:6-alpine
     container_name: relay-cache
     mem_limit: "${RELAY_MEM_LIMIT}"
     memswap_limit: "${RELAY_MEM_LIMIT}"
@@ -501,7 +503,7 @@ services:
 
 networks:
   network-node-bridge:
-    name: network-node-bridge
+    name: hedera-network-node
     driver: bridge
     ipam:
       driver: default
@@ -510,10 +512,10 @@ networks:
           ip_range: 172.27.0.0/24
           gateway: 172.27.0.254
   mirror-node:
-    name: mirror-node
+    name: hedera-mirror-node
     driver: bridge
   cloud-storage:
-    name: cloud-storage
+    name: hedera-cloud-storage
     driver: bridge
 
 volumes:
diff --git a/package-lock.json b/package-lock.json
index 6d65ca6..4954c9c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "@hashgraph/hedera-local",
-  "version": "2.27.1",
+  "version": "2.28.1",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "@hashgraph/hedera-local",
-      "version": "2.27.1",
+      "version": "2.28.1",
       "license": "Apache-2.0",
       "dependencies": {
         "@hashgraph/sdk": "^2.48.1",
@@ -16,10 +16,10 @@
         "detect-port": "^1.6.1",
         "dockerode": "^4.0.2",
         "dotenv": "^16.4.5",
-        "ethers": "^6.13.1",
+        "ethers": "^6.13.2",
         "js-yaml": "^4.1.0",
-        "rimraf": "^6.0.0",
-        "semver": "^7.6.2",
+        "rimraf": "^6.0.1",
+        "semver": "^7.6.3",
         "shelljs": "^0.8.5",
         "ts-mocha": "^10.0.0",
         "yargs": "^17.7.2"
@@ -52,12 +52,12 @@
         "eslint-config-prettier": "^9.1.0",
         "eslint-plugin-prettier": "^5.1.3",
         "husky": "^9.0.11",
-        "mocha": "^10.6.0",
+        "mocha": "^10.7.0",
         "nyc": "^17.0.0",
         "prettier": "^3.3.2",
         "semantic-release": "^24.0.0",
         "sinon": "^18.0.0",
-        "typescript": "^5.5.3"
+        "typescript": "^5.5.4"
       }
     },
     "node_modules/@aashutoshrathi/word-wrap": {
@@ -5314,9 +5314,9 @@
       }
     },
     "node_modules/ethers": {
-      "version": "6.13.1",
-      "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.1.tgz",
-      "integrity": "sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A==",
+      "version": "6.13.2",
+      "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.2.tgz",
+      "integrity": "sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==",
       "funding": [
         {
           "type": "individual",
@@ -7831,9 +7831,9 @@
       "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
     },
     "node_modules/mocha": {
-      "version": "10.6.0",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.6.0.tgz",
-      "integrity": "sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==",
+      "version": "10.7.0",
+      "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.0.tgz",
+      "integrity": "sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA==",
       "dependencies": {
         "ansi-colors": "^4.1.3",
         "browser-stdout": "^1.3.1",
@@ -11647,9 +11647,9 @@
       }
     },
     "node_modules/prettier": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz",
-      "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==",
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
+      "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
       "dev": true,
       "bin": {
         "prettier": "bin/prettier.cjs"
@@ -12155,11 +12155,12 @@
       "integrity": "sha512-MjOWxM065+WswwnmNONOT+bD1nXzY9Km6u3kzvnx8F8/HXGZdz3T6e6vZJ8Q/RIMUSp/nxqjH3GwvJDy8ijeQQ=="
     },
     "node_modules/rimraf": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.0.tgz",
-      "integrity": "sha512-u+yqhM92LW+89cxUQK0SRyvXYQmyuKHx0jkx4W7KfwLGLqJnQM5031Uv1trE4gB9XEXBM/s6MxKlfW95IidqaA==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz",
+      "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==",
       "dependencies": {
-        "glob": "^11.0.0"
+        "glob": "^11.0.0",
+        "package-json-from-dist": "^1.0.0"
       },
       "bin": {
         "rimraf": "dist/esm/bin.mjs"
@@ -12669,9 +12670,9 @@
       }
     },
     "node_modules/semver": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
-      "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+      "version": "7.6.3",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
       "bin": {
         "semver": "bin/semver.js"
       },
@@ -13868,9 +13869,9 @@
       }
     },
     "node_modules/typescript": {
-      "version": "5.5.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz",
-      "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==",
+      "version": "5.5.4",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
+      "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
       "dev": true,
       "bin": {
         "tsc": "bin/tsc",
diff --git a/package.json b/package.json
index bd68d4e..9543b72 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@hashgraph/hedera-local",
-  "version": "2.27.1",
+  "version": "2.28.1",
   "description": "Developer tooling for running Local Hedera Network (Consensus + Mirror Nodes).",
   "main": "index.ts",
   "scripts": {
@@ -56,12 +56,12 @@
     "eslint-config-prettier": "^9.1.0",
     "eslint-plugin-prettier": "^5.1.3",
     "husky": "^9.0.11",
-    "mocha": "^10.6.0",
+    "mocha": "^10.7.0",
     "nyc": "^17.0.0",
     "prettier": "^3.3.2",
     "semantic-release": "^24.0.0",
     "sinon": "^18.0.0",
-    "typescript": "^5.5.3"
+    "typescript": "^5.5.4"
   },
   "dependencies": {
     "@hashgraph/sdk": "^2.48.1",
@@ -71,10 +71,10 @@
     "detect-port": "^1.6.1",
     "dockerode": "^4.0.2",
     "dotenv": "^16.4.5",
-    "ethers": "^6.13.1",
+    "ethers": "^6.13.2",
     "js-yaml": "^4.1.0",
-    "rimraf": "^6.0.0",
-    "semver": "^7.6.2",
+    "rimraf": "^6.0.1",
+    "semver": "^7.6.3",
     "shelljs": "^0.8.5",
     "ts-mocha": "^10.0.0",
     "yargs": "^17.7.2"
diff --git a/src/configuration/local.json b/src/configuration/local.json
index 5099056..358e8f5 100644
--- a/src/configuration/local.json
+++ b/src/configuration/local.json
@@ -1,9 +1,9 @@
 {
   "imageTagConfiguration": [
-    {"key": "NETWORK_NODE_IMAGE_TAG", "value": "0.52.0-alpha.5"},
-    {"key": "HAVEGED_IMAGE_TAG", "value": "0.52.0-alpha.5"},
-    {"key": "MIRROR_IMAGE_TAG", "value": "0.108.0"},
-    {"key": "RELAY_IMAGE_TAG", "value": "0.51.1"},
+    {"key": "NETWORK_NODE_IMAGE_TAG", "value": "0.52.0"},
+    {"key": "HAVEGED_IMAGE_TAG", "value": "0.52.0-alpha.6"},
+    {"key": "MIRROR_IMAGE_TAG", "value": "0.110.0-rc2"},
+    {"key": "RELAY_IMAGE_TAG", "value": "0.52.1"},
     {"key": "MIRROR_NODE_EXPLORER_IMAGE_TAG", "value": "24.4.0"}
   ],
   "envConfiguration": [
diff --git a/src/constants.ts b/src/constants.ts
index 172a617..5d29eff 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -36,6 +36,8 @@ export const CONTAINERS = [
     },
 ];
 
+export const NETWORK_PREFIX = 'hedera-';
+
 export const CONSENSUS_NODE_LABEL = "network-node";
 export const MIRROR_NODE_LABEL = "mirror-node-rest";
 export const RELAY_LABEL = "json-rpc-relay";
diff --git a/src/services/ConnectionService.ts b/src/services/ConnectionService.ts
index 051fa50..fac7ea6 100644
--- a/src/services/ConnectionService.ts
+++ b/src/services/ConnectionService.ts
@@ -24,6 +24,7 @@ import { LoggerService } from './LoggerService';
 import { ServiceLocator } from './ServiceLocator';
 import { CLIService } from './CLIService';
 import { Errors } from '../Errors/LocalNodeErrors';
+import debounce from '../utils/debounce';
 
 /**
  * ConnectionService is a service class that handles network connections.
@@ -52,6 +53,9 @@ export class ConnectionService implements IService{
      */
     private cliService: CLIService;
 
+    // Debounced function to print error message at most once every N seconds
+    private readonly debouncedErrorLog;
+
     /**
      * Constructs a new instance of the ConnectionService.
      * Initializes the logger and CLI service, and logs the initialization of the connection service.
@@ -61,6 +65,11 @@ export class ConnectionService implements IService{
         this.logger = ServiceLocator.Current.get<LoggerService>(LoggerService.name);
         this.cliService = ServiceLocator.Current.get<CLIService>(CLIService.name);
         this.logger.trace('Connection Service Initialized!', this.serviceName);
+
+        this.debouncedErrorLog = debounce((message: string) => {
+            this.logger.info(message, this.serviceName);
+        }, 5000);
+
     }
 
     /**
@@ -72,7 +81,7 @@ export class ConnectionService implements IService{
      * @returns {Promise<void>} A promise that resolves when the port is ready for connection.
      * @public
      */
-    public async waitForFiringUp(port: number): Promise<void> {
+    public async waitForFiringUp(port: number, serviceName: string): Promise<void> {
         const { host } = this.cliService.getCurrentArgv();
         let isReady = false;
         // this means that we wait around 100 seconds, normal consensus node startup takes around 60 seconds
@@ -83,12 +92,13 @@ export class ConnectionService implements IService{
             .on('data', () => {
               isReady = true;
             })
-            .on('error', (err) => {
-              this.logger.trace(
-                `Waiting for the containers at ${host}:${port}, retrying in 0.1 seconds...`,
-                this.serviceName
-              );
-              this.logger.error(err.message, this.serviceName);
+            .on('error', (err: any) => {
+              if (err.code === 'ECONNREFUSED') {
+                  this.debouncedErrorLog(`${serviceName} not yet available at: ${host}:${port}. Retrying...`);
+              }
+              else {
+                  this.logger.error(err.message, this.serviceName);
+              }
             });
 
             retries--;
diff --git a/src/services/DockerService.ts b/src/services/DockerService.ts
index 5fb1b6b..00aa00f 100644
--- a/src/services/DockerService.ts
+++ b/src/services/DockerService.ts
@@ -35,6 +35,7 @@ import detectPort from 'detect-port';
 import * as dotenv from 'dotenv';
 import { CLIOptions } from '../types/CLIOptions';
 import path from 'path';
+import { SafeDockerNetworkRemover } from '../utils/SafeDockerNetworkRemover';
 
 dotenv.config();
 
@@ -90,7 +91,7 @@ export class DockerService implements IService{
 
     /**
      * Returns the null output path depending on the operating system.
-     * 
+     *
      * @public
      * @returns {string} - The null output path.
      */
@@ -250,7 +251,23 @@ export class DockerService implements IService{
       const recommendedMemory = isMultiNodeMode ? MIN_MEMORY_MULTI_MODE : MIN_MEMORY_SINGLE_MODE;
       this.logger.error(`Your docker memory resources are set to ${dockerMemory.toFixed(2)}GB. This is not enough, set to at least ${recommendedMemory}GB`, this.serviceName);
     }
-    
+
+    private logShellOutput(shellExec: any) {
+        [shellExec.stdout, shellExec.stderr].forEach( (output: string) => {
+            output.split("\n").map((line: string) => {
+                if (line === "") return;
+                this.logger.debug(line, this.serviceName);
+            });
+        });
+    }
+
+    private async executeExternal(command: string, options = {}): Promise<shell.ShellString> {
+        this.logger.trace(`🚀 Executing command: ${command}`, this.serviceName);
+        const shellExec = shell.exec(command, options);
+        this.logShellOutput(shellExec);
+        return shellExec;
+    }
+
     /**
      * Returns a Docker container object for the given container label.
      * 
@@ -351,9 +368,7 @@ export class DockerService implements IService{
           composeFiles.push(...this.getUserComposeFiles(userComposeDir));
       }
 
-      return shell.exec(
-          `docker compose -f ${composeFiles.join(' -f ')} up -d 2>${this.getNullOutput()}`
-      );
+      return this.executeExternal(`docker compose -f ${composeFiles.join(' -f ')} up -d`, {silent: true});
     }
 
     /**
@@ -387,11 +402,11 @@ export class DockerService implements IService{
     public async tryDockerRecovery(stateName: string): Promise<void> {
         const nullOutput = this.getNullOutput();
         this.logger.trace('Stopping the docker containers...', stateName);
-        shell.exec(`docker compose kill --remove-orphans 2>${nullOutput}`);
-        shell.exec(`docker compose down -v --remove-orphans 2>${nullOutput}`);
+        this.executeExternal(`docker compose kill --remove-orphans`, {silent: true});
+        this.executeExternal(`docker compose down -v --remove-orphans`, {silent: true});
         this.logger.trace('Cleaning the volumes and temp files...', stateName);
         shell.exec(`rm -rf network-logs/* >${nullOutput} 2>&1`);
-        shell.exec(`docker network prune -f 2>${nullOutput}`);
+        SafeDockerNetworkRemover.removeAll();
         this.logger.info(`${LOADING} Trying to startup again...`, stateName);
     }
 }
diff --git a/src/state/StartState.ts b/src/state/StartState.ts
index c818822..e7d4729 100644
--- a/src/state/StartState.ts
+++ b/src/state/StartState.ts
@@ -110,8 +110,8 @@ export class StartState implements IState{
         this.logger.info(START_STATE_STARTED_DETECTING, this.stateName);
 
         try {
-            await this.connectionService.waitForFiringUp(5600);
-            await this.connectionService.waitForFiringUp(50211);
+            await this.connectionService.waitForFiringUp(5600, 'Mirror Node GRPC');
+            await this.connectionService.waitForFiringUp(50211, 'Network Node');
         } catch (e: any) {
             if (e instanceof LocalNodeErrors) {
                 this.logger.error(e.message, this.stateName);
diff --git a/src/state/StopState.ts b/src/state/StopState.ts
index 8454032..16f2a1d 100644
--- a/src/state/StopState.ts
+++ b/src/state/StopState.ts
@@ -36,6 +36,7 @@ import {
 } from '../constants';
 import { CLIOptions } from '../types/CLIOptions';
 import { CLIService } from '../services/CLIService';
+import { SafeDockerNetworkRemover } from '../utils/SafeDockerNetworkRemover';
 
 export class StopState implements IState {
     /**
@@ -101,7 +102,7 @@ export class StopState implements IState {
         shell.exec(`rm -rf network-logs/* >${nullOutput} 2>&1`);
         this.logger.trace(`Working dir is ${this.cliOptions.workDir}`, this.stateName);
         shell.exec(`rm -rf "${join(this.cliOptions.workDir, 'network-logs')}" >${nullOutput} 2>&1`);
-        shell.exec(`docker network prune -f 2>${nullOutput}`);
+        SafeDockerNetworkRemover.removeAll();
         shell.cd(rootPath);
         this.logger.info(STOP_STATE_STOPPED_MESSAGE, this.stateName);
         this.observer?.update(EventType.Finish);
diff --git a/src/utils/SafeDockerNetworkRemover.ts b/src/utils/SafeDockerNetworkRemover.ts
new file mode 100644
index 0000000..a8ed181
--- /dev/null
+++ b/src/utils/SafeDockerNetworkRemover.ts
@@ -0,0 +1,57 @@
+/*-
+ *
+ * Hedera Local Node
+ *
+ * Copyright (C) 2024 Hedera Hashgraph, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import shell from 'shelljs';
+import { IS_WINDOWS, NETWORK_PREFIX } from '../constants';
+
+/**
+ * Checks if the given string is a valid Docker network ID.
+ * A valid Docker network ID is a 12-character hexadecimal string.
+ *
+ * @param {string} id - The string to be validated as a Docker network ID.
+ * @returns {boolean} - Returns true if the string is a valid Docker network ID, false otherwise.
+ *
+ * @example
+ * const id = "89ded1eca1d5";
+ * console.log(isCorrectDockerId(id)); // Output: true
+ *
+ * @example
+ * const invalidId = "invalidID123";
+ * console.log(isCorrectDockerId(invalidId)); // Output: false
+ */
+const isCorrectDockerId = (id: string) => id.trim() !== '' && /^[a-f0-9]{12}$/.test(id);
+
+/**
+ * Provides utility methods for safe networks removal.
+ */
+export class SafeDockerNetworkRemover {
+  /**
+   * Removes all the networks started by docker compose. Only networks with the "hedera-" prefix will be affected.
+   */
+  public static removeAll() {
+    const result = shell.exec(`docker network ls --filter name=${NETWORK_PREFIX} --format "{{.ID}}"`);
+    if (!result || result.stderr !== '') {
+      return;
+    }
+    result.stdout.split('\n').filter(isCorrectDockerId).forEach((id) => {
+      shell.exec(`docker network rm ${id} -f 2>${IS_WINDOWS ? 'null' : '/dev/null'}`);
+    });
+  }
+}
diff --git a/src/utils/debounce.ts b/src/utils/debounce.ts
new file mode 100644
index 0000000..a976fc3
--- /dev/null
+++ b/src/utils/debounce.ts
@@ -0,0 +1,37 @@
+/*-
+ *
+ * Hedera Local Node
+ *
+ * Copyright (C) 2023-2024 Hedera Hashgraph, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+/**
+ * Limit the execution of a function to once every N ms
+ */
+const debounce = <F extends (...args: any[]) => void>(func: F, delay: number) => {
+    let timerActive = false;
+    return (...args: any) => {
+        if (!timerActive) {
+            timerActive = true;
+            func(...args);
+            setTimeout(() => {
+                timerActive = false;
+            }, delay);
+        }
+    };
+};
+
+export default debounce;
\ No newline at end of file


Test patch:
diff --git a/test/cypress/package-lock.json b/test/cypress/package-lock.json
index d3f3809..30e6bf4 100644
--- a/test/cypress/package-lock.json
+++ b/test/cypress/package-lock.json
@@ -10,11 +10,11 @@
       "license": "ISC",
       "devDependencies": {
         "@hashgraph/sdk": "^2.48.1",
-        "cypress": "^13.13.0",
+        "cypress": "^13.13.1",
         "cypress-wait-until": "^3.0.1",
         "html-webpack-plugin": "^5.6.0",
         "http-server": "^14.1.1",
-        "webpack": "^5.92.1",
+        "webpack": "^5.93.0",
         "webpack-cli": "^5.1.4"
       }
     },
@@ -1761,9 +1761,9 @@
       }
     },
     "node_modules/cypress": {
-      "version": "13.13.0",
-      "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.0.tgz",
-      "integrity": "sha512-ou/MQUDq4tcDJI2FsPaod2FZpex4kpIK43JJlcBgWrX8WX7R/05ZxGTuxedOuZBfxjZxja+fbijZGyxiLP6CFA==",
+      "version": "13.13.1",
+      "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.1.tgz",
+      "integrity": "sha512-8F9UjL5MDUdgC/S5hr8CGLHbS5gGht5UOV184qc2pFny43fnkoaKxlzH/U6//zmGu/xRTaKimNfjknLT8+UDFg==",
       "dev": true,
       "hasInstallScript": true,
       "dependencies": {
@@ -4596,9 +4596,9 @@
       }
     },
     "node_modules/webpack": {
-      "version": "5.92.1",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz",
-      "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==",
+      "version": "5.93.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz",
+      "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==",
       "dev": true,
       "dependencies": {
         "@types/eslint-scope": "^3.7.3",
@@ -6092,9 +6092,9 @@
       "dev": true
     },
     "cypress": {
-      "version": "13.13.0",
-      "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.0.tgz",
-      "integrity": "sha512-ou/MQUDq4tcDJI2FsPaod2FZpex4kpIK43JJlcBgWrX8WX7R/05ZxGTuxedOuZBfxjZxja+fbijZGyxiLP6CFA==",
+      "version": "13.13.1",
+      "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.13.1.tgz",
+      "integrity": "sha512-8F9UjL5MDUdgC/S5hr8CGLHbS5gGht5UOV184qc2pFny43fnkoaKxlzH/U6//zmGu/xRTaKimNfjknLT8+UDFg==",
       "dev": true,
       "requires": {
         "@cypress/request": "^3.0.0",
@@ -8252,9 +8252,9 @@
       }
     },
     "webpack": {
-      "version": "5.92.1",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz",
-      "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==",
+      "version": "5.93.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz",
+      "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==",
       "dev": true,
       "requires": {
         "@types/eslint-scope": "^3.7.3",
diff --git a/test/cypress/package.json b/test/cypress/package.json
index 1448a78..b712cad 100644
--- a/test/cypress/package.json
+++ b/test/cypress/package.json
@@ -12,11 +12,11 @@
   "license": "ISC",
   "devDependencies": {
     "@hashgraph/sdk": "^2.48.1",
-    "cypress": "^13.13.0",
+    "cypress": "^13.13.1",
     "cypress-wait-until": "^3.0.1",
     "html-webpack-plugin": "^5.6.0",
     "http-server": "^14.1.1",
-    "webpack": "^5.92.1",
+    "webpack": "^5.93.0",
     "webpack-cli": "^5.1.4"
   }
 }
diff --git a/test/smoke/package-lock.json b/test/smoke/package-lock.json
index 837a425..f0d1d91 100644
--- a/test/smoke/package-lock.json
+++ b/test/smoke/package-lock.json
@@ -7,7 +7,7 @@
       "name": "hardhat-project",
       "devDependencies": {
         "@nomicfoundation/hardhat-toolbox": "^5.0.0",
-        "hardhat": "^2.22.6"
+        "hardhat": "^2.22.7"
       }
     },
     "node_modules/@adraffy/ens-normalize": {
@@ -999,81 +999,81 @@
       }
     },
     "node_modules/@nomicfoundation/edr": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.4.1.tgz",
-      "integrity": "sha512-NgrMo2rI9r28uidumvd+K2/AJLdxtXsUlJr3hj/pM6S1FCd/HiWaLeLa/cjCVPcE2u1rYAa3W6UFxLCB7S5Dhw==",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.5.0.tgz",
+      "integrity": "sha512-nAUyjGhxntXje/1AkDX9POfH+pqUxdi4XHzIhaf/dJYs7fgAFxL3STBK1OYcA3LR7vtiylLHMz7wxjqLzlLGKg==",
       "dev": true,
       "dependencies": {
-        "@nomicfoundation/edr-darwin-arm64": "0.4.1",
-        "@nomicfoundation/edr-darwin-x64": "0.4.1",
-        "@nomicfoundation/edr-linux-arm64-gnu": "0.4.1",
-        "@nomicfoundation/edr-linux-arm64-musl": "0.4.1",
-        "@nomicfoundation/edr-linux-x64-gnu": "0.4.1",
-        "@nomicfoundation/edr-linux-x64-musl": "0.4.1",
-        "@nomicfoundation/edr-win32-x64-msvc": "0.4.1"
+        "@nomicfoundation/edr-darwin-arm64": "0.5.0",
+        "@nomicfoundation/edr-darwin-x64": "0.5.0",
+        "@nomicfoundation/edr-linux-arm64-gnu": "0.5.0",
+        "@nomicfoundation/edr-linux-arm64-musl": "0.5.0",
+        "@nomicfoundation/edr-linux-x64-gnu": "0.5.0",
+        "@nomicfoundation/edr-linux-x64-musl": "0.5.0",
+        "@nomicfoundation/edr-win32-x64-msvc": "0.5.0"
       },
       "engines": {
         "node": ">= 18"
       }
     },
     "node_modules/@nomicfoundation/edr-darwin-arm64": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.4.1.tgz",
-      "integrity": "sha512-XuiUUnWAVNw7JYv7nRqDWfpBm21HOxCRBQ8lQnRnmiets9Ss2X5Ul9mvBheIPh/D0wBzwJ8TRtsSrorpwE79cA==",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.5.0.tgz",
+      "integrity": "sha512-G6OX/PESdfU4ZOyJ4MDh4eevW0wt2mduuxA+thXtTcStOiQTtPuV205h4kLOR5wRB1Zz6Zy0LedTMax7TzOtGw==",
       "dev": true,
       "engines": {
         "node": ">= 18"
       }
     },
     "node_modules/@nomicfoundation/edr-darwin-x64": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.4.1.tgz",
-      "integrity": "sha512-N1MfJqEX5ixaXlyyrHnaYxzwIT27Nc/jUgLI7ts4/9kRvPTvyZRYmXS1ciKhmUFr/WvFckTCix2RJbZoGGtX7g==",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.5.0.tgz",
+      "integrity": "sha512-fI7uHfHqPtdPZjkFUTpotc/F5gGv41ws+jSZy9+2AR9RDMOAIXMEArOx9rGLBcevWu8SFnyH/l/77kG/5FXbDw==",
       "dev": true,
       "engines": {
         "node": ">= 18"
       }
     },
     "node_modules/@nomicfoundation/edr-linux-arm64-gnu": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.4.1.tgz",
-      "integrity": "sha512-bSPOfmcFjJwDgWOV5kgZHeqg2OWu1cINrHSGjig0aVHehjcoX4Sgayrj6fyAxcOV5NQKA6WcyTFll6NrCxzWRA==",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.5.0.tgz",
+      "integrity": "sha512-eMC3sWPkBZILg2/YB4Xv6IR0nggCLt5hS8K8jjHeGEeUs9pf8poBF2Oy+G4lSu0YLLjexGzHypz9/P+pIuxZHw==",
       "dev": true,
       "engines": {
         "node": ">= 18"
       }
     },
     "node_modules/@nomicfoundation/edr-linux-arm64-musl": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.4.1.tgz",
-      "integrity": "sha512-F/+DgOdeBFQDrk+SX4aFffJFBgJfd75ZtE2mjcWNAh/qWiS7NfUxdQX/5OvNo/H6EY4a+3bZH6Bgzqg4mEWvMw==",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.5.0.tgz",
+      "integrity": "sha512-yPK0tKjYRxe5ktggFr8aBHH0DCI9uafuaD8QuzyrQAfSf/m/ebTdgthROdbYp6eRk5mJyfAQT/45fM3tnlYsWw==",
       "dev": true,
       "engines": {
         "node": ">= 18"
       }
     },
     "node_modules/@nomicfoundation/edr-linux-x64-gnu": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.4.1.tgz",
-      "integrity": "sha512-POHhTWczIXCPhzKtY0Vt/l+VCqqCx5gNR5ErwSrNnLz/arfQobZFAU+nc61BX3Jch82TW8b3AbfGI73Kh7gO0w==",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.5.0.tgz",
+      "integrity": "sha512-Hds8CRYi4DEyuErjcwUNSvNpMzmOYUihW4qYCoKgSBUVS5saX1PyPYvFYuYpeU5J8/T2iMk6yAPVLCxtKbgnKg==",
       "dev": true,
       "engines": {
         "node": ">= 18"
       }
     },
     "node_modules/@nomicfoundation/edr-linux-x64-musl": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.4.1.tgz",
-      "integrity": "sha512-uu8oNp4Ozg3H1x1We0FF+rwXfFiAvsOm5GQ+OBx9YYOXnfDPWqguQfGIkhrti9GD0iYhfQ/WOG5wvp0IzzgGSg==",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.5.0.tgz",
+      "integrity": "sha512-1hXMDSzdyh5ojwO3ZSRbt7t5KKYycGUlFdC3lgJRZ7gStB8xjb7RA3hZn2csn9OydS950Ne4nh+puNq91iXApw==",
       "dev": true,
       "engines": {
         "node": ">= 18"
       }
     },
     "node_modules/@nomicfoundation/edr-win32-x64-msvc": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.4.1.tgz",
-      "integrity": "sha512-PaZHFw455z89ZiKYNTnKu+/TiVZVRI+mRJsbRTe2N0VlYfUBS1o2gdXBM12oP1t198HR7xQwEPPAslTFxGBqHA==",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.5.0.tgz",
+      "integrity": "sha512-CFagD423400xXkRmACIR13FoocN48qi4ogRnuFQIvBDtEE3aMEajfFj4bycmQQDqnqChsZy/jwD4OxbX6oaNJw==",
       "dev": true,
       "engines": {
         "node": ">= 18"
@@ -3977,14 +3977,14 @@
       }
     },
     "node_modules/hardhat": {
-      "version": "2.22.6",
-      "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.6.tgz",
-      "integrity": "sha512-abFEnd9QACwEtSvZZGSmzvw7N3zhQN1cDKz5SLHAupfG24qTHofCjqvD5kT5Wwsq5XOL0ON1Mq5rr4v0XX5ciw==",
+      "version": "2.22.7",
+      "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.7.tgz",
+      "integrity": "sha512-nrXQAl+qUr75TsCLDo8P41YXLc+5U7qQMMCIrbbmy1/uQaVPncdjDrD5BR0CENvHRj7EBqO+JkofpozXoIfJKg==",
       "dev": true,
       "dependencies": {
         "@ethersproject/abi": "^5.1.2",
         "@metamask/eth-sig-util": "^4.0.0",
-        "@nomicfoundation/edr": "^0.4.1",
+        "@nomicfoundation/edr": "^0.5.0",
         "@nomicfoundation/ethereumjs-common": "4.0.4",
         "@nomicfoundation/ethereumjs-tx": "5.0.4",
         "@nomicfoundation/ethereumjs-util": "9.0.4",
diff --git a/test/smoke/package.json b/test/smoke/package.json
index 21b910d..03aa1ef 100644
--- a/test/smoke/package.json
+++ b/test/smoke/package.json
@@ -5,6 +5,6 @@
   },
   "devDependencies": {
     "@nomicfoundation/hardhat-toolbox": "^5.0.0",
-    "hardhat": "^2.22.6"
+    "hardhat": "^2.22.7"
   }
 }
diff --git a/test/unit/states/InitState.spec.ts b/test/unit/states/InitState.spec.ts
index 73aa056..a3da907 100644
--- a/test/unit/states/InitState.spec.ts
+++ b/test/unit/states/InitState.spec.ts
@@ -21,6 +21,7 @@
 import { expect } from 'chai';
 import fs from 'fs';
 import yaml from 'js-yaml';
+import { after } from "mocha";
 import { join } from 'path';
 import { SinonSandbox, SinonSpy, SinonStub, SinonStubbedInstance } from 'sinon';
 import {
@@ -249,6 +250,11 @@ describe('InitState tests', () => {
             onStartStub.restore()
         })
 
+        after(() => {
+            fsReadFileSync.restore()
+            ymlLoad.restore()
+        })
+
         it('should execute "prepareWorkDirectory" as expected', async () => {
             prepareWorkDirectoryStub.restore()
 
diff --git a/test/unit/states/StopState.spec.ts b/test/unit/states/StopState.spec.ts
index bed9bab..cd60010 100644
--- a/test/unit/states/StopState.spec.ts
+++ b/test/unit/states/StopState.spec.ts
@@ -24,6 +24,7 @@ import { StopState } from '../../../src/state/StopState';
 import {
   DOCKER_CLEANING_VALUMES_MESSAGE,
   DOCKER_STOPPING_CONTAINERS_MESSAGE,
+  NETWORK_PREFIX,
   STOP_STATE_INIT_MESSAGE,
   STOP_STATE_ON_START_MESSAGE,
   STOP_STATE_STOPPED_MESSAGE,
@@ -79,6 +80,11 @@ describe('StopState tests', () => {
 
     it('should execute onStart properly', async () => {
         const { shellCDStub, shellExecStub }= shellTest;
+        const network = { name: 'hedera-cloud-storage', id: '89ded1eca1d5' };
+        shellExecStub
+          .withArgs(`docker network ls --filter name=${NETWORK_PREFIX} --format "{{.ID}}"`)
+          .returns({ stderr: '', stdout: network.id });
+
         await stopState.onStart();
 
         // loggin messages
@@ -100,7 +106,7 @@ describe('StopState tests', () => {
         testSandbox.assert.calledWith(shellExecStub, 'docker compose down -v --remove-orphans 2>/dev/null');
         testSandbox.assert.calledWith(shellExecStub, 'rm -rf network-logs/* >/dev/null 2>&1');
         testSandbox.assert.calledWith(shellExecStub, 'rm -rf "testDir/network-logs" >/dev/null 2>&1');
-        testSandbox.assert.calledWith(shellExecStub, 'docker network prune -f 2>/dev/null');
+        testSandbox.assert.calledWith(shellExecStub, `docker network ls --filter name=${NETWORK_PREFIX} --format "{{.ID}}"`);
 
         expect(processTest.processCWDStub.calledOnce).to.be.true;
     })
diff --git a/test/unit/utils/SafeDockerNetworkRemover.spec.ts b/test/unit/utils/SafeDockerNetworkRemover.spec.ts
new file mode 100644
index 0000000..94393ce
--- /dev/null
+++ b/test/unit/utils/SafeDockerNetworkRemover.spec.ts
@@ -0,0 +1,109 @@
+/*-
+ *
+ * Hedera Local Node
+ *
+ * Copyright (C) 2024 Hedera Hashgraph, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { expect } from 'chai';
+import sinon from 'sinon';
+import { SafeDockerNetworkRemover } from '../../../src/utils/SafeDockerNetworkRemover';
+import { IS_WINDOWS, NETWORK_PREFIX } from '../../../src/constants';
+import { getTestBed } from '../testBed';
+import { load } from 'js-yaml';
+import { readdirSync, readFileSync } from 'fs';
+import { join } from "path";
+
+describe('SafeDockerNetworkRemover', () => {
+  let shellExecStub: sinon.SinonStub;
+
+  before(() => {
+    let {
+      shellStubs
+    } = getTestBed({
+      workDir: 'testDir',
+    });
+
+    shellExecStub = shellStubs.shellExecStub;
+  });
+
+  after(() => {
+    shellExecStub.restore();
+  });
+
+  describe('removeByName', () => {
+    it('should not proceed if docker network ls command fails', () => {
+      shellExecStub.withArgs(`docker network ls --filter name=${NETWORK_PREFIX} --format "{{.ID}}"`).returns({ stderr: 'error' });
+
+      SafeDockerNetworkRemover.removeAll();
+      expect(shellExecStub.calledOnce).to.be.true;
+      expect(shellExecStub.calledWith(`docker network ls --filter name=${NETWORK_PREFIX} --format "{{.ID}}"`)).to.be.true;
+    });
+
+    it('should not proceed if docker network ls command returns no result', () => {
+      shellExecStub.withArgs(`docker network ls --filter name=${NETWORK_PREFIX} --format "{{.ID}}"`).returns({ stdout: '', stderr: '' });
+
+      SafeDockerNetworkRemover.removeAll();
+      expect(shellExecStub.calledWith(`docker network ls --filter name=${NETWORK_PREFIX} --format "{{.ID}}"`)).to.be.true;
+    });
+
+    it('should remove valid Docker network IDs', () => {
+      shellExecStub.withArgs(`docker network ls --filter name=${NETWORK_PREFIX} --format "{{.ID}}"`).returns({ stdout: '89ded1eca1d5\ninvalidID123\n', stderr: '' });
+      shellExecStub.withArgs(`docker network rm 89ded1eca1d5 -f 2>${IS_WINDOWS ? 'null' : '/dev/null'}`).returns({});
+
+      SafeDockerNetworkRemover.removeAll();
+      expect(shellExecStub.calledWith(`docker network rm 89ded1eca1d5 -f 2>${IS_WINDOWS ? 'null' : '/dev/null'}`)).to.be.true;
+    });
+
+    it('should not remove invalid Docker network IDs', () => {
+      shellExecStub.withArgs(`docker network ls --filter name=${NETWORK_PREFIX} --format "{{.ID}}"`).returns({ stdout: 'invalidID123\nanotherInvalid\n', stderr: '' });
+
+      SafeDockerNetworkRemover.removeAll();
+      expect(shellExecStub.calledWith(`docker network rm invalidID123 -f 2>${IS_WINDOWS ? 'null' : '/dev/null'}`)).to.be.false;
+      expect(shellExecStub.calledWith(`docker network rm anotherInvalid -f 2>${IS_WINDOWS ? 'null' : '/dev/null'}`)).to.be.false;
+    });
+  });
+
+  describe('config check', () => {
+    it('check if all of the networks from composer yaml files are listed in the NETWORK_NAMES const', () => {
+      const relativePath = '../../..';
+      const files = readdirSync(join(__dirname, relativePath)).filter(name => /^docker-compose.*\.yml$/.test(name));
+      for (const file of files) {
+        const data = readFileSync(join(__dirname, `${relativePath}/${file}`));
+        const config = load(data.toString());
+        for (const network of Object.values(config.networks || {}).map((network: any) => network.name.trim())) {
+          expect(network.startsWith(NETWORK_PREFIX), `Network '${network}' does not start with the prefix '${NETWORK_PREFIX}'. It won't be removed by 'npm run stop'`).to.be.true;
+        }
+      }
+    });
+    it('check if all services have a network set and all network names start with "hedera-"', () => {
+      const relativePath = '../../..';
+      const files = readdirSync(join(__dirname, relativePath)).filter(name => /^docker-compose(?!.*(evm|multinode)\.yml$).*\.yml$/.test(name));
+      for (const file of files) {
+        const data = readFileSync(join(__dirname, `${relativePath}/${file}`));
+        const config = load(data.toString());
+        const services = config.services || {};
+        for (const [serviceName, serviceConfig] of Object.entries(services)) {
+          if (serviceConfig.extends || (serviceConfig.network_mode || '' === 'none')) {
+            continue; // The child service might have inherited the network. There is no network in non-network mode.
+          }
+          const networks = serviceConfig.networks;
+          expect(networks, `Service '${serviceName}' does not have a network set.`).to.exist;
+        }
+      }
+    });
+  });
+});