git.delta.rocks / unique-network / refs/commits / 5a3f942b588a

difftreelog

ci move forkless-nodata to baedeker

Yaroslav Bolyukin2023-09-08parent: #129199c.patch.diff
in: master

5 files changed

modified.docker/Dockerfile-uniquediffbeforeafterboth
--- a/.docker/Dockerfile-unique
+++ b/.docker/Dockerfile-unique
@@ -48,11 +48,13 @@
     cd unique-chain && \
     echo "Using runtime features '$RUNTIME_FEATURES'" && \
     CARGO_INCREMENTAL=0 cargo build --release --features="$RUNTIME_FEATURES" --locked && \
-    mv ./target/release/unique-collator /unique_parachain/unique-chain/
+    mv ./target/release/unique-collator /unique_parachain/unique-chain/ && \
+    cd target/release/wbuild && find . -name "*.wasm" -exec sh -c 'mkdir -p "../../../wasm/$(dirname {})"; cp {} "../../../wasm/{}"' \;
 
 # ===== BIN ======
 
 FROM ubuntu:22.04 as builder-polkadot
 
 COPY --from=builder-polkadot-bin /unique_parachain/unique-chain/unique-collator /bin/unique-collator
+COPY --from=builder-polkadot-bin /unique_parachain/unique-chain/wasm /wasm
 ENTRYPOINT ["/bin/unique-collator"]
added.github/actions/extractDocker/action.ymldiffbeforeafterboth
--- /dev/null
+++ b/.github/actions/extractDocker/action.yml
@@ -0,0 +1,27 @@
+name: Extract files from docker image
+description: ''
+inputs:
+  image:
+    description: Image to extract
+    required: true
+  directory:
+    description: Directory to extract from image
+    required: true
+outputs:
+  dir:
+    description: Extracted directory
+    value: ${{ steps.mktemp.outputs.dir }}
+runs:
+  using: composite
+  steps:
+    - name: Create temporary directory
+      id: mktemp
+      run: |
+        dir=$(mktemp -d -p $RUNNER_TEMP)
+        echo "dir=$dir" >> $GITHUB_OUTPUT
+      shell: bash
+    - name: Extract directory from image
+      run: |
+        docker run --entrypoint tar "${{ inputs.image }}" \
+          -C ${{ inputs.directory }} -c . | tar -xC ${{ steps.mktemp.outputs.dir }}
+      shell: bash
modified.github/workflows/forkless-update-nodata.ymldiffbeforeafterboth
before · .github/workflows/forkless-update-nodata.yml
1# https://cryptousetech.atlassian.net/wiki/spaces/CI/pages/2586837021/Forkless+update+without+data2# Forkless update without data replication34# Triger: only call from main workflow(re-usable workflows)5on:6  workflow_call:789# A workflow run is made up of one or more jobs that can run sequentially or in parallel10jobs:11  prepare-execution-marix:1213    name: Prepare execution matrix1415    runs-on: self-hosted-ci16    outputs:17      matrix: ${{ steps.create_matrix.outputs.matrix }}1819    steps:2021      - name: Clean Workspace22        uses: AutoModality/action-clean@v1.1.02324      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it25      - uses: actions/checkout@v3.1.026        with:27          ref: ${{ github.head_ref }}  #Checking out head commit2829      - name: Read .env file30        uses: xom9ikk/dotenv@v23132      - name: Create Execution matrix33        uses: CertainLach/create-matrix-action@v434        id: create_matrix35        with:36          matrix: |37            network {quartz}, wasm_name {quartz}, mainnet_branch {${{ env.QUARTZ_MAINNET_BRANCH }}}, relay_branch {${{ env.KUSAMA_MAINNET_BRANCH }}}38            network {unique}, wasm_name {unique}, mainnet_branch {${{ env.UNIQUE_MAINNET_BRANCH }}}, relay_branch {${{ env.POLKADOT_MAINNET_BRANCH }}}39            network {opal}, wasm_name {opal}, mainnet_branch {${{ env.OPAL_MAINNET_BRANCH }}}, relay_branch {${{ env.UNIQUEWEST_MAINNET_BRANCH }}}40            network {sapphire}, wasm_name {quartz}, mainnet_branch {${{ env.SAPPHIRE_MAINNET_BRANCH }}}, relay_branch {${{ env.UNIQUEEAST_MAINNET_BRANCH }}}414243  forkless-nodata-build:44    needs: prepare-execution-marix45    # The type of runner that the job will run on46    runs-on: [self-hosted-ci,large]4748    timeout-minutes: 13804950    name: ${{ matrix.network }}-nodata-build5152    continue-on-error: true         #Do not stop testing of matrix runs failed.  As it decided during PR review - it required 50/50& Let's check it with false.5354    strategy:55      matrix:56        include: ${{fromJson(needs.prepare-execution-marix.outputs.matrix)}}5758    steps:59      - name: Clean Workspace60        uses: AutoModality/action-clean@v1.1.06162      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it63      - uses: actions/checkout@v3.1.064        with:65          ref: ${{ github.head_ref }}  #Checking out head commit6667      - name: Read .env file68        uses: xom9ikk/dotenv@v26970      # Prepare SHA  71      - name: Prepare SHA72        uses: ./.github/actions/prepare7374      - name: Log in to Docker Hub75        uses: docker/login-action@v2.1.076        with:77          username: ${{ secrets.CORE_DOCKERHUB_USERNAME }}78          password: ${{ secrets.CORE_DOCKERHUB_TOKEN }}7980      # Build main image for FORKLESS-UPDATE-NODATA81      - name: Generate ENV related extend Dockerfile file82        uses: cuchi/jinja2-action@v1.2.083        with:84          template: .docker/Dockerfile-parachain-upgrade.j285          output_file: .docker/Dockerfile-parachain-upgrade.${{ matrix.network }}.yml86          variables: |87            RUST_TOOLCHAIN=${{ env.RUST_TOOLCHAIN }}88            NETWORK=${{ matrix.network }}89            MAINNET_BRANCH=${{ matrix.mainnet_branch }}90            WASM_NAME=${{ matrix.wasm_name }}91            POLKADOT_BUILD_BRANCH=${{ matrix.relay_branch }}92            POLKADOT_LAUNCH_BRANCH=${{ env.POLKADOT_LAUNCH_BRANCH }}9394      - name: Show build Dockerfile95        run: cat .docker/Dockerfile-parachain-upgrade.${{ matrix.network }}.yml9697      - name: Generate launch-config-forkless-nodata.json98        uses: cuchi/jinja2-action@v1.2.099        with:100          template: .docker/forkless-config/launch-config-forkless-nodata.j2101          output_file: .docker/forkless-config/launch-config-forkless-nodata.json102          variables: |103            WASM_NAME=${{ matrix.wasm_name }}104            RELAY_CHAIN_TYPE=${{ env.RELAY_CHAIN_TYPE }}105106      - name: Show launch-config-forkless configuration107        run: cat .docker/forkless-config/launch-config-forkless-nodata.json108109      - name: Run find-and-replace to remove slashes from branch name110        uses: mad9000/actions-find-and-replace-string@4111        id: branchname112        with:113          source: ${{ github.head_ref }}114          find: '/'115          replace: '-'116117      - name: Set build SHA118        shell: bash119        run: |120          echo "BUILD_SHA=${LAST_COMMIT_SHA:0:8}" >> $GITHUB_ENV121122      - name: Build the stack123        run: cd .docker/ && docker build --no-cache --file ./Dockerfile-parachain-upgrade.${{ matrix.network }}.yml --tag uniquenetwork/ci-forkless-nodata-local:${{ matrix.network }}-${{ steps.branchname.outputs.value }}-$BUILD_SHA ../124125      - name: Push docker image version126        run: docker push uniquenetwork/ci-forkless-nodata-local:${{ matrix.network }}-${{ steps.branchname.outputs.value }}-$BUILD_SHA127128      - name: Remove builder cache129        if: always()                   # run this step always130        run: |131          docker builder prune -f132          docker system prune -f133134135  forkless-nodata-tests:136    needs: [prepare-execution-marix, forkless-nodata-build]137    # The type of runner that the job will run on138    runs-on: [self-hosted-ci, large]139140    timeout-minutes: 600141142    name: ${{ matrix.network }}-nodata-tests143144    continue-on-error: true         #Do not stop testing of matrix runs failed.  As it decided during PR review - it required 50/50& Let's check it with false.145146    strategy:147      matrix:148        include: ${{fromJson(needs.prepare-execution-marix.outputs.matrix)}}149150    steps:151      - name: Skip if pull request is in Draft152        if: github.event.pull_request.draft == true153        run: exit 1154155      - name: Clean Workspace156        uses: AutoModality/action-clean@v1.1.0157158      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it159      - uses: actions/checkout@v3.1.0160        with:161          ref: ${{ github.head_ref }}  #Checking out head commit162163      - name: Prepare164        uses: ./.github/actions/prepare165166      - name: Set build SHA167        shell: bash168        run: |169          echo "BUILD_SHA=${LAST_COMMIT_SHA:0:8}" >> $GITHUB_ENV170171      - name: Run find-and-replace to remove slashes from branch name172        uses: mad9000/actions-find-and-replace-string@4173        id: branchname174        with:175          source: ${{ github.head_ref }}176          find: '/'177          replace: '-'178179      - name: Read .env file180        uses: xom9ikk/dotenv@v2181182      - name: Generate ENV related extend file for docker-compose183        uses: cuchi/jinja2-action@v1.2.0184        with:185          template: .docker/docker-compose.forkless-nodata.j2186          output_file: .docker/docker-compose.forkless-nodata.${{ matrix.network }}.yml187          variables: |188            NETWORK=${{ matrix.network }}189            BUILD_TAG=${{ steps.branchname.outputs.value }}-$BUILD_SHA190191      - name: Show build configuration192        run: cat .docker/docker-compose.forkless-nodata.${{ matrix.network }}.yml193194      - name: Log in to Docker Hub195        uses: docker/login-action@v2.1.0196        with:197          username: ${{ secrets.CORE_DOCKERHUB_USERNAME }}198          password: ${{ secrets.CORE_DOCKERHUB_TOKEN }}199200      - name: Build the stack201        run: docker-compose -f ".docker/docker-compose.forkless-nodata.${{ matrix.network }}.yml" up -d --remove-orphans --force-recreate --timeout 300202203      - uses: actions/setup-node@v3.5.1204        with:205          node-version: 18206207      - name: Check if docker logs consist logs related to Runtime Upgrade testing.208        if: success()209        run: |210          counter=160211          function check_container_status {212                docker inspect -f {{.State.Running}} forkless-nodata213          }214          function do_docker_logs {215                docker logs --details forkless-nodata  2>&1216          }217          function is_started {218                if [ "$(check_container_status)" == "true" ]; then219                        echo "Container: forkless-nodata RUNNING";220                        echo "Check Docker logs"221                        DOCKER_LOGS=$(do_docker_logs)222                        if [[ ${DOCKER_LOGS} = *"🛸 PARACHAINS' RUNTIME UPGRADE TESTING COMPLETE 🛸"* ]];then223                                echo "🛸 PARACHAINS' RUNTIME UPGRADE TESTING COMPLETE 🛸"224                                return 0225                        elif [[ ${DOCKER_LOGS} = *"🚧 PARACHAINS' RUNTIME UPGRADE TESTING FAILED 🚧"* ]];then226                                echo "🚧 PARACHAINS' RUNTIME UPGRADE TESTING FAILED 🚧"227                                return 1228                        else229                                echo "Message not found in logs output, repeating..."230                                return 1231                        fi232                else233                        echo "Container forkless-nodata not RUNNING"234                        echo "Halting all future checks"235                        exit 1236                fi237          exit 0238          }239          while ! is_started; do240                echo "Waiting for special message in log files "241                sleep 30s242                counter=$(( $counter - 1 ))243                echo "Counter: $counter"244                if [ "$counter" -gt "0" ]; then245                         continue246                else247                         break248                fi249          done250          echo "Halting script"251          exit 0252        shell: bash253254      - name: Collect Docker Logs255        if: success() || failure()256        uses: jwalton/gh-docker-logs@v2.2.1257        with:258          dest: './forkless-parachain-upgrade-nodata-logs.${{ matrix.network }}'259260      - name: Show docker logs261        if: success() || failure()262        run: cat './forkless-parachain-upgrade-nodata-logs.${{ matrix.network }}/forkless-nodata.log'263264      - name: Run Parallel tests265        working-directory: tests266        run: |267          yarn install268          yarn add mochawesome269          ./scripts/wait_for_first_block.sh270          echo "Ready to start tests"271          NOW=$(date +%s) && yarn testParallel --reporter mochawesome --reporter-options reportFilename=test-parallel-${NOW}272        env:273          RPC_URL: http://127.0.0.1:9944/274275      - name: Test Report Parallel276        uses: phoenix-actions/test-reporting@v10277        id: test-report-parallel278        if: success() || failure()    # run this step even if previous step failed279        with:280          name: Report Parallel tests results - ${{ matrix.network }}            # Name of the check run which will be created281          path: tests/mochawesome-report/test-parallel-*.json    # Path to test results282          reporter: mochawesome-json283          fail-on-error: 'false'284285      - name: Run Sequential tests286        working-directory: tests287        if: success() || failure()288        run: |289          yarn install290          yarn add mochawesome291          ./scripts/wait_for_first_block.sh292          echo "Ready to start tests"293          NOW=$(date +%s) && yarn testSequential --reporter mochawesome --reporter-options reportFilename=test-sequential-${NOW}294        env:295          RPC_URL: http://127.0.0.1:9944/296297      - name: Test Report Sequential298        uses: phoenix-actions/test-reporting@v10299        id: test-report-sequential300        if: success() || failure()    # run this step even if previous step failed301        with:302          name: Report Sequential tests results - ${{ matrix.network }}            # Name of the check run which will be created303          path: tests/mochawesome-report/test-sequential-*.json    # Path to test results304          reporter: mochawesome-json305          fail-on-error: 'false'306307      - name: Stop running containers308        if: always()                   # run this step always309        run: docker-compose -f ".docker/docker-compose.forkless-nodata.${{ matrix.network }}.yml" down310311      - name: Remove builder cache312        if: always()                   # run this step always313        run: |314          docker builder prune -f -a315          docker system prune -f316          docker image prune -f -a
after · .github/workflows/forkless-update-nodata.yml
1# https://cryptousetech.atlassian.net/wiki/spaces/CI/pages/2586837021/Forkless+update+without+data2# Forkless update without data replication34# Triger: only call from main workflow(re-usable workflows)5on:6  workflow_call:789# A workflow run is made up of one or more jobs that can run sequentially or in parallel10jobs:1112  prepare-execution-matrix:1314    name: execution matrix1516    runs-on: self-hosted-ci17    outputs:18      matrix: ${{ steps.create_matrix.outputs.matrix }}1920    steps:2122      - name: Clean Workspace23        uses: AutoModality/action-clean@v1.1.02425      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it26      - uses: actions/checkout@v3.1.027        with:28          ref: ${{ github.head_ref }}  #Checking out head commit2930      - name: Read .env file31        uses: xom9ikk/dotenv@v23233      - name: Create Execution matrix34        uses: CertainLach/create-matrix-action@v435        id: create_matrix36        with:37          matrix: |38            network {opal}, mainnet_branch {${{ env.OPAL_MAINNET_BRANCH }}}, relay_branch {${{ env.UNIQUEWEST_MAINNET_BRANCH }}}, runtime_features {opal-runtime}, wasm_name {opal}39            network {sapphire}, mainnet_branch {${{ env.SAPPHIRE_MAINNET_BRANCH }}}, relay_branch {${{ env.UNIQUEEAST_MAINNET_BRANCH }}}, runtime_features {sapphire-runtime}, wasm_name {quartz}40            network {quartz}, mainnet_branch {${{ env.QUARTZ_MAINNET_BRANCH }}}, relay_branch {${{ env.KUSAMA_MAINNET_BRANCH }}}, runtime_features {quartz-runtime}, wasm_name {quartz}41            network {unique}, mainnet_branch {${{ env.UNIQUE_MAINNET_BRANCH }}}, relay_branch {${{ env.POLKADOT_MAINNET_BRANCH }}}, runtime_features {unique-runtime}, wasm_name {unique}4243  forkless-nodata-build:4445    needs: prepare-execution-matrix46    # The type of runner that the job will run on47    runs-on: [self-hosted-ci,large]4849    timeout-minutes: 13805051    name: ${{ matrix.network }}-nodata-build5253    continue-on-error: true         #Do not stop testing of matrix runs failed.  As it decided during PR review - it required 50/50& Let's check it with false.5455    strategy:56      matrix:57        include: ${{fromJson(needs.prepare-execution-matrix.outputs.matrix)}}5859    steps:6061      - name: Clean Workspace62        uses: AutoModality/action-clean@v1.1.06364      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it65      - uses: actions/checkout@v3.1.066        with:67          ref: ${{ github.head_ref }}  #Checking out head commit6869      # Prepare SHA  70      - name: Prepare SHA71        uses: ./.github/actions/prepare7273      - name: Read .env file74        uses: xom9ikk/dotenv@v27576      - name: Log in to Docker Hub77        uses: docker/login-action@v2.1.078        with:79          username: ${{ secrets.CORE_DOCKERHUB_USERNAME }}80          password: ${{ secrets.CORE_DOCKERHUB_TOKEN }}8182      - name: Generate ENV related extend Dockerfile file for POLKADOT83        uses: cuchi/jinja2-action@v1.2.084        with:85          template: .docker/Dockerfile-polkadot.j286          output_file: .docker/Dockerfile-polkadot.${{ matrix.relay_branch }}.yml87          variables: |88            RUST_TOOLCHAIN=${{ env.RUST_TOOLCHAIN }}89            POLKADOT_BUILD_BRANCH=${{ matrix.relay_branch }}90            91      - name: Prepare polkadot92        uses: ./.github/actions/buildContainer93        id: polkadot94        with:95          container: uniquenetwork/builder-polkadot96          tag: ${{ matrix.relay_branch }}97          context: .docker98          dockerfile: Dockerfile-polkadot.${{ matrix.relay_branch }}.yml99          dockerhub_username: ${{ secrets.CORE_DOCKERHUB_USERNAME }}100          dockerhub_token: ${{ secrets.CORE_DOCKERHUB_TOKEN }}101102      - name: Prepare mainnet103        uses: ./.github/actions/buildContainer104        id: mainnet105        with:106          container: uniquenetwork/ci-nodata-${{ matrix.network }}107          tag: ${{ matrix.mainnet_branch }}108          context: .docker109          dockerfile: Dockerfile-unique-release110          args: |111            --build-arg RUNTIME_FEATURES=${{ matrix.runtime_features }}112            --build-arg RUST_TOOLCHAIN=${{ env.RUST_TOOLCHAIN }}113            --build-arg UNIQUE_VERSION=${{ matrix.mainnet_branch }}114          dockerhub_username: ${{ secrets.CORE_DOCKERHUB_USERNAME }}115          dockerhub_token: ${{ secrets.CORE_DOCKERHUB_TOKEN }}116117      - name: Prepare latest118        uses: ./.github/actions/buildContainer119        id: latest120        with:121          container: uniquenetwork/ci-nodata-${{ matrix.network }}122          tag: ${{ env.REF_SLUG }}-${{ env.BUILD_SHA }}123          context: .124          dockerfile: .docker/Dockerfile-unique125          args: |126            --build-arg RUNTIME_FEATURES=${{ matrix.runtime_features }}127            --build-arg RUST_TOOLCHAIN=${{ env.RUST_TOOLCHAIN }}128          dockerhub_username: ${{ secrets.CORE_DOCKERHUB_USERNAME }}129          dockerhub_token: ${{ secrets.CORE_DOCKERHUB_TOKEN }}130131      - name: Extract wasms132        uses: ./.github/actions/extractDocker133        id: wasms134        with:135          image: ${{ steps.latest.outputs.name }}136          directory: /wasm137138      - uses: actions/setup-node@v3.5.1139        with:140          node-version: 18141142      - name: Install baedeker143        uses: UniqueNetwork/baedeker-action/setup@built144145      - name: Setup library146        run: mkdir -p .baedeker/vendor/ && git clone https://github.com/UniqueNetwork/baedeker-library .baedeker/vendor/baedeker-library147148      - name: Start network149        uses: UniqueNetwork/baedeker-action@built150        id: bdk151        with:152          jpath: |153            .baedeker/vendor154          tla-str: |155            relay_spec=rococo-local156          inputs: |157            .baedeker/node-only.jsonnet158            snippet:(import 'baedeker-library/ops/rewrites.libsonnet').rewriteNodePaths({'bin/polkadot':{dockerImage:'${{ steps.polkadot.outputs.name }}'}})159            snippet:(import 'baedeker-library/ops/rewrites.libsonnet').rewriteNodePaths({'bin/unique':{dockerImage:'${{ steps.mainnet.outputs.name }}'}}, extra_node_mixin = {legacyRpc: true})160161      - name: "Reconcile: runtime is upgraded"162        working-directory: tests163        run: |164          yarn165          ./scripts/wait_for_first_block.sh166          echo "Executing upgrade"167          yarn ts-node --esm src/util/authorizeEnactUpgrade.ts ${{ steps.wasms.outputs.dir }}/${{ matrix.wasm_name }}-runtime/${{ matrix.wasm_name }}_runtime.compact.compressed.wasm168        env:169          RPC_URL: ${{ env.RELAY_UNIQUE_HTTP_URL }}170171      - name: Run Parallel tests after forkless upgrade172        working-directory: tests173        run: |174          ./scripts/wait_for_first_block.sh175          echo "Ready to start tests"176          NOW=$(date +%s) && yarn testParallel --reporter mochawesome --reporter-options reportFilename=test-parallel-${NOW}177        env:178          RPC_URL: ${{ env.RELAY_UNIQUE_HTTP_URL }}179180      - name: Run Sequential tests after forkless upgrade181        if: success() || failure()182        working-directory: ${{ matrix.mainnet_branch }}/tests183        run: NOW=$(date +%s) && yarn testSequential --reporter mochawesome --reporter-options reportFilename=test-sequential-${NOW}184        env:185          RPC_URL: ${{ env.RELAY_UNIQUE_HTTP_URL }}186187      - name: Remove builder cache188        if: always()                   # run this step always189        run: |190          docker system prune -f
modifiedtests/package.jsondiffbeforeafterboth
--- a/tests/package.json
+++ b/tests/package.json
@@ -18,6 +18,7 @@
     "eslint": "^8.45.0",
     "eslint-plugin-mocha": "^10.1.0",
     "mocha": "^10.1.0",
+    "mochawesome": "^7.1.3",
     "ts-node": "^10.9.1",
     "typescript": "^5.1.6"
   },
modifiedtests/yarn.lockdiffbeforeafterboth
--- a/tests/yarn.lock
+++ b/tests/yarn.lock
@@ -1888,7 +1888,7 @@
   languageName: node
   linkType: hard
 
-"chalk@npm:^4.0.0, chalk@npm:^4.1.0":
+"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2":
   version: 4.1.2
   resolution: "chalk@npm:4.1.2"
   dependencies:
@@ -2269,6 +2269,13 @@
   languageName: node
   linkType: hard
 
+"dateformat@npm:^4.5.1":
+  version: 4.6.3
+  resolution: "dateformat@npm:4.6.3"
+  checksum: c3aa0617c0a5b30595122bc8d1bee6276a9221e4d392087b41cbbdf175d9662ae0e50d0d6dcdf45caeac5153c4b5b0844265f8cd2b2245451e3da19e39e3b65d
+  languageName: node
+  linkType: hard
+
 "debug@npm:2.6.9, debug@npm:^2.2.0":
   version: 2.6.9
   resolution: "debug@npm:2.6.9"
@@ -2394,6 +2401,13 @@
   languageName: node
   linkType: hard
 
+"diff@npm:^5.0.0":
+  version: 5.1.0
+  resolution: "diff@npm:5.1.0"
+  checksum: c7bf0df7c9bfbe1cf8a678fd1b2137c4fb11be117a67bc18a0e03ae75105e8533dbfb1cda6b46beb3586ef5aed22143ef9d70713977d5fb1f9114e21455fba90
+  languageName: node
+  linkType: hard
+
 "dir-glob@npm:^3.0.1":
   version: 3.0.1
   resolution: "dir-glob@npm:3.0.1"
@@ -2557,7 +2571,7 @@
   languageName: node
   linkType: hard
 
-"escape-html@npm:~1.0.3":
+"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3":
   version: 1.0.3
   resolution: "escape-html@npm:1.0.3"
   checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24
@@ -3158,6 +3172,17 @@
   languageName: node
   linkType: hard
 
+"fs-extra@npm:^10.0.0":
+  version: 10.1.0
+  resolution: "fs-extra@npm:10.1.0"
+  dependencies:
+    graceful-fs: ^4.2.0
+    jsonfile: ^6.0.1
+    universalify: ^2.0.0
+  checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50
+  languageName: node
+  linkType: hard
+
 "fs-extra@npm:^4.0.2":
   version: 4.0.3
   resolution: "fs-extra@npm:4.0.3"
@@ -3233,6 +3258,13 @@
   languageName: node
   linkType: hard
 
+"fsu@npm:^1.1.1":
+  version: 1.1.1
+  resolution: "fsu@npm:1.1.1"
+  checksum: 470564b7586fab03ec7bbb13f3b15cf316d51919174b44e31718d4de2f7de4ce07dc180d62b984c144b7ec6e0cca2174c03985a5d8cbef70bd1ec12f1da8968d
+  languageName: node
+  linkType: hard
+
 "function-bind@npm:^1.1.1":
   version: 1.1.1
   resolution: "function-bind@npm:1.1.1"
@@ -3464,7 +3496,7 @@
   languageName: node
   linkType: hard
 
-"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.6":
+"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6":
   version: 4.2.11
   resolution: "graceful-fs@npm:4.2.11"
   checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7
@@ -3966,6 +3998,13 @@
   languageName: node
   linkType: hard
 
+"js-tokens@npm:^3.0.0 || ^4.0.0":
+  version: 4.0.0
+  resolution: "js-tokens@npm:4.0.0"
+  checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78
+  languageName: node
+  linkType: hard
+
 "js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0":
   version: 4.1.0
   resolution: "js-yaml@npm:4.1.0"
@@ -4031,6 +4070,19 @@
   languageName: node
   linkType: hard
 
+"jsonfile@npm:^6.0.1":
+  version: 6.1.0
+  resolution: "jsonfile@npm:6.1.0"
+  dependencies:
+    graceful-fs: ^4.1.6
+    universalify: ^2.0.0
+  dependenciesMeta:
+    graceful-fs:
+      optional: true
+  checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354
+  languageName: node
+  linkType: hard
+
 "jsprim@npm:^1.2.2":
   version: 1.4.2
   resolution: "jsprim@npm:1.4.2"
@@ -4090,6 +4142,34 @@
   languageName: node
   linkType: hard
 
+"lodash.isempty@npm:^4.4.0":
+  version: 4.4.0
+  resolution: "lodash.isempty@npm:4.4.0"
+  checksum: a8118f23f7ed72a1dbd176bf27f297d1e71aa1926288449cb8f7cef99ba1bc7527eab52fe7899ab080fa1dc150aba6e4a6367bf49fa4e0b78da1ecc095f8d8c5
+  languageName: node
+  linkType: hard
+
+"lodash.isfunction@npm:^3.0.9":
+  version: 3.0.9
+  resolution: "lodash.isfunction@npm:3.0.9"
+  checksum: 99e54c34b1e8a9ba75c034deb39cedbd2aca7af685815e67a2a8ec4f73ec9748cda6ebee5a07d7de4b938e90d421fd280e9c385cc190f903ac217ac8aff30314
+  languageName: node
+  linkType: hard
+
+"lodash.isobject@npm:^3.0.2":
+  version: 3.0.2
+  resolution: "lodash.isobject@npm:3.0.2"
+  checksum: 6c1667cbc4494d0a13a3617a4b23278d6d02dac520311f2bbb43f16f2cf71d2e6eb9dec8057315b77459df4890c756a256a087d3f4baa44a79ab5d6c968b060e
+  languageName: node
+  linkType: hard
+
+"lodash.isstring@npm:^4.0.1":
+  version: 4.0.1
+  resolution: "lodash.isstring@npm:4.0.1"
+  checksum: eaac87ae9636848af08021083d796e2eea3d02e80082ab8a9955309569cb3a463ce97fd281d7dc119e402b2e7d8c54a23914b15d2fc7fff56461511dc8937ba0
+  languageName: node
+  linkType: hard
+
 "lodash.merge@npm:^4.6.2":
   version: 4.6.2
   resolution: "lodash.merge@npm:4.6.2"
@@ -4114,6 +4194,17 @@
   languageName: node
   linkType: hard
 
+"loose-envify@npm:^1.4.0":
+  version: 1.4.0
+  resolution: "loose-envify@npm:1.4.0"
+  dependencies:
+    js-tokens: ^3.0.0 || ^4.0.0
+  bin:
+    loose-envify: cli.js
+  checksum: 6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4
+  languageName: node
+  linkType: hard
+
 "lossless-json@npm:^2.0.9":
   version: 2.0.11
   resolution: "lossless-json@npm:2.0.11"
@@ -4522,6 +4613,48 @@
   languageName: node
   linkType: hard
 
+"mochawesome-report-generator@npm:^6.2.0":
+  version: 6.2.0
+  resolution: "mochawesome-report-generator@npm:6.2.0"
+  dependencies:
+    chalk: ^4.1.2
+    dateformat: ^4.5.1
+    escape-html: ^1.0.3
+    fs-extra: ^10.0.0
+    fsu: ^1.1.1
+    lodash.isfunction: ^3.0.9
+    opener: ^1.5.2
+    prop-types: ^15.7.2
+    tcomb: ^3.2.17
+    tcomb-validation: ^3.3.0
+    validator: ^13.6.0
+    yargs: ^17.2.1
+  bin:
+    marge: bin/cli.js
+  checksum: bbfafc781a5b5aa39a012e0bed7d50ac929f72a46dee640223e4398b5f2121bd552a58f1dd481c0133678650a2e4730a9f97b8a5f26f2956b66b5c0057eb9391
+  languageName: node
+  linkType: hard
+
+"mochawesome@npm:^7.1.3":
+  version: 7.1.3
+  resolution: "mochawesome@npm:7.1.3"
+  dependencies:
+    chalk: ^4.1.2
+    diff: ^5.0.0
+    json-stringify-safe: ^5.0.1
+    lodash.isempty: ^4.4.0
+    lodash.isfunction: ^3.0.9
+    lodash.isobject: ^3.0.2
+    lodash.isstring: ^4.0.1
+    mochawesome-report-generator: ^6.2.0
+    strip-ansi: ^6.0.1
+    uuid: ^8.3.2
+  peerDependencies:
+    mocha: ">=7"
+  checksum: 87730026de2a407752088e9baddc105660bfd228d491f9f6588784cd7a200712b40a4987232d3870a353bb5deec61ae6e080686fb2effe099da240067fe619d6
+  languageName: node
+  linkType: hard
+
 "mock-fs@npm:^4.1.0":
   version: 4.14.0
   resolution: "mock-fs@npm:4.14.0"
@@ -4838,6 +4971,15 @@
   languageName: node
   linkType: hard
 
+"opener@npm:^1.5.2":
+  version: 1.5.2
+  resolution: "opener@npm:1.5.2"
+  bin:
+    opener: bin/opener-bin.js
+  checksum: 33b620c0d53d5b883f2abc6687dd1c5fd394d270dbe33a6356f2d71e0a2ec85b100d5bac94694198ccf5c30d592da863b2292c5539009c715a9c80c697b4f6cc
+  languageName: node
+  linkType: hard
+
 "optionator@npm:^0.9.3":
   version: 0.9.3
   resolution: "optionator@npm:0.9.3"
@@ -5042,6 +5184,17 @@
   languageName: node
   linkType: hard
 
+"prop-types@npm:^15.7.2":
+  version: 15.8.1
+  resolution: "prop-types@npm:15.8.1"
+  dependencies:
+    loose-envify: ^1.4.0
+    object-assign: ^4.1.1
+    react-is: ^16.13.1
+  checksum: c056d3f1c057cb7ff8344c645450e14f088a915d078dcda795041765047fa080d38e5d626560ccaac94a4e16e3aa15f3557c1a9a8d1174530955e992c675e459
+  languageName: node
+  linkType: hard
+
 "propagate@npm:^2.0.0":
   version: 2.0.1
   resolution: "propagate@npm:2.0.1"
@@ -5178,6 +5331,13 @@
   languageName: node
   linkType: hard
 
+"react-is@npm:^16.13.1":
+  version: 16.13.1
+  resolution: "react-is@npm:16.13.1"
+  checksum: f7a19ac3496de32ca9ae12aa030f00f14a3d45374f1ceca0af707c831b2a6098ef0d6bdae51bd437b0a306d7f01d4677fcc8de7c0d331eb47ad0f46130e53c5f
+  languageName: node
+  linkType: hard
+
 "readable-stream@npm:^3.6.0":
   version: 3.6.2
   resolution: "readable-stream@npm:3.6.2"
@@ -5806,6 +5966,22 @@
   languageName: node
   linkType: hard
 
+"tcomb-validation@npm:^3.3.0":
+  version: 3.4.1
+  resolution: "tcomb-validation@npm:3.4.1"
+  dependencies:
+    tcomb: ^3.0.0
+  checksum: 0b0bc3dab680274aeaadd8bd01528cffc7065e4ebb2b50ee354c3cc99b443530a7a7c9a3c7abf609d8e44927c51036fcef302d1bc743ff670fddbe04e8cc1e53
+  languageName: node
+  linkType: hard
+
+"tcomb@npm:^3.0.0, tcomb@npm:^3.2.17":
+  version: 3.2.29
+  resolution: "tcomb@npm:3.2.29"
+  checksum: 484e39a06ce59f1752b7589cb5fce9a7f58bd34ba11a48045d5d955c7bb7133d5617f8bf2dcf2b27f06df0dffe3734097c15179c86e4f9e5bff224c99c90aa8c
+  languageName: node
+  linkType: hard
+
 "text-table@npm:^0.2.0":
   version: 0.2.0
   resolution: "text-table@npm:0.2.0"
@@ -6133,6 +6309,7 @@
     find-process: ^1.4.7
     lossless-json: ^2.0.9
     mocha: ^10.1.0
+    mochawesome: ^7.1.3
     solc: 0.8.20
     ts-node: ^10.9.1
     typechain: ^8.2.0
@@ -6148,6 +6325,13 @@
   languageName: node
   linkType: hard
 
+"universalify@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "universalify@npm:2.0.0"
+  checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44
+  languageName: node
+  linkType: hard
+
 "unpipe@npm:1.0.0, unpipe@npm:~1.0.0":
   version: 1.0.0
   resolution: "unpipe@npm:1.0.0"
@@ -6224,6 +6408,15 @@
   languageName: node
   linkType: hard
 
+"uuid@npm:^8.3.2":
+  version: 8.3.2
+  resolution: "uuid@npm:8.3.2"
+  bin:
+    uuid: dist/bin/uuid
+  checksum: 5575a8a75c13120e2f10e6ddc801b2c7ed7d8f3c8ac22c7ed0c7b2ba6383ec0abda88c905085d630e251719e0777045ae3236f04c812184b7c765f63a70e58df
+  languageName: node
+  linkType: hard
+
 "uuid@npm:^9.0.0":
   version: 9.0.0
   resolution: "uuid@npm:9.0.0"
@@ -6240,6 +6433,13 @@
   languageName: node
   linkType: hard
 
+"validator@npm:^13.6.0":
+  version: 13.11.0
+  resolution: "validator@npm:13.11.0"
+  checksum: d1e0c27022681420756da25bc03eb08d5f0c66fb008f8ff02ebc95812b77c6be6e03d3bd05cf80ca702e23eeb73dadd66b4b3683173ea2a0bc7cc72820bee131
+  languageName: node
+  linkType: hard
+
 "varint@npm:^5.0.0":
   version: 5.0.2
   resolution: "varint@npm:5.0.2"
@@ -6806,7 +7006,7 @@
   languageName: node
   linkType: hard
 
-"yargs@npm:^17.7.2":
+"yargs@npm:^17.2.1, yargs@npm:^17.7.2":
   version: 17.7.2
   resolution: "yargs@npm:17.7.2"
   dependencies: