Repository: skalenetwork/IMA (language: python)

Issue:
Add deploy test
- add deploy test
- update ganache
- remove drastically dirty estimateGas fix
- improve pip and yarn caching


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 159f0aa8b..76548c7d8 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -10,82 +10,65 @@ on:
     branches-ignore:
       - 'docs-v*'
 
+env:
+  NODE_VERSION: 18
+  PYTHON_VERSION: 3.8
+
 # A workflow run is made up of one or more jobs that can run sequentially or in parallel
 jobs:
   test-contracts:
     runs-on: ubuntu-latest
 
-    env:
-      working-directory: ./proxy
+    defaults:
+      run:
+        working-directory: proxy
 
     steps:
-    - uses: actions/checkout@v2
+    - uses: actions/checkout@v4
       with:
-          submodules: recursive
-
-    - name: Get yarn cache directory path
-      id: yarn-cache-dir-path
-      run: echo "::set-output name=dir::$(yarn cache dir)"
-
-    - uses: actions/cache@v2
-      id: yarn-cache
-      with:
-        path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
-        key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
-        restore-keys: |
-          ${{ runner.os }}-yarn-
-
-    - uses: actions/cache@v2
-      with:
-        path: ~/.cache/pip
-        key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
-        restore-keys: |
-          ${{ runner.os }}-pip-
+        submodules: true
 
     - name: Install PYTHON
-      uses: actions/setup-python@v2
+      uses: actions/setup-python@v4
       with:
-        python-version: 3.8
+        python-version: ${{ env.PYTHON_VERSION }}
+        cache: 'pip'
 
     - name: Install NODE JS
-      uses: actions/setup-node@v2
+      uses: actions/setup-node@v3
       with:
-        node-version: 18
+        node-version: ${{ env.NODE_VERSION }}
+        cache: 'yarn'
 
     - name: Install project
-      working-directory: ${{env.working-directory}}
       run: |
         yarn install
 
     - name: Install slither
-      working-directory: ${{env.working-directory}}
       run: pip3 install -r scripts/requirements.txt
 
     - name: Lint solidity
-      working-directory: ${{env.working-directory}}
       run: yarn lint
 
     - name: Compile typescript
-      working-directory: ${{env.working-directory}}
       run: yarn tsc
 
     - name: Lint typescript
-      working-directory: ${{env.working-directory}}
       run: yarn eslint
 
     - name: Slither checks
-      working-directory: ${{env.working-directory}}
       run: yarn slither
 
     - name: Gas calculation test
-      working-directory: ${{env.working-directory}}
       run: npx hardhat test gas/calculateGas.ts
 
+    - name: Test deploy
+      run: bash ./scripts/test_deploy.sh
+
     - name: Test upgrade
-      run: bash ./proxy/scripts/test_upgrade.sh
+      run: bash ./scripts/test_upgrade.sh
 
     - name: Run tests
-      working-directory: ${{env.working-directory}}
       run: |
         npx hardhat coverage --solcoverjs .solcover.js
         bash <(curl -s https://codecov.io/bash) -f coverage/lcov.info -t $CODECOV_TOKEN || echo "Codecov did not collect coverage reports"
@@ -98,38 +81,21 @@ jobs:
         working-directory: proxy
 
     steps:
-    - uses: actions/checkout@v2
-      with:
-          submodules: recursive
-
-    - name: Get yarn cache directory path
-      id: yarn-cache-dir-path
-      run: echo "::set-output name=dir::$(yarn cache dir)"
-
-    - uses: actions/cache@v2
-      id: yarn-cache
-      with:
-        path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
-        key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
-        restore-keys: |
-          ${{ runner.os }}-yarn-
-
-    - uses: actions/cache@v2
+    - uses: actions/checkout@v4
       with:
-        path: ~/.cache/pip
-        key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
-        restore-keys: |
-          ${{ runner.os }}-pip-
+        submodules: true
 
     - name: Install PYTHON
-      uses: actions/setup-python@v2
+      uses: actions/setup-python@v4
       with:
-        python-version: 3.8
+        python-version: ${{ env.PYTHON_VERSION }}
+        cache: 'pip'
 
     - name: Install NODE JS
-      uses: actions/setup-node@v2
+      uses: actions/setup-node@v3
       with:
-        node-version: 18
+        node-version: ${{ env.NODE_VERSION }}
+        cache: 'yarn'
 
     - name: Install project
       run: |
diff --git a/proxy/hardhat.config.ts b/proxy/hardhat.config.ts
index 43f4396a2..ebd01cb73 100644
--- a/proxy/hardhat.config.ts
+++ b/proxy/hardhat.config.ts
@@ -63,7 +63,6 @@ const config: HardhatUserConfig = {
     },
     schain: {
       url: getCustomUrl(process.env.URL_W3_S_CHAIN),
-      gas: 12000000,
       accounts: getCustomPrivateKey(process.env.PRIVATE_KEY_FOR_SCHAIN),
     }
   },
diff --git a/proxy/migrations/deploySchain.ts b/proxy/migrations/deploySchain.ts
index e9066244d..ed4863d9e 100644
--- a/proxy/migrations/deploySchain.ts
+++ b/proxy/migrations/deploySchain.ts
@@ -24,7 +24,7 @@
  */
 import { promises as fs } from 'fs';
 import { Interface } from "ethers/lib/utils";
-import { ethers, upgrades, network } from "hardhat";
+import { ethers, upgrades } from "hardhat";
 import hre from "hardhat";
 import { getAbi, getVersion } from '@skalenetwork/upgrade-tools';
 import { Manifest } from "@openzeppelin/upgrades-core";
@@ -181,36 +181,8 @@ async function main() {
     deployed.set( "TokenManagerEth", { address: tokenManagerEth.address, interface: tokenManagerEth.interface } );
     console.log("Contract TokenManagerEth deployed to", tokenManagerEth.address);
 
-    /*
-    In the moment of this code was written
-    ganache had a bug
-    that prevented proper execution
-    of estimateGas function
-    during deployment of smart contract
-    that exceed 24KB limit.
-
-    In addition to this problem
-    upgrade-hardhat library
-    did not supported
-    manual gas limit configuration.
-
-    TODO: in case of any one or both issues fixed
-    please remove this crazy workaround below
-    */
-    if (network.config.gas === "auto") {
-        throw Error("Can't use auto because of problems with gas estimations");
-    }
-    if (!process.env.PRIVATE_KEY_FOR_SCHAIN) {
-        throw Error("PRIVATE_KEY_FOR_SCHAIN is not set");
-    }
-    const key = process.env.PRIVATE_KEY_FOR_SCHAIN;
-    const signerWithFixedGasEstimation = new ethers.Wallet(key, ethers.provider);
-    signerWithFixedGasEstimation.estimateGas = async() => {
-        return ethers.BigNumber.from(network.config.gas as number);
-    }
-
     console.log("Deploy TokenManagerERC20");
-    const tokenManagerERC20Factory = await ethers.getContractFactory("TokenManagerERC20", signerWithFixedGasEstimation);
+    const tokenManagerERC20Factory = await ethers.getContractFactory("TokenManagerERC20");
     const tokenManagerERC20 = await upgrades.deployProxy(tokenManagerERC20Factory, [
         schainName,
         messageProxy.address,
@@ -225,7 +197,7 @@ async function main() {
     // The end of TODO:
 
     console.log("Deploy TokenManagerERC721");
-    const tokenManagerERC721Factory = await ethers.getContractFactory("TokenManagerERC721", signerWithFixedGasEstimation);
+    const tokenManagerERC721Factory = await ethers.getContractFactory("TokenManagerERC721");
     const tokenManagerERC721 = await upgrades.deployProxy(tokenManagerERC721Factory, [
         schainName,
         messageProxy.address,
@@ -238,7 +210,7 @@ async function main() {
     console.log("Contract TokenManagerERC721 deployed to", tokenManagerERC721.address);
 
     console.log("Deploy TokenManagerERC1155");
-    const tokenManagerERC1155Factory = await ethers.getContractFactory("TokenManagerERC1155", signerWithFixedGasEstimation);
+    const tokenManagerERC1155Factory = await ethers.getContractFactory("TokenManagerERC1155");
     const tokenManagerERC1155 = await upgrades.deployProxy(tokenManagerERC1155Factory, [
         schainName,
         messageProxy.address,
@@ -251,7 +223,7 @@ async function main() {
     console.log("Contract TokenManagerERC1155 deployed to", tokenManagerERC1155.address);
 
     console.log("Deploy TokenManagerERC721WithMetadata");
-    const tokenManagerERC721WithMetadataFactory = await ethers.getContractFactory("TokenManagerERC721WithMetadata", signerWithFixedGasEstimation);
+    const tokenManagerERC721WithMetadataFactory = await ethers.getContractFactory("TokenManagerERC721WithMetadata");
     const tokenManagerERC721WithMetadata = await upgrades.deployProxy(tokenManagerERC721WithMetadataFactory, [
         schainName,
         messageProxy.address,
diff --git a/proxy/package.json b/proxy/package.json
index 99371bca6..a78711f25 100644
--- a/proxy/package.json
+++ b/proxy/package.json
@@ -58,8 +58,7 @@
         "codecov": "^3.7.1",
         "eslint": "^8.46.0",
         "ethereum-waffle": "^4.0.10",
-        "ganache": "7.4.3",
-        "kill-port": "^1.6.1",
+        "ganache": "7.9.2",
         "solhint": "3.3.6",
         "solidity-coverage": "^0.8.4",
         "ts-generator": "^0.1.1",
diff --git a/proxy/yarn.lock b/proxy/yarn.lock
index 59b261e68..19b5c35c8 100644
--- a/proxy/yarn.lock
+++ b/proxy/yarn.lock
@@ -1455,6 +1455,16 @@
   dependencies:
     node-gyp-build "4.3.0"
 
+"@trufflesuite/uws-js-unofficial@20.30.0-unofficial.0":
+  version "20.30.0-unofficial.0"
+  resolved "https://registry.yarnpkg.com/@trufflesuite/uws-js-unofficial/-/uws-js-unofficial-20.30.0-unofficial.0.tgz#2fbc2f8ef7e82fbeea6abaf7e8a9d42a02b479d3"
+  integrity sha512-r5X0aOQcuT6pLwTRLD+mPnAM/nlKtvIK4Z+My++A8tTOR0qTjNRx8UB8jzRj3D+p9PMAp5LnpCUUGmz7/TppwA==
+  dependencies:
+    ws "8.13.0"
+  optionalDependencies:
+    bufferutil "4.0.7"
+    utf-8-validate "6.0.3"
+
 "@typechain/ethers-v5@^10.0.0":
   version "10.2.1"
   resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391"
@@ -1774,7 +1784,7 @@ abortcontroller-polyfill@^1.7.3:
   resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed"
   integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==
 
-abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3:
+abstract-level@1.0.3, abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741"
   integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==
@@ -1787,18 +1797,7 @@ abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3:
     module-error "^1.0.1"
     queue-microtask "^1.2.3"
 
-abstract-leveldown@^6.2.1:
-  version "6.3.0"
-  resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a"
-  integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==
-  dependencies:
-    buffer "^5.5.0"
-    immediate "^3.2.3"
-    level-concat-iterator "~2.0.0"
-    level-supports "~1.0.0"
-    xtend "~4.0.0"
-
-abstract-leveldown@^7.2.0:
+abstract-leveldown@7.2.0, abstract-leveldown@^7.2.0:
   version "7.2.0"
   resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e"
   integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==
@@ -1810,6 +1809,17 @@ abstract-leveldown@^7.2.0:
     level-supports "^2.0.1"
     queue-microtask "^1.2.3"
 
+abstract-leveldown@^6.2.1:
+  version "6.3.0"
+  resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a"
+  integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==
+  dependencies:
+    buffer "^5.5.0"
+    immediate "^3.2.3"
+    level-concat-iterator "~2.0.0"
+    level-supports "~1.0.0"
+    xtend "~4.0.0"
+
 abstract-leveldown@~6.2.1:
   version "6.2.3"
   resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb"
@@ -2079,7 +2089,7 @@ astral-regex@^2.0.0:
   resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
   integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
 
-async-eventemitter@^0.2.4:
+async-eventemitter@0.2.4, async-eventemitter@^0.2.4:
   version "0.2.4"
   resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca"
   integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==
@@ -2347,6 +2357,13 @@ bufferutil@4.0.5:
   dependencies:
     node-gyp-build "^4.3.0"
 
+bufferutil@4.0.7:
+  version "4.0.7"
+  resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad"
+  integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==
+  dependencies:
+    node-gyp-build "^4.3.0"
+
 bufferutil@^4.0.1:
   version "4.0.4"
   resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.4.tgz#ab81373d313a6ead0d734e98c448c722734ae7bb"
@@ -3907,6 +3924,27 @@ ganache@7.4.3:
     bufferutil "4.0.5"
     utf-8-validate "5.0.7"
 
+ganache@7.9.2:
+  version "7.9.2"
+  resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.9.2.tgz#77f506ad2735dd9109696ffa1834a9dd2f806449"
+  integrity sha512-7gsVVDpO9AhrFyDMWWl7SpMsPpqGcnAzjxz3k32LheIPNd64p2XsY9GYRdhWmKuryb60W1iaWPZWDkFKlbRWHA==
+  dependencies:
+    "@trufflesuite/bigint-buffer" "1.1.10"
+    "@trufflesuite/uws-js-unofficial" "20.30.0-unofficial.0"
+    "@types/bn.js" "^5.1.0"
+    "@types/lru-cache" "5.1.1"
+    "@types/seedrandom" "3.0.1"
+    abstract-level "1.0.3"
+    abstract-leveldown "7.2.0"
+    async-eventemitter "0.2.4"
+    emittery "0.10.0"
+    keccak "3.0.2"
+    leveldown "6.1.0"
+    secp256k1 "4.0.3"
+  optionalDependencies:
+    bufferutil "4.0.5"
+    utf-8-validate "5.0.7"
+
 get-caller-file@^2.0.1, get-caller-file@^2.0.5:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
@@ -3944,11 +3982,6 @@ get-symbol-description@^1.0.0:
     call-bind "^1.0.2"
     get-intrinsic "^1.1.1"
 
-get-them-args@1.3.2:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/get-them-args/-/get-them-args-1.3.2.tgz#74a20ba8a4abece5ae199ad03f2bcc68fdfc9ba5"
-  integrity sha1-dKILqKSr7OWuGZrQPyvMaP38m6U=
-
 getpass@^0.1.1:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
@@ -4881,14 +4914,6 @@ keccak@^3.0.0, keccak@^3.0.2:
     node-gyp-build "^4.2.0"
     readable-stream "^3.6.0"
 
-kill-port@^1.6.1:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/kill-port/-/kill-port-1.6.1.tgz#560fe79484583bdf3a5e908557dae614447618aa"
-  integrity sha512-un0Y55cOM7JKGaLnGja28T38tDDop0AQ8N0KlAdyh+B1nmMoX8AnNmqPNZbS3mUMgiST51DCVqmbFT1gNJpVNw==
-  dependencies:
-    get-them-args "1.3.2"
-    shell-exec "1.0.2"
-
 kind-of@^6.0.2:
   version "6.0.3"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
@@ -6257,11 +6282,6 @@ shebang-regex@^3.0.0:
   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
   integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
 
-shell-exec@1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/shell-exec/-/shell-exec-1.0.2.tgz#2e9361b0fde1d73f476c4b6671fa17785f696756"
-  integrity sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==
-
 shelljs@^0.8.3:
   version "0.8.4"
   resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2"
@@ -6991,6 +7011,13 @@ utf-8-validate@5.0.7:
   dependencies:
     node-gyp-build "^4.3.0"
 
+utf-8-validate@6.0.3:
+  version "6.0.3"
+  resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-6.0.3.tgz#7d8c936d854e86b24d1d655f138ee27d2636d777"
+  integrity sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==
+  dependencies:
+    node-gyp-build "^4.3.0"
+
 utf-8-validate@^5.0.2:
   version "5.0.6"
   resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.6.tgz#e1b3e0a5cc8648a3b44c1799fbb170d1aaaffe80"
@@ -7294,6 +7321,11 @@ ws@7.4.6:
   resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
   integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
 
+ws@8.13.0:
+  version "8.13.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0"
+  integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==
+
 ws@^7.4.6:
   version "7.5.5"
   resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881"


Test patch:
diff --git a/proxy/scripts/test_deploy.sh b/proxy/scripts/test_deploy.sh
new file mode 100755
index 000000000..25d88d5e1
--- /dev/null
+++ b/proxy/scripts/test_deploy.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+
+set -e
+
+ACCOUNTS=accounts.json
+GANACHE=$(npx ganache \
+    --😈 \
+    --wallet.accountKeysPath "$ACCOUNTS" \
+    --chain.allowUnlimitedContractSize \
+)
+PRIVATE_KEY=$(jq -r "first(.private_keys[])" < "$ACCOUNTS")
+
+export CHAIN_NAME_SCHAIN="d2-chain"
+export PRIVATE_KEY_FOR_ETHEREUM=$PRIVATE_KEY
+export PRIVATE_KEY_FOR_SCHAIN=$PRIVATE_KEY
+
+yarn deploy-skale-manager-components
+yarn deploy-to-both-chains
+
+npx ganache instances stop "$GANACHE"
diff --git a/proxy/scripts/test_upgrade.sh b/proxy/scripts/test_upgrade.sh
index 3711481ce..68aec7329 100755
--- a/proxy/scripts/test_upgrade.sh
+++ b/proxy/scripts/test_upgrade.sh
@@ -22,7 +22,13 @@ DEPLOYED_DIR=$GITHUB_WORKSPACE/deployed-IMA/
 git clone --branch "$DEPLOYED_TAG" "https://github.com/$GITHUB_REPOSITORY.git" "$DEPLOYED_DIR"
 
 ACCOUNTS_FILENAME="$DEPLOYED_DIR/proxy/generatedAccounts.json"
-npx ganache-cli --gasLimit 9000000 --quiet --allowUnlimitedContractSize --account_keys_path "$ACCOUNTS_FILENAME" &
+GANACHE=$(npx ganache \
+    --😈 \
+    --miner.blockGasLimit 9000000 \
+    --logging.quiet \
+    --chain.allowUnlimitedContractSize \
+    --wallet.accountKeysPath "$ACCOUNTS_FILENAME" \
+)
 
 cd "$DEPLOYED_DIR"
 yarn install
@@ -66,4 +72,4 @@ ALLOW_NOT_ATOMIC_UPGRADE="OK" \
 VERSION=$VERSION_TAG \
 npx hardhat run migrations/upgradeSchain.ts --network localhost
 
-npx kill-port 8545
+npx ganache instances stop "$GANACHE"