diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 28d43620bd6..cf40266d608 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,8 +19,6 @@ jobs: name: Release NPM packages runs-on: self-hosted if: github.event_name != 'workflow_dispatch' - needs: - - build-rs-drive-nodejs env: SCCACHE_GHA_ENABLED: "true" RUSTC_WRAPPER: "sccache" @@ -80,12 +78,6 @@ jobs: env: CARGO_BUILD_PROFILE: release - - name: Download prebuild artifacts - uses: actions/download-artifact@v3 - with: - name: prebuilds - path: packages/rs-drive-nodejs/prebuilds - - name: Set suffix uses: actions/github-script@v6 id: suffix @@ -134,6 +126,20 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Setup Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: stable + target: wasm32-unknown-unknown + + - name: Setup Cargo cache + uses: Swatinem/rust-cache@v2 + with: + # Don't cache ./target, as it takes tons of space, use sccache instead. + cache-targets: false + # We set a shared key, as our cache is reusable between jobs + shared-key: rust-cargo + - name: Setup Rust compilation cache uses: mozilla-actions/sccache-action@v0.0.3 with: @@ -258,6 +264,20 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Setup Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: stable + target: wasm32-unknown-unknown + + - name: Setup Cargo cache + uses: Swatinem/rust-cache@v2 + with: + # Don't cache ./target, as it takes tons of space, use sccache instead. + cache-targets: false + # We set a shared key, as our cache is reusable between jobs + shared-key: rust-cargo + - name: Setup Rust compilation cache uses: mozilla-actions/sccache-action@v0.0.3 with: @@ -389,6 +409,20 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Setup Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: stable + target: wasm32-unknown-unknown + + - name: Setup Cargo cache + uses: Swatinem/rust-cache@v2 + with: + # Don't cache ./target, as it takes tons of space, use sccache instead. + cache-targets: false + # We set a shared key, as our cache is reusable between jobs + shared-key: rust-cargo + - name: Setup Rust compilation cache uses: mozilla-actions/sccache-action@v0.0.3 with: @@ -583,6 +617,20 @@ jobs: - name: Check out repo uses: actions/checkout@v3 + - name: Setup Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: stable + target: wasm32-unknown-unknown + + - name: Setup Cargo cache + uses: Swatinem/rust-cache@v2 + with: + # Don't cache ./target, as it takes tons of space, use sccache instead. + cache-targets: false + # We set a shared key, as our cache is reusable between jobs + shared-key: rust-cargo + - name: Login to DockerHub uses: docker/login-action@v2 with: @@ -697,161 +745,6 @@ jobs: ACTIONS_RUNTIME_TOKEN=${{ env.ACTIONS_RUNTIME_TOKEN }} CARGO_BUILD_PROFILE=release - # TODO: Implement yarn and rust cache - build-rs-drive-nodejs: - name: Build Drive Node.JS binding - strategy: - fail-fast: false - matrix: - include: - - os: ubuntu-22.04 - arch: x86_64 - node_arch: x64 - compiler: gnu - platform: unknown-linux - - os: ubuntu-22.04 - arch: x86_64 - node_arch: x64 - compiler: musl - platform: unknown-linux - - os: ubuntu-22.04 - arch: aarch64 - node_arch: arm64 - compiler: gnu - platform: unknown-linux - - os: ubuntu-22.04 - arch: aarch64 - node_arch: arm64 - compiler: musl - platform: unknown-linux - - os: macos-11 - arch: x86_64 - platform: apple-darwin - - os: macos-11 - arch: aarch64 - node_arch: arm64 - platform: apple-darwin - - runs-on: ${{ matrix.os }} - env: - SCCACHE_GHA_ENABLED: "true" - RUSTC_WRAPPER: "sccache" - CARGO_INCREMENTAL: "false" - steps: - - name: Check out repo - uses: actions/checkout@v3 - - - name: Login to DockerHub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Setup Node.JS - uses: actions/setup-node@v3 - with: - node-version: "16" - - - name: Enable corepack - run: corepack enable - - - name: Disable NPM audit - run: npm config set audit false - - - name: Enable Yarn unplugged modules cache - uses: actions/cache@v3 - with: - path: ".yarn/unplugged" - key: ${{ runner.os }}-yarn-unplugged-${{ hashFiles('yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn-unplugged- - - - name: Install dependencies - run: yarn install - - - name: Set target name - uses: actions/github-script@v6 - id: set-target - with: - script: | - let target = '${{ matrix.arch }}-${{ matrix.platform }}'; - - if ('${{ matrix.compiler }}') { - target += '-${{ matrix.compiler }}'; - } - - core.info(`Set target ${target}`); - - return target; - result-encoding: string - - - name: Setup Rust - if: ${{ runner.os == 'macOS' }} - uses: ./.github/actions/rust - with: - toolchain: stable - target: ${{ steps.set-target.outputs.result }} - - - name: Setup Cargo cache - uses: Swatinem/rust-cache@v2 - with: - # Don't cache ./target, as it takes tons of space, use sccache instead. - cache-targets: false - # We set a shared key, as our cache is reusable between jobs - shared-key: rust-cargo - - - name: Setup Rust compilation cache - if: ${{ runner.os == 'macOS' }} - uses: mozilla-actions/sccache-action@v0.0.3 - with: - version: "v0.4.1" - - - name: Set LIBC argument - uses: actions/github-script@v6 - id: set-libc-arg - with: - script: | - let env = ''; - - if (${{ matrix.compiler == 'musl' }}) { - env = '-l musl' - } - - core.info(`Set LIBC env to "${env}"`); - - return env; - result-encoding: string - - - name: Build for Linux (x86) - if: ${{ runner.os == 'Linux' && matrix.arch == 'x86_64' }} - uses: docker://messense/rust-musl-cross:x86_64-musl - with: - workdir: /github/workspace/ - entrypoint: packages/rs-drive-nodejs/docker/build.sh - args: -a ${{ matrix.node_arch }} -t ${{ steps.set-target.outputs.result }} ${{ steps.set-libc-arg.outputs.result }} - - - name: Build for Linux (aarch64) - if: ${{ runner.os == 'Linux' && matrix.arch == 'aarch64' }} - uses: docker://messense/rust-musl-cross:aarch64-musl - with: - workdir: /github/workspace/ - entrypoint: packages/rs-drive-nodejs/docker/build.sh - args: -a ${{ matrix.node_arch }} -t ${{ steps.set-target.outputs.result }} ${{ steps.set-libc-arg.outputs.result }} - - - name: Build for Mac OS - if: ${{ runner.os == 'macOS' }} - run: yarn workspace @dashevo/rs-drive run build - env: - ARCH: ${{ matrix.node_arch }} # Overwrite current arch with target one - CARGO_BUILD_TARGET: ${{ steps.set-target.outputs.result }} - CARGO_BUILD_PROFILE: release - - - name: Upload prebuild artifacts - uses: actions/upload-artifact@v3 - with: - name: prebuilds - path: packages/rs-drive-nodejs/prebuilds/ - release-dashmate: name: Release Dashmate packages runs-on: ${{ matrix.os }} @@ -965,6 +858,11 @@ jobs: name: dashmate path: packages/dashmate/dist/** + - name: Notarize MacOS Release Build + if: runner.os == 'macOS' + run: | + find packages/dashmate/dist/ -name '*.pkg' -exec sh -c 'xcrun notarytool submit "{}" --apple-id "${{ secrets.MACOS_APPLE_ID }}" --team-id "${{ secrets.MACOS_TEAM_ID }}" --password "${{ secrets.MACOS_NOTARIZING_PASSWORD }}" --wait;' \; + - name: Upload artifacts to release uses: softprops/action-gh-release@v0.1.15 if: github.event_name == 'release' diff --git a/.pnp.cjs b/.pnp.cjs index b3fc2f70d4e..94faef0fec4 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -2270,6 +2270,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@balena/dockerignore", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/@balena-dockerignore-npm-1.0.2-1128560642-0d39f8fbcf.zip/node_modules/@balena/dockerignore/",\ + "packageDependencies": [\ + ["@balena/dockerignore", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@colors/colors", [\ ["npm:1.5.0", {\ "packageLocation": "./.yarn/cache/@colors-colors-npm-1.5.0-875af3a8b4-d64d5260be.zip/node_modules/@colors/colors/",\ @@ -2567,11 +2576,11 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@dashevo/docker-compose", [\ - ["npm:0.24.1", {\ - "packageLocation": "./.yarn/cache/@dashevo-docker-compose-npm-0.24.1-e4dc7f3c5e-7792e09b5d.zip/node_modules/@dashevo/docker-compose/",\ + ["npm:0.24.2", {\ + "packageLocation": "./.yarn/cache/@dashevo-docker-compose-npm-0.24.2-73c929613f-f8803c8ab5.zip/node_modules/@dashevo/docker-compose/",\ "packageDependencies": [\ - ["@dashevo/docker-compose", "npm:0.24.1"],\ - ["yaml", "npm:1.10.2"]\ + ["@dashevo/docker-compose", "npm:0.24.2"],\ + ["yaml", "npm:2.2.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -2582,7 +2591,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["@dashevo/dp-services-ctl", "https://github.com/dashevo/js-dp-services-ctl.git#commit=3976076b0018c5b4632ceda4c752fc597f27a640"],\ ["@dashevo/dashd-rpc", "npm:2.4.2"],\ - ["dockerode", "npm:3.3.1"],\ + ["dockerode", "npm:3.3.5"],\ ["jayson", "npm:2.1.2"],\ ["lodash", "npm:4.17.21"],\ ["mongodb", "virtual:a39316770159f0a8e3f370c1c3a56eb433794f8d2beaf0837a3349497b1cf2188cea77a97e39f187d7b9f59864fa6d9d57b4c49a9871c8de6a876e77cba350c7#npm:3.7.3"]\ @@ -2739,10 +2748,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@dashevo/oclif", [\ - ["npm:1.0.2", {\ - "packageLocation": "./.yarn/cache/@dashevo-oclif-npm-1.0.2-838469dc60-b421acd414.zip/node_modules/@dashevo/oclif/",\ + ["npm:1.0.4", {\ + "packageLocation": "./.yarn/cache/@dashevo-oclif-npm-1.0.4-12e05d2d04-239edbbb30.zip/node_modules/@dashevo/oclif/",\ "packageDependencies": [\ - ["@dashevo/oclif", "npm:1.0.2"],\ + ["@dashevo/oclif", "npm:1.0.4"],\ ["@oclif/core", "npm:1.22.0"],\ ["@oclif/plugin-help", "npm:5.1.20"],\ ["@oclif/plugin-not-found", "npm:2.3.11"],\ @@ -2758,8 +2767,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["normalize-package-data", "npm:3.0.3"],\ ["semver", "npm:7.3.8"],\ ["tslib", "npm:2.4.1"],\ - ["yeoman-environment", "virtual:838469dc6055e1f2cba01fd72be9fbca6706b01748bd0e84ae73ecebec5159ccf815131e67deb9faaa4a6ec339ab1a43a8cfcd7805ad0d0047211e293bb5941b#npm:3.13.0"],\ - ["yeoman-generator", "virtual:838469dc6055e1f2cba01fd72be9fbca6706b01748bd0e84ae73ecebec5159ccf815131e67deb9faaa4a6ec339ab1a43a8cfcd7805ad0d0047211e293bb5941b#npm:5.6.1"],\ + ["yeoman-environment", "virtual:12e05d2d0406d57afb53e47af3d99313314e8d57b677797e1248b1a39b8acad186368c8deb20c4b097a9b7de3c4a502dbdf7b3d6ee54bdb9d04559fa41a92253#npm:3.13.0"],\ + ["yeoman-generator", "virtual:12e05d2d0406d57afb53e47af3d99313314e8d57b677797e1248b1a39b8acad186368c8deb20c4b097a9b7de3c4a502dbdf7b3d6ee54bdb9d04559fa41a92253#npm:5.6.1"],\ ["yosay", "npm:2.0.2"]\ ],\ "linkType": "HARD"\ @@ -7944,12 +7953,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["cpu-features", [\ - ["npm:0.0.2", {\ - "packageLocation": "./.yarn/unplugged/cpu-features-npm-0.0.2-b27e7998ec/node_modules/cpu-features/",\ + ["https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.2.1.tgz", {\ + "packageLocation": "./.yarn/cache/cpu-features-https-6daecc18e1-ee452163db.zip/node_modules/cpu-features/",\ "packageDependencies": [\ - ["cpu-features", "npm:0.0.2"],\ - ["nan", "npm:2.15.0"],\ - ["node-gyp", "npm:8.4.0"]\ + ["cpu-features", "https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.2.1.tgz"]\ ],\ "linkType": "HARD"\ }]\ @@ -8167,12 +8174,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@dashevo/dashcore-lib", "npm:0.20.3"],\ ["@dashevo/dashd-rpc", "npm:18.2.0"],\ ["@dashevo/dashpay-contract", "workspace:packages/dashpay-contract"],\ - ["@dashevo/docker-compose", "npm:0.24.1"],\ + ["@dashevo/docker-compose", "npm:0.24.2"],\ ["@dashevo/dpns-contract", "workspace:packages/dpns-contract"],\ ["@dashevo/dpp", "workspace:packages/js-dpp"],\ ["@dashevo/feature-flags-contract", "workspace:packages/feature-flags-contract"],\ ["@dashevo/masternode-reward-shares-contract", "workspace:packages/masternode-reward-shares-contract"],\ - ["@dashevo/oclif", "npm:1.0.2"],\ + ["@dashevo/oclif", "npm:1.0.4"],\ ["@dashevo/wallet-lib", "workspace:packages/wallet-lib"],\ ["@dashevo/withdrawals-contract", "workspace:packages/withdrawals-contract"],\ ["@oclif/core", "npm:1.26.2"],\ @@ -8187,7 +8194,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["cron", "npm:2.1.0"],\ ["dash", "workspace:packages/js-dash-sdk"],\ ["dirty-chai", "virtual:12a596dc9572e25ce715d3736dc74b317c5ca5cfb3b4f67864b1e76b3a401006f84d381aaf975bb5b4da9cafac5125e6869fc78d5202f4c95780c81479112f32#npm:2.0.1"],\ - ["dockerode", "npm:3.3.1"],\ + ["dockerode", "npm:3.3.5"],\ ["dot", "npm:1.1.3"],\ ["dotenv", "npm:8.6.0"],\ ["enquirer", "https://github.com/dashpay/enquirer.git#commit=86aaef0b1c82dfaa3436775e6b37de310eeb94f5"],\ @@ -8724,24 +8731,25 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["docker-modem", [\ - ["npm:3.0.3", {\ - "packageLocation": "./.yarn/cache/docker-modem-npm-3.0.3-5736be136e-4ad495d17a.zip/node_modules/docker-modem/",\ + ["npm:3.0.8", {\ + "packageLocation": "./.yarn/cache/docker-modem-npm-3.0.8-9923fc0db1-e3675c9b1a.zip/node_modules/docker-modem/",\ "packageDependencies": [\ - ["docker-modem", "npm:3.0.3"],\ + ["docker-modem", "npm:3.0.8"],\ ["debug", "virtual:ac3d8e680759ce54399273724d44e041d6c9b73454d191d411a8c44bb27e22f02aaf6ed9d3ad0ac1c298eac4833cff369c9c7b84c573016112c4f84be2cd8543#npm:4.3.4"],\ ["readable-stream", "npm:3.6.0"],\ ["split-ca", "npm:1.0.1"],\ - ["ssh2", "npm:1.5.0"]\ + ["ssh2", "npm:1.11.0"]\ ],\ "linkType": "HARD"\ }]\ ]],\ ["dockerode", [\ - ["npm:3.3.1", {\ - "packageLocation": "./.yarn/cache/dockerode-npm-3.3.1-77efbe3384-930162ae2d.zip/node_modules/dockerode/",\ + ["npm:3.3.5", {\ + "packageLocation": "./.yarn/cache/dockerode-npm-3.3.5-2ec31bdac6-7f6650422b.zip/node_modules/dockerode/",\ "packageDependencies": [\ - ["dockerode", "npm:3.3.1"],\ - ["docker-modem", "npm:3.0.3"],\ + ["dockerode", "npm:3.3.5"],\ + ["@balena/dockerignore", "npm:1.0.2"],\ + ["docker-modem", "npm:3.0.8"],\ ["tar-fs", "npm:2.0.1"]\ ],\ "linkType": "HARD"\ @@ -13277,10 +13285,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:29cd966a3bf4a1d402f9cda58cb039a316be3657f4e6b8ac58634c33284e2ea8a4372e13f710cd2a2d785a107d9d65ea8ec3877ffec3f4046f107c19d1df875e#npm:9.4.0", {\ - "packageLocation": "./.yarn/__virtual__/mem-fs-editor-virtual-1238782479/0/cache/mem-fs-editor-npm-9.4.0-97c608fb01-427b71d59a.zip/node_modules/mem-fs-editor/",\ + ["virtual:315d4b6fa1eb918f97df32e9960138831950e2b5bcafb64239fe48c23801b53c29942afdcac3132a4944de8d35e3a216612976ea45841a2969048e6d377bfe81#npm:9.4.0", {\ + "packageLocation": "./.yarn/__virtual__/mem-fs-editor-virtual-5ce38edc7b/0/cache/mem-fs-editor-npm-9.4.0-97c608fb01-427b71d59a.zip/node_modules/mem-fs-editor/",\ "packageDependencies": [\ - ["mem-fs-editor", "virtual:29cd966a3bf4a1d402f9cda58cb039a316be3657f4e6b8ac58634c33284e2ea8a4372e13f710cd2a2d785a107d9d65ea8ec3877ffec3f4046f107c19d1df875e#npm:9.4.0"],\ + ["mem-fs-editor", "virtual:315d4b6fa1eb918f97df32e9960138831950e2b5bcafb64239fe48c23801b53c29942afdcac3132a4944de8d35e3a216612976ea45841a2969048e6d377bfe81#npm:9.4.0"],\ ["@types/mem-fs", null],\ ["binaryextensions", "npm:4.18.0"],\ ["commondir", "npm:1.0.1"],\ @@ -13881,10 +13889,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["npm:2.15.0", {\ - "packageLocation": "./.yarn/unplugged/nan-npm-2.15.0-505c98ef4d/node_modules/nan/",\ + ["npm:2.17.0", {\ + "packageLocation": "./.yarn/unplugged/nan-npm-2.17.0-bf36a21d6f/node_modules/nan/",\ "packageDependencies": [\ - ["nan", "npm:2.15.0"],\ + ["nan", "npm:2.17.0"],\ ["node-gyp", "npm:8.4.0"]\ ],\ "linkType": "HARD"\ @@ -16796,14 +16804,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["ssh2", [\ - ["npm:1.5.0", {\ - "packageLocation": "./.yarn/unplugged/ssh2-npm-1.5.0-8a0e3032ea/node_modules/ssh2/",\ + ["npm:1.11.0", {\ + "packageLocation": "./.yarn/unplugged/ssh2-npm-1.11.0-ba52882820/node_modules/ssh2/",\ "packageDependencies": [\ - ["ssh2", "npm:1.5.0"],\ + ["ssh2", "npm:1.11.0"],\ ["asn1", "npm:0.2.6"],\ ["bcrypt-pbkdf", "npm:1.0.2"],\ - ["cpu-features", "npm:0.0.2"],\ - ["nan", "npm:2.15.0"]\ + ["cpu-features", "https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.2.1.tgz"],\ + ["nan", "npm:2.17.0"]\ ],\ "linkType": "HARD"\ }]\ @@ -19463,10 +19471,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["yaml", [\ - ["npm:1.10.2", {\ - "packageLocation": "./.yarn/cache/yaml-npm-1.10.2-0e780aebdf-ce4ada136e.zip/node_modules/yaml/",\ + ["npm:2.2.2", {\ + "packageLocation": "./.yarn/cache/yaml-npm-2.2.2-6e3cddb343-d90c235e09.zip/node_modules/yaml/",\ "packageDependencies": [\ - ["yaml", "npm:1.10.2"]\ + ["yaml", "npm:2.2.2"]\ ],\ "linkType": "HARD"\ }]\ @@ -19583,10 +19591,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:838469dc6055e1f2cba01fd72be9fbca6706b01748bd0e84ae73ecebec5159ccf815131e67deb9faaa4a6ec339ab1a43a8cfcd7805ad0d0047211e293bb5941b#npm:3.13.0", {\ - "packageLocation": "./.yarn/__virtual__/yeoman-environment-virtual-29cd966a3b/0/cache/yeoman-environment-npm-3.13.0-f7ad653f8e-2d622d18d2.zip/node_modules/yeoman-environment/",\ + ["virtual:12e05d2d0406d57afb53e47af3d99313314e8d57b677797e1248b1a39b8acad186368c8deb20c4b097a9b7de3c4a502dbdf7b3d6ee54bdb9d04559fa41a92253#npm:3.13.0", {\ + "packageLocation": "./.yarn/__virtual__/yeoman-environment-virtual-315d4b6fa1/0/cache/yeoman-environment-npm-3.13.0-f7ad653f8e-2d622d18d2.zip/node_modules/yeoman-environment/",\ "packageDependencies": [\ - ["yeoman-environment", "virtual:838469dc6055e1f2cba01fd72be9fbca6706b01748bd0e84ae73ecebec5159ccf815131e67deb9faaa4a6ec339ab1a43a8cfcd7805ad0d0047211e293bb5941b#npm:3.13.0"],\ + ["yeoman-environment", "virtual:12e05d2d0406d57afb53e47af3d99313314e8d57b677797e1248b1a39b8acad186368c8deb20c4b097a9b7de3c4a502dbdf7b3d6ee54bdb9d04559fa41a92253#npm:3.13.0"],\ ["@npmcli/arborist", "npm:4.3.1"],\ ["@types/mem-fs", null],\ ["@types/mem-fs-editor", null],\ @@ -19611,7 +19619,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["lodash", "npm:4.17.21"],\ ["log-symbols", "npm:4.1.0"],\ ["mem-fs", "npm:2.2.1"],\ - ["mem-fs-editor", "virtual:29cd966a3bf4a1d402f9cda58cb039a316be3657f4e6b8ac58634c33284e2ea8a4372e13f710cd2a2d785a107d9d65ea8ec3877ffec3f4046f107c19d1df875e#npm:9.4.0"],\ + ["mem-fs-editor", "virtual:315d4b6fa1eb918f97df32e9960138831950e2b5bcafb64239fe48c23801b53c29942afdcac3132a4944de8d35e3a216612976ea45841a2969048e6d377bfe81#npm:9.4.0"],\ ["minimatch", "npm:3.1.2"],\ ["npmlog", "npm:5.0.1"],\ ["p-queue", "npm:6.6.2"],\ @@ -19641,10 +19649,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "SOFT"\ }],\ - ["virtual:838469dc6055e1f2cba01fd72be9fbca6706b01748bd0e84ae73ecebec5159ccf815131e67deb9faaa4a6ec339ab1a43a8cfcd7805ad0d0047211e293bb5941b#npm:5.6.1", {\ - "packageLocation": "./.yarn/__virtual__/yeoman-generator-virtual-4147e1a57f/0/cache/yeoman-generator-npm-5.6.1-a49b7654c4-ef036210b6.zip/node_modules/yeoman-generator/",\ + ["virtual:12e05d2d0406d57afb53e47af3d99313314e8d57b677797e1248b1a39b8acad186368c8deb20c4b097a9b7de3c4a502dbdf7b3d6ee54bdb9d04559fa41a92253#npm:5.6.1", {\ + "packageLocation": "./.yarn/__virtual__/yeoman-generator-virtual-b452ec6b92/0/cache/yeoman-generator-npm-5.6.1-a49b7654c4-ef036210b6.zip/node_modules/yeoman-generator/",\ "packageDependencies": [\ - ["yeoman-generator", "virtual:838469dc6055e1f2cba01fd72be9fbca6706b01748bd0e84ae73ecebec5159ccf815131e67deb9faaa4a6ec339ab1a43a8cfcd7805ad0d0047211e293bb5941b#npm:5.6.1"],\ + ["yeoman-generator", "virtual:12e05d2d0406d57afb53e47af3d99313314e8d57b677797e1248b1a39b8acad186368c8deb20c4b097a9b7de3c4a502dbdf7b3d6ee54bdb9d04559fa41a92253#npm:5.6.1"],\ ["@types/yeoman-environment", null],\ ["chalk", "npm:4.1.2"],\ ["dargs", "npm:7.0.0"],\ @@ -19659,7 +19667,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["shelljs", "npm:0.8.5"],\ ["sort-keys", "npm:4.2.0"],\ ["text-table", "npm:0.2.0"],\ - ["yeoman-environment", "virtual:838469dc6055e1f2cba01fd72be9fbca6706b01748bd0e84ae73ecebec5159ccf815131e67deb9faaa4a6ec339ab1a43a8cfcd7805ad0d0047211e293bb5941b#npm:3.13.0"]\ + ["yeoman-environment", "virtual:12e05d2d0406d57afb53e47af3d99313314e8d57b677797e1248b1a39b8acad186368c8deb20c4b097a9b7de3c4a502dbdf7b3d6ee54bdb9d04559fa41a92253#npm:3.13.0"]\ ],\ "packagePeers": [\ "@types/yeoman-environment",\ diff --git a/.yarn/cache/@balena-dockerignore-npm-1.0.2-1128560642-0d39f8fbcf.zip b/.yarn/cache/@balena-dockerignore-npm-1.0.2-1128560642-0d39f8fbcf.zip new file mode 100644 index 00000000000..8d0f055a928 Binary files /dev/null and b/.yarn/cache/@balena-dockerignore-npm-1.0.2-1128560642-0d39f8fbcf.zip differ diff --git a/.yarn/cache/@dashevo-docker-compose-npm-0.24.1-e4dc7f3c5e-7792e09b5d.zip b/.yarn/cache/@dashevo-docker-compose-npm-0.24.2-73c929613f-f8803c8ab5.zip similarity index 90% rename from .yarn/cache/@dashevo-docker-compose-npm-0.24.1-e4dc7f3c5e-7792e09b5d.zip rename to .yarn/cache/@dashevo-docker-compose-npm-0.24.2-73c929613f-f8803c8ab5.zip index 2637e740d02..fbf78f97406 100644 Binary files a/.yarn/cache/@dashevo-docker-compose-npm-0.24.1-e4dc7f3c5e-7792e09b5d.zip and b/.yarn/cache/@dashevo-docker-compose-npm-0.24.2-73c929613f-f8803c8ab5.zip differ diff --git a/.yarn/cache/@dashevo-oclif-npm-1.0.2-838469dc60-b421acd414.zip b/.yarn/cache/@dashevo-oclif-npm-1.0.2-838469dc60-b421acd414.zip deleted file mode 100644 index bbe43088d5e..00000000000 Binary files a/.yarn/cache/@dashevo-oclif-npm-1.0.2-838469dc60-b421acd414.zip and /dev/null differ diff --git a/.yarn/cache/@dashevo-oclif-npm-1.0.4-12e05d2d04-239edbbb30.zip b/.yarn/cache/@dashevo-oclif-npm-1.0.4-12e05d2d04-239edbbb30.zip new file mode 100644 index 00000000000..b8f8b98608f Binary files /dev/null and b/.yarn/cache/@dashevo-oclif-npm-1.0.4-12e05d2d04-239edbbb30.zip differ diff --git a/.yarn/cache/cpu-features-https-6daecc18e1-ee452163db.zip b/.yarn/cache/cpu-features-https-6daecc18e1-ee452163db.zip new file mode 100644 index 00000000000..f2c8d91f596 Binary files /dev/null and b/.yarn/cache/cpu-features-https-6daecc18e1-ee452163db.zip differ diff --git a/.yarn/cache/cpu-features-npm-0.0.2-b27e7998ec-15177f9a2d.zip b/.yarn/cache/cpu-features-npm-0.0.2-b27e7998ec-15177f9a2d.zip deleted file mode 100644 index 3c7c9bab7a2..00000000000 Binary files a/.yarn/cache/cpu-features-npm-0.0.2-b27e7998ec-15177f9a2d.zip and /dev/null differ diff --git a/.yarn/cache/docker-modem-npm-3.0.3-5736be136e-4ad495d17a.zip b/.yarn/cache/docker-modem-npm-3.0.3-5736be136e-4ad495d17a.zip deleted file mode 100644 index 3f2b3b898a0..00000000000 Binary files a/.yarn/cache/docker-modem-npm-3.0.3-5736be136e-4ad495d17a.zip and /dev/null differ diff --git a/.yarn/cache/docker-modem-npm-3.0.8-9923fc0db1-e3675c9b1a.zip b/.yarn/cache/docker-modem-npm-3.0.8-9923fc0db1-e3675c9b1a.zip new file mode 100644 index 00000000000..94517fc8136 Binary files /dev/null and b/.yarn/cache/docker-modem-npm-3.0.8-9923fc0db1-e3675c9b1a.zip differ diff --git a/.yarn/cache/dockerode-npm-3.3.1-77efbe3384-930162ae2d.zip b/.yarn/cache/dockerode-npm-3.3.1-77efbe3384-930162ae2d.zip deleted file mode 100644 index 4459b1b6be1..00000000000 Binary files a/.yarn/cache/dockerode-npm-3.3.1-77efbe3384-930162ae2d.zip and /dev/null differ diff --git a/.yarn/cache/dockerode-npm-3.3.5-2ec31bdac6-7f6650422b.zip b/.yarn/cache/dockerode-npm-3.3.5-2ec31bdac6-7f6650422b.zip new file mode 100644 index 00000000000..66177b3419f Binary files /dev/null and b/.yarn/cache/dockerode-npm-3.3.5-2ec31bdac6-7f6650422b.zip differ diff --git a/.yarn/cache/nan-npm-2.15.0-505c98ef4d-33e1bb4dfc.zip b/.yarn/cache/nan-npm-2.17.0-bf36a21d6f-ec609aeaf7.zip similarity index 60% rename from .yarn/cache/nan-npm-2.15.0-505c98ef4d-33e1bb4dfc.zip rename to .yarn/cache/nan-npm-2.17.0-bf36a21d6f-ec609aeaf7.zip index 51c58f139b1..55727fc946e 100644 Binary files a/.yarn/cache/nan-npm-2.15.0-505c98ef4d-33e1bb4dfc.zip and b/.yarn/cache/nan-npm-2.17.0-bf36a21d6f-ec609aeaf7.zip differ diff --git a/.yarn/cache/ssh2-npm-1.5.0-8a0e3032ea-6a2252c12d.zip b/.yarn/cache/ssh2-npm-1.11.0-ba52882820-e40cb9f171.zip similarity index 78% rename from .yarn/cache/ssh2-npm-1.5.0-8a0e3032ea-6a2252c12d.zip rename to .yarn/cache/ssh2-npm-1.11.0-ba52882820-e40cb9f171.zip index 1a111c54747..f5fba1aeb10 100644 Binary files a/.yarn/cache/ssh2-npm-1.5.0-8a0e3032ea-6a2252c12d.zip and b/.yarn/cache/ssh2-npm-1.11.0-ba52882820-e40cb9f171.zip differ diff --git a/.yarn/cache/yaml-npm-1.10.2-0e780aebdf-ce4ada136e.zip b/.yarn/cache/yaml-npm-1.10.2-0e780aebdf-ce4ada136e.zip deleted file mode 100644 index bb28507cd0f..00000000000 Binary files a/.yarn/cache/yaml-npm-1.10.2-0e780aebdf-ce4ada136e.zip and /dev/null differ diff --git a/.yarn/cache/yaml-npm-2.2.2-6e3cddb343-d90c235e09.zip b/.yarn/cache/yaml-npm-2.2.2-6e3cddb343-d90c235e09.zip new file mode 100644 index 00000000000..ec3b5dcd460 Binary files /dev/null and b/.yarn/cache/yaml-npm-2.2.2-6e3cddb343-d90c235e09.zip differ diff --git a/CHANGELOG.md b/CHANGELOG.md index 77f0af4501d..773c652acf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,141 @@ +## [0.24.0-dev.27](https://github.com/dashpay/platform/compare/v0.24.0-dev.26...v0.24.0-dev.27) (2023-04-28) + + +### ⚠ BREAKING CHANGES + +* The --platfrom-only flag is renamed to --platform (#991) + +### Bug Fixes + +* **dashmate:** multiple issues in the reset command ([#991](https://github.com/dashpay/platform/issues/991)) + +## [0.24.0-dev.26](https://github.com/dashpay/platform/compare/v0.24.0-dev.25...v0.24.0-dev.26) (2023-04-27) + + +### ⚠ BREAKING CHANGES + +* Previous state won't be valid due to changes in the sync identities logic + +### Bug Fixes + +* **drive:** non-unique masternode voting keys ([#986](https://github.com/dashpay/platform/issues/986)) + + +### Build System + +* **dashmate:** better versioning ([#988](https://github.com/dashpay/platform/issues/988)) +* **dashmate:** prepare MacOs build for notarization ([#985](https://github.com/dashpay/platform/issues/985)) + +## [0.24.0-dev.25](https://github.com/dashpay/platform/compare/v0.24.0-dev.24...v0.24.0-dev.25) (2023-04-26) + + +### Features + +* **dashamte:** better ZeroSSL error messages ([#950](https://github.com/dashpay/platform/issues/950)) +* **dashmate:** set random core rpc username and password on setup ([#973](https://github.com/dashpay/platform/issues/973)) +* **dashmate:** verbose `connect ENOENT /var/run/docker.sock` error ([#951](https://github.com/dashpay/platform/issues/951)) + + +### Bug Fixes + +* **dashmate:** ability to work with non-default docker socket path ([#967](https://github.com/dashpay/platform/issues/967)) +* **dashmate:** empty masternode status while syncing ([#970](https://github.com/dashpay/platform/issues/970)) +* **dashmate:** form accepts invalid BLS key ([#961](https://github.com/dashpay/platform/issues/961)) +* **dashmate:** invalid mn register command in output of dashmate setup ([#959](https://github.com/dashpay/platform/issues/959)) +* **dashmate:** reward shares can be negative during HP masternode registration ([#960](https://github.com/dashpay/platform/issues/960)) +* **dashmate:** select number of masternodes during local setup freezes ([#957](https://github.com/dashpay/platform/issues/957)) +* **dashmate:** yaml package security vulnerability ([#975](https://github.com/dashpay/platform/issues/975)) +* **dashmate:** already configured preset is ignored ([#974](https://github.com/dashpay/platform/issues/974)) +* **test-suite:** expects identities for invalid mns ([#968](https://github.com/dashpay/platform/issues/968)) + + +### Build System + +* **dashmate:** remove MacOs malicious software warning ([#977](https://github.com/dashpay/platform/issues/977)) + +## [0.24.0-dev.24](https://github.com/dashpay/platform/compare/v0.24.0-dev.23...v0.24.0-dev.24) (2023-04-24) + + +### ⚠ BREAKING CHANGES + +* Previous state might be invalid since to new sync mn identities logic (#965) + +### Features + +* **wasm-dpp:** state_transition_fee_validator binding and tests ([#874](https://github.com/dashpay/platform/issues/874)) + + +### Bug Fixes + +* **dashamte:** wrong envoy config path on windows ([#949](https://github.com/dashpay/platform/issues/949)) +* **drive:** updating a masternode identity with invalid entry from SML ([#965](https://github.com/dashpay/platform/issues/965)) + +## [0.24.0-dev.23](https://github.com/dashpay/platform/compare/v0.24.0-dev.22...v0.24.0-dev.23) (2023-04-20) + + +### Build System + +* **dashmate:** fix removing unnecessary packages + +## [0.24.0-dev.22](https://github.com/dashpay/platform/compare/v0.24.0-dev.21...v0.24.0-dev.22) (2023-04-20) + + +### Continuous Integration + +* remove drive node.js binding release + + +### Build System + +* **dashamte:** build arm64 deb file instead of armel ([#943](https://github.com/dashpay/platform/issues/943)) + +## [0.24.0-dev.21](https://github.com/dashpay/platform/compare/v0.24.0-dev.20...v0.24.0-dev.21) (2023-04-19) + + +### Features + +* **dashmate:** check system requirements before setup ([#935](https://github.com/dashpay/platform/issues/935)) + + +### Bug Fixes + +* **dashamte:** сan't find begoo/index with `yarn dashmate setup` ([#933](https://github.com/dashpay/platform/issues/933)) + + +### Miscellaneous Chores + +* **dashamte:** remove deprecation warning on start ([#925](https://github.com/dashpay/platform/issues/925)) + + +### Continuous Integration + +* fix release workflow + + +### Build System + +* **dashamte:** remove deb release docker dependencies ([#934](https://github.com/dashpay/platform/issues/934)) +* **dashmate:** build only linux tarballs ([#936](https://github.com/dashpay/platform/issues/936)) + + +## [0.24.0-dev.20](https://github.com/dashpay/platform/compare/v0.24.0-dev.19...v0.24.0-dev.20) (2023-04-18) + + +### ⚠ BREAKING CHANGES + +* Some wasm-dpp APIs are different to js-dpp ones. The only visible divergencies were addressed, but many others might've been left unnoticed (#848) + +### Features + +* **drive:** handle quorum rotation failure ([#858](https://github.com/dashpay/platform/issues/858)) +* wasm-dpp integration ([#848](https://github.com/dashpay/platform/issues/848)) + ## [0.24.0-dev.19](https://github.com/dashpay/platform/compare/v0.24.0-dev.18...v0.24.0-dev.19) (2023-04-17) +### Continuous Integration + +* test release workflow + ## [0.24.0-dev.18](https://github.com/dashpay/platform/compare/v0.24.0-dev.17...v0.24.0-dev.18) (2023-04-14) diff --git a/README.md b/README.md index 975132e0759..980b514e6a9 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,14 @@ this repository may be used on the following networks: - Install prerequisites: - [node.js](https://nodejs.org/) v16 - [docker](https://docs.docker.com/get-docker/) v20.10+ + - [rust](https://www.rust-lang.org/tools/install) v1.67+ + - [wasm-bingen toolchain](https://rustwasm.github.io/wasm-bindgen/): + - **IMPORTANT (OSX only)**: built-in `llvm` on OSX does not work, needs to be installed from brew: + - `brew install llvm` + - LLVM installed from brew is keg only, and path to it must be provided in the profile file, e.g.`echo 'export PATH="/opt/homebrew/opt/llvm/bin:$PATH"' >> ~/.zshrc` + - `cargo install wasm-bindgen-cli` + - _Depending on system, additional packages may need to be installed as a prerequisite for wasm-bindgen-cli. If anything is missing, installation will error and prompt what packages are missing (i.e. clang, llvm, libssl-dev)_ + - `rustup target add wasm32-unknown-unknown` - Run `corepack enable` to enable [corepack](https://nodejs.org/dist/latest/docs/api/corepack.html) and install yarn - Run `yarn setup` to install dependencies and configure and build all packages - Run `yarn start` to start the local dev environment built from the sources diff --git a/package.json b/package.json index ae876ab1946..b8b8ecc0390 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", @@ -75,7 +75,8 @@ "qs": "^6.7.3", "engine.io": "^6.2.1", "ua-parser-js": "^1.0.33", - "dns-packet": "^5.4.0" + "dns-packet": "^5.4.0", + "cpu-features": "https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.2.1.tgz" }, "dependencies": { "node-gyp": "^9.3.1" diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index 363ca10c0ac..70a43f6d58b 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index 7a43dd72c4b..84b540a692e 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index 6c0009efc77..fd772f98c62 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index c6a031bf083..b3c5c264379 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/docker-compose.platform.yml b/packages/dashmate/docker-compose.platform.yml index 0d844f6a6eb..4de61000427 100644 --- a/packages/dashmate/docker-compose.platform.yml +++ b/packages/dashmate/docker-compose.platform.yml @@ -4,8 +4,6 @@ services: drive_abci: image: ${PLATFORM_DRIVE_ABCI_DOCKER_IMAGE:?err} restart: unless-stopped - depends_on: - - core volumes: - drive_abci_data:/var/lib/dash/rs-drive-abci environment: @@ -51,7 +49,6 @@ services: restart: unless-stopped depends_on: - drive_tenderdash - - core environment: - API_JSON_RPC_PORT=3004 - API_GRPC_PORT=3005 @@ -74,8 +71,6 @@ services: dapi_tx_filter_stream: image: ${PLATFORM_DAPI_API_DOCKER_IMAGE:?err} restart: unless-stopped - depends_on: - - core environment: - TX_FILTER_STREAM_GRPC_PORT=3006 - DASHCORE_RPC_HOST=core diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index a806fc4890f..76acfcbe764 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", @@ -51,7 +51,7 @@ "@dashevo/dashcore-lib": "~0.20.3", "@dashevo/dashd-rpc": "^18.2.0", "@dashevo/dashpay-contract": "workspace:*", - "@dashevo/docker-compose": "^0.24.1", + "@dashevo/docker-compose": "^0.24.2", "@dashevo/dpns-contract": "workspace:*", "@dashevo/dpp": "workspace:*", "@dashevo/feature-flags-contract": "workspace:*", @@ -90,7 +90,7 @@ "table": "^5.4.6" }, "devDependencies": { - "@dashevo/oclif": "^1.0.2", + "@dashevo/oclif": "^1.0.4", "chai": "^4.3.4", "chai-as-promised": "^7.1.1", "dirty-chai": "^2.0.1", @@ -103,6 +103,9 @@ "sinon": "^11.1.2", "sinon-chai": "^3.7.0" }, + "resolutions": { + "cpu-features": "https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.2.1.tgz" + }, "files": [ "bin", "configs", @@ -123,9 +126,6 @@ "identifier": "org.dash.dashmate", "sign": "'Developer ID Installer: The Dash Foundation, Inc.'" }, - "deb": { - "dependencies": "docker-ce (>= 20.10.0) | docker.io (>= 20.10.0)" - }, "plugins": [ "@oclif/plugin-help" ], diff --git a/packages/dashmate/src/commands/group/reset.js b/packages/dashmate/src/commands/group/reset.js index be782b9c0b2..6ab225ea296 100644 --- a/packages/dashmate/src/commands/group/reset.js +++ b/packages/dashmate/src/commands/group/reset.js @@ -4,6 +4,7 @@ const { Flags } = require('@oclif/core'); const GroupBaseCommand = require('../../oclif/command/GroupBaseCommand'); const MuteOneLineError = require('../../oclif/errors/MuteOneLineError'); +const { PRESET_LOCAL } = require('../../constants'); class GroupResetCommand extends GroupBaseCommand { /** @@ -16,7 +17,6 @@ class GroupResetCommand extends GroupBaseCommand { * @param {configureTenderdashTask} configureTenderdashTask * @param {generateToAddressTask} generateToAddressTask * @param {ConfigFile} configFile - * @param {Object[]} systemConfigs * @return {Promise} */ async runWithDependencies( @@ -25,7 +25,7 @@ class GroupResetCommand extends GroupBaseCommand { verbose: isVerbose, hard: isHardReset, force: isForce, - 'platform-only': isPlatformOnlyReset, + platform: isPlatformOnlyReset, }, isSystemConfig, resetNodeTask, @@ -34,68 +34,41 @@ class GroupResetCommand extends GroupBaseCommand { configureTenderdashTask, generateToAddressTask, configFile, - systemConfigs, ) { const groupName = configGroup[0].get('group'); - if (isHardReset && !isSystemConfig(groupName)) { - throw new Error(`Cannot hard reset non-system config group "${configGroup[0].get('group')}"`); - } - - const baseConfig = systemConfigs.base; - - const amount = 100; - const tasks = new Listr( [ { title: `Reset ${groupName} nodes`, - task: () => new Listr(configGroup.map((config) => ({ - title: `Reset ${config.getName()} node`, - task: (ctx) => { - ctx.skipPlatformInitialization = true; - - config.set('platform.dpns', baseConfig.platform.dpns); - config.set('platform.dashpay', baseConfig.platform.dashpay); - config.set('platform.featureFlags', baseConfig.platform.featureFlags); - config.set('platform.masternodeRewardShares', baseConfig.platform.masternodeRewardShares); - - // TODO: Should stay the same - config.set('platform.drive.tenderdash.node.id', baseConfig.platform.drive.tenderdash.node.id); - config.set('platform.drive.tenderdash.node.key', baseConfig.platform.drive.tenderdash.node.key); - config.set('platform.drive.tenderdash.genesis', baseConfig.platform.drive.tenderdash.genesis); - - if (!ctx.isPlatformOnlyReset) { - config.set('core.masternode.operator.privateKey', baseConfig.core.masternode.operator.privateKey); - } + task: () => { + const resetTasks = configGroup.map((config) => ({ + title: `Reset ${config.getName()} node`, + task: () => resetNodeTask(config), + })); - return resetNodeTask(config); - }, - }))), + return new Listr(resetTasks); + }, }, { - enabled: (ctx) => ctx.isHardReset, + enabled: (ctx) => ctx.isHardReset && groupName === PRESET_LOCAL, title: 'Delete node configs', task: () => ( - configGroup.forEach((config) => configFile.removeConfig(config.getName())) + configGroup + .filter((config) => configFile.isConfigExists(config.getName())) + .forEach((config) => configFile.removeConfig(config.getName())) ), }, { - enabled: (ctx) => !ctx.isHardReset, - title: 'Configure Tenderdash nodes', - task: () => configureTenderdashTask(configGroup), - }, - { - enabled: (ctx) => !ctx.isHardReset && !ctx.isPlatformOnlyReset, + enabled: (ctx) => !ctx.isHardReset + && !ctx.isPlatformOnlyReset && groupName === PRESET_LOCAL, title: 'Configure Core nodes', task: () => configureCoreTask(configGroup), }, { - // in case we don't need to register masternodes - title: `Generate ${amount} dash to local wallet`, - enabled: (ctx) => !ctx.isHardReset, - skip: (ctx) => !!ctx.fundingPrivateKeyString, - task: () => generateToAddressTask(configGroup[0], amount), + enabled: (ctx) => !ctx.isHardReset && groupName === PRESET_LOCAL, + title: 'Configure Tenderdash nodes', + task: () => configureTenderdashTask(configGroup), }, ], { @@ -135,9 +108,9 @@ GroupResetCommand.flags = { description: 'reset even running node', default: false, }), - 'platform-only': Flags.boolean({ + platform: Flags.boolean({ char: 'p', - description: 'reset platform data only', + description: 'reset platform services and data only', default: false, }), }; diff --git a/packages/dashmate/src/commands/reset.js b/packages/dashmate/src/commands/reset.js index c8a6eb8e33b..ab12bdd2825 100644 --- a/packages/dashmate/src/commands/reset.js +++ b/packages/dashmate/src/commands/reset.js @@ -22,20 +22,12 @@ class ResetCommand extends ConfigBaseCommand { verbose: isVerbose, hard: isHardReset, force: isForce, - 'platform-only': isPlatformOnlyReset, + platform: isPlatformOnlyReset, }, isSystemConfig, config, resetNodeTask, ) { - if (isHardReset && !isSystemConfig(config.getName())) { - throw new Error(`Cannot hard reset non-system config "${config.getName()}"`); - } - - if (!config.get('platform.enable') && isPlatformOnlyReset) { - throw new Error('Cannot reset platform only if platform services are not enabled in config'); - } - const tasks = new Listr([ { title: `Reset ${config.getName()} node`, @@ -71,7 +63,7 @@ ResetCommand.flags = { ...ConfigBaseCommand.flags, hard: Flags.boolean({ char: 'h', description: 'reset config as well as data', default: false }), force: Flags.boolean({ char: 'f', description: 'skip running services check', default: false }), - 'platform-only': Flags.boolean({ char: 'p', description: 'reset platform data only', default: false }), + platform: Flags.boolean({ char: 'p', description: 'reset platform services and data only', default: false }), verbose: Flags.boolean({ char: 'v', description: 'use verbose mode for output', default: false }), }; diff --git a/packages/dashmate/src/commands/setup.js b/packages/dashmate/src/commands/setup.js index efa9331b24a..05303cf85ec 100644 --- a/packages/dashmate/src/commands/setup.js +++ b/packages/dashmate/src/commands/setup.js @@ -25,6 +25,7 @@ class SetupCommand extends BaseCommand { * @param {ConfigFile} configFile * @param {setupLocalPresetTask} setupLocalPresetTask * @param {setupRegularPresetTask} setupRegularPresetTask + * @param {DockerCompose} dockerCompose * @return {Promise} */ async runWithDependencies( @@ -40,12 +41,17 @@ class SetupCommand extends BaseCommand { configFile, setupLocalPresetTask, setupRegularPresetTask, + dockerCompose, ) { if (nodeCount !== null && (nodeCount < 3)) { throw new Error('node-count flag should be not less than 3'); } const tasks = new Listr([ + { + title: 'System requirements', + task: async () => dockerCompose.throwErrorIfNotInstalled(), + }, { title: 'Configuration preset', task: async (ctx, task) => { @@ -63,32 +69,30 @@ class SetupCommand extends BaseCommand { initial: PRESET_MAINNET, }, ]); + } - let isAlreadyConfigured; - if (ctx.preset === PRESET_LOCAL) { - isAlreadyConfigured = configFile.isGroupExists(ctx.preset); - } else { - const systemConfig = new Config(ctx.preset, systemConfigs[ctx.preset]); + let isAlreadyConfigured; + if (ctx.preset === PRESET_LOCAL) { + isAlreadyConfigured = configFile.isGroupExists(ctx.preset); + } else { + const systemConfig = new Config(ctx.preset, systemConfigs[ctx.preset]); - isAlreadyConfigured = !configFile.getConfig(ctx.preset).isEqual(systemConfig); - } + isAlreadyConfigured = !configFile.getConfig(ctx.preset).isEqual(systemConfig); + } - if (isAlreadyConfigured) { - // eslint-disable-next-line no-param-reassign - task.output = chalk`Preset {bold ${ctx.preset}} already configured. + if (isAlreadyConfigured) { + // eslint-disable-next-line no-param-reassign + task.output = chalk`Preset {bold ${ctx.preset}} already configured. To set up a node with this preset from scratch use {bold.cyanBright dashmate reset --config ${ctx.preset} --hard}. Previous data and configuration for this preset will be lost. If you want to keep the existing data and configuration, please use the {bold.cyanBright dashmate config create} command to create a new configuration for this preset.`; - throw new Error(`Preset ${ctx.preset} already configured`); - } else { - // eslint-disable-next-line no-param-reassign - - // eslint-disable-next-line no-param-reassign - task.output = ctx.preset; - } + throw new Error(`Preset ${ctx.preset} already configured`); + } else { + // eslint-disable-next-line no-param-reassign + task.output = ctx.preset; } }, options: { @@ -119,7 +123,8 @@ class SetupCommand extends BaseCommand { }); if (!isVerbose) { // TODO: We need to print it only with default renderer - const { begoo } = await import('begoo'); + // eslint-disable-next-line import/extensions + const { begoo } = await import('begoo/index.js'); // don't remove index! const welcomeText = begoo( chalk`Hello! I'm your {bold.cyanBright Dash} mate! diff --git a/packages/dashmate/src/config/Config.js b/packages/dashmate/src/config/Config.js index 27d1cff55e0..07a440bc900 100644 --- a/packages/dashmate/src/config/Config.js +++ b/packages/dashmate/src/config/Config.js @@ -151,14 +151,20 @@ class Config { } /** - * + * @param {Object} [options={}] + * @param {boolean} [options.platformOnly=false] * @return {{CONFIG_NAME: string, COMPOSE_PROJECT_NAME: string}} */ - toEnvs() { - const dockerComposeFiles = ['docker-compose.yml']; + toEnvs(options = {}) { + const dockerComposeFiles = []; + + if (!options.platformOnly) { + // TODO: it should contain only the dashmate helper that must be ran always + dockerComposeFiles.push('docker-compose.yml'); - if (this.get('core.masternode.enable') === true) { - dockerComposeFiles.push('docker-compose.sentinel.yml'); + if (this.get('core.masternode.enable') === true) { + dockerComposeFiles.push('docker-compose.sentinel.yml'); + } } if (this.get('platform.enable')) { diff --git a/packages/dashmate/src/createDIContainer.js b/packages/dashmate/src/createDIContainer.js index 7d36704f686..b974614e067 100644 --- a/packages/dashmate/src/createDIContainer.js +++ b/packages/dashmate/src/createDIContainer.js @@ -93,6 +93,7 @@ const registerMasternodeGuideTaskFactory = require('./listr/tasks/setup/regular/ const configureNodeTaskFactory = require('./listr/tasks/setup/regular/configureNodeTaskFactory'); const configureSSLCertificateTaskFactory = require('./listr/tasks/setup/regular/configureSSLCertificateTaskFactory'); const createHttpApiServerFactory = require('./helper/api/createHttpApiServerFactory'); +const resolveDockerSocketPath = require('./docker/resolveDockerSocketPath'); async function createDIContainer() { const container = createAwilixContainer({ @@ -147,9 +148,18 @@ async function createDIContainer() { /** * Docker */ + + const dockerOptions = {}; + try { + dockerOptions.socketPath = await resolveDockerSocketPath(); + } catch (e) { + // Here we skip possible error which is happening if docker is not installed or not running + // It will be handled in the logic below + } + container.register({ docker: asFunction(() => ( - new Docker() + new Docker(dockerOptions) )).singleton(), dockerCompose: asClass(DockerCompose).singleton(), startedContainers: asFunction(() => ( diff --git a/packages/dashmate/src/docker/DockerCompose.js b/packages/dashmate/src/docker/DockerCompose.js index cd4bfec98e3..6e56b1a5f45 100644 --- a/packages/dashmate/src/docker/DockerCompose.js +++ b/packages/dashmate/src/docker/DockerCompose.js @@ -235,7 +235,7 @@ class DockerCompose { * @param {Object} envs * @param {string} [filterServiceNames] * @param {boolean} returnServiceNames - * @return {string[]} + * @return {Promise} */ async getContainersList( envs, @@ -324,7 +324,7 @@ class DockerCompose { try { await dockerCompose.rm({ ...this.getOptions(envs), - commandOptions: ['--stop', '-v'], + commandOptions: ['--stop'], }, ...serviceNames); } catch (e) { throw new DockerComposeError(e); @@ -351,7 +351,6 @@ class DockerCompose { } /** - * @private * @return {Promise} */ async throwErrorIfNotInstalled() { @@ -361,23 +360,33 @@ class DockerCompose { this.isDockerSetupVerified = true; + const dockerComposeInstallLink = 'https://docs.docker.com/compose/install/'; + const dockerInstallLink = 'https://docs.docker.com/engine/install/'; + const dockerPostInstallLinuxLink = 'https://docs.docker.com/engine/install/linux-postinstall/'; + const dockerContextLink = 'https://docs.docker.com/engine/context/working-with-contexts/'; + // Check docker if (!hasbin.sync('docker')) { - throw new Error('Docker is not installed'); + throw new Error(`Docker is not installed. Please follow instructions ${dockerInstallLink}`); } - const dockerVersion = await new Promise((resolve, reject) => { - this.docker.version((err, data) => { - if (err) { - return reject(err); - } - - return resolve(data.Version); + let dockerVersion; + try { + dockerVersion = await new Promise((resolve, reject) => { + this.docker.version((err, data) => { + if (err) { + return reject(err); + } + + return resolve(data.Version); + }); }); - }); + } catch (e) { + throw new Error(`Can't connect to Docker Engine: ${e.message}.\n\nPossible reasons:\n1. Docker is not started\n2. Permission issues ${dockerPostInstallLinuxLink}\n3. Wrong context ${dockerContextLink}`); + } if (semver.lt(dockerVersion.trim(), DockerCompose.DOCKER_MIN_VERSION)) { - throw new Error(`Update Docker to version ${DockerCompose.DOCKER_MIN_VERSION} or higher`); + throw new Error(`Update Docker to version ${DockerCompose.DOCKER_MIN_VERSION} or higher. Please follow instructions ${dockerInstallLink}`); } let version; @@ -386,11 +395,11 @@ class DockerCompose { try { ({ out: version } = await dockerCompose.version()); } catch (e) { - throw new Error('Docker Compose V2 is not available in your system'); + throw new Error(`Docker Compose V2 is not available in your system. Please follow instructions ${dockerComposeInstallLink}`); } if (semver.lt(version.trim(), DockerCompose.DOCKER_COMPOSE_MIN_VERSION)) { - throw new Error(`Update Docker Compose to version ${DockerCompose.DOCKER_COMPOSE_MIN_VERSION} or higher`); + throw new Error(`Update Docker Compose to version ${DockerCompose.DOCKER_COMPOSE_MIN_VERSION} or higher. Please follow instructions ${dockerComposeInstallLink}`); } } diff --git a/packages/dashmate/src/docker/resolveDockerSocketPath.js b/packages/dashmate/src/docker/resolveDockerSocketPath.js new file mode 100644 index 00000000000..0ff0ddacbc6 --- /dev/null +++ b/packages/dashmate/src/docker/resolveDockerSocketPath.js @@ -0,0 +1,17 @@ +const { promisify } = require('util'); +const path = require('path'); +const exec = promisify(require('child_process').exec); + +/** + * Returns docker socket path + * @returns {Promise} + */ +async function resolveDockerSocketPath() { + const { stdout } = await exec('docker context inspect'); + + const output = JSON.parse(stdout); + + return path.normalize(output[0].Endpoints.docker.Host.split(':').pop()); +} + +module.exports = resolveDockerSocketPath; diff --git a/packages/dashmate/src/listr/prompts/validators/validatePercentage.js b/packages/dashmate/src/listr/prompts/validators/validatePercentage.js index 60466130bbb..0bea3c809b8 100644 --- a/packages/dashmate/src/listr/prompts/validators/validatePercentage.js +++ b/packages/dashmate/src/listr/prompts/validators/validatePercentage.js @@ -5,7 +5,7 @@ function validatePercentage(value) { const reminder = value.split('.')[1]; - return Number(value) <= 100 && (!reminder || reminder.length <= 2); + return Number(value) >= 0 && Number(value) <= 100 && (!reminder || reminder.length <= 2); } module.exports = validatePercentage; diff --git a/packages/dashmate/src/listr/tasks/resetNodeTaskFactory.js b/packages/dashmate/src/listr/tasks/resetNodeTaskFactory.js index 1e3b1dbb076..c5b48d08cdd 100644 --- a/packages/dashmate/src/listr/tasks/resetNodeTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/resetNodeTaskFactory.js @@ -6,6 +6,7 @@ const { Listr } = require('listr2'); * @param {startNodeTask} startNodeTask * @param {generateToAddressTask} generateToAddressTask * @param {systemConfigs} systemConfigs + * @param {ConfigFile} configFile * @return {resetNodeTask} */ function resetNodeTaskFactory( @@ -14,6 +15,7 @@ function resetNodeTaskFactory( startNodeTask, generateToAddressTask, systemConfigs, + configFile, ) { /** * @typedef {resetNodeTask} @@ -21,6 +23,13 @@ function resetNodeTaskFactory( */ function resetNodeTask(config) { return new Listr([ + { + task: (ctx) => { + if (!config.get('platform.enable') && ctx.isPlatformOnlyReset) { + throw new Error('Cannot reset platform only if platform services are not enabled in config'); + } + }, + }, { title: 'Check services are not running', skip: (ctx) => ctx.isForce, @@ -37,43 +46,57 @@ function resetNodeTaskFactory( }, { title: 'Remove platform services and associated data', - enabled: (ctx) => ctx.isPlatformOnlyReset && config.get('platform.enable'), + enabled: (ctx) => ctx.isPlatformOnlyReset, task: async () => { // Remove containers - const coreContainerNames = ['core', 'sentinel']; - const containerNames = await dockerCompose - .getContainersList(config.toEnvs(), undefined, true); - const platformContainerNames = containerNames - .filter((containerName) => !coreContainerNames.includes(containerName)); + const serviceNames = await dockerCompose + .getContainersList( + config.toEnvs({ platformOnly: true }), + undefined, + true, + ); - await dockerCompose.rm(config.toEnvs(), platformContainerNames); + await dockerCompose.rm(config.toEnvs(), serviceNames); // Remove volumes - const coreVolumeNames = ['core_data']; const { COMPOSE_PROJECT_NAME: composeProjectName } = config.toEnvs(); - const projectVolumeNames = await dockerCompose.getVolumeNames(config.toEnvs()); + const projectVolumeNames = await dockerCompose.getVolumeNames( + config.toEnvs({ platformOnly: true }), + ); await Promise.all( projectVolumeNames - .filter((volumeName) => !coreVolumeNames.includes(volumeName)) .map((volumeName) => `${composeProjectName}_${volumeName}`) .map(async (volumeName) => docker.getVolume(volumeName).remove()), ); }, }, + { + title: 'Reset dashmate\'s ephemeral data', + task: (ctx) => { + if (!ctx.isPlatformOnlyReset) { + config.set('core.miner.mediantime', null); + } + }, + }, { title: `Reset config ${config.getName()}`, enabled: (ctx) => ctx.isHardReset, task: (ctx) => { - const name = config.get('group') || config.getName(); + const baseConfigName = config.get('group') || config.getName(); - if (ctx.isPlatformOnlyReset) { - // TODO: This won't work for user created configs - const { platform: systemPlatformConfig } = systemConfigs[name]; - config.set('platform', systemPlatformConfig); + if (systemConfigs[baseConfigName]) { + // Reset config if has a base config + if (ctx.isPlatformOnlyReset) { + const { platform: systemPlatformConfig } = systemConfigs[baseConfigName]; + config.set('platform', systemPlatformConfig); + } else { + config.setOptions(systemConfigs[baseConfigName]); + } } else { - config.setOptions(systemConfigs[name]); + // Delete config if no base config + configFile.removeConfig(config.getName()); } }, }, diff --git a/packages/dashmate/src/listr/tasks/setup/local/configureCoreTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/local/configureCoreTaskFactory.js index 40793bfdf3e..c37177c762a 100644 --- a/packages/dashmate/src/listr/tasks/setup/local/configureCoreTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/local/configureCoreTaskFactory.js @@ -162,13 +162,6 @@ function configureCoreTaskFactory( const subTasks = masternodeConfigs.map((config, index) => ({ title: `Register ${config.getName()} masternode`, - skip: () => { - if (config.get('core.masternode.operator.privateKey')) { - return `Masternode operator private key ('core.masternode.operator.privateKey') is already set in ${config.getName()} config`; - } - - return false; - }, task: () => new Listr([ { title: 'Generate a masternode operator key', diff --git a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js index 02028b1820b..8c47cef1ba8 100644 --- a/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/regular/registerMasternodeGuideTaskFactory.js @@ -186,8 +186,8 @@ function registerMasternodeGuideTaskFactory() { result: (value) => Number(value).toFixed(2), }, ], - validate: ({ privateKey, rewardShare }) => validateBLSPrivateKey(privateKey) - && validatePercentage(rewardShare), + validate: ({ privateKey, rewardShare }) => ( + validateBLSPrivateKey(privateKey) === true && validatePercentage(rewardShare)), }, ]; @@ -219,27 +219,27 @@ function registerMasternodeGuideTaskFactory() { let command; if (ctx.isHP) { - command = `dash-cli register_hpmn - ${state.collateral.txId} - ${state.collateral.outputIndex} - ${state.ipAndPorts.ip}:${state.ipAndPorts.coreP2PPort} - ${state.keys.ownerAddress} - ${operatorPublicKeyHex} - ${state.keys.votingAddress} - ${state.operator.rewardShare} - ${state.keys.payoutAddress} - ${deriveTenderdashNodeId(state.platformNodeKey)} - ${platformP2PPort} + command = `dash-cli protx register_hpmn \\ + ${state.collateral.txId} \\ + ${state.collateral.outputIndex} \\ + ${state.ipAndPorts.ip}:${state.ipAndPorts.coreP2PPort} \\ + ${state.keys.ownerAddress} \\ + ${operatorPublicKeyHex} \\ + ${state.keys.votingAddress} \\ + ${state.operator.rewardShare} \\ + ${state.keys.payoutAddress} \\ + ${deriveTenderdashNodeId(state.platformNodeKey)} \\ + ${platformP2PPort} \\ ${platformHTTPPort}`; } else { - command = `dash-cli register - ${state.collateral.txId} - ${state.collateral.outputIndex} - ${state.ipAndPorts.ip}:${state.ipAndPorts.coreP2PPort} - ${state.keys.ownerAddress} - ${operatorPublicKeyHex} - ${state.keys.votingAddress} - ${state.operator.rewardShare} + command = `dash-cli protx register \\ + ${state.collateral.txId} \\ + ${state.collateral.outputIndex} \\ + ${state.ipAndPorts.ip}:${state.ipAndPorts.coreP2PPort} \\ + ${state.keys.ownerAddress} \\ + ${operatorPublicKeyHex} \\ + ${state.keys.votingAddress} \\ + ${state.operator.rewardShare} \\ ${state.keys.payoutAddress}`; } diff --git a/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js index 023affc64cc..e63c235fc1b 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js @@ -9,6 +9,7 @@ const { } = require('../../../constants'); const generateTenderdashNodeKey = require('../../../tenderdash/generateTenderdashNodeKey'); const deriveTenderdashNodeId = require('../../../tenderdash/deriveTenderdashNodeId'); +const generateRandomString = require('../../../util/generateRandomString'); /** * @param {ConfigFile} configFile @@ -39,12 +40,18 @@ function setupLocalPresetTaskFactory( enabled: (ctx) => ctx.nodeCount === undefined, task: async (ctx, task) => { ctx.nodeCount = await task.prompt({ - type: 'Numeral', + type: 'input', message: 'Enter the number of masternodes', initial: 3, - float: false, - min: 3, validate: (state) => { + if (Number.isNaN(+state)) { + return 'You must set a number of masternodes'; + } + + if (!Number.isInteger(+state)) { + return 'Must be an integer'; + } + if (+state < 3) { return 'You must set not less than 3'; } @@ -167,6 +174,8 @@ function setupLocalPresetTaskFactory( config.set('group', 'local'); config.set('core.p2p.port', config.get('core.p2p.port') + (i * 100)); config.set('core.rpc.port', config.get('core.rpc.port') + (i * 100)); + config.set('core.rpc.user', generateRandomString(8)); + config.set('core.rpc.password', generateRandomString(12)); config.set('externalIp', hostDockerInternalIp); config.set('docker.network.subnet', `172.24.${nodeIndex}.0/24`); diff --git a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js index 38fdb82cf24..f3b51361b7d 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupRegularPresetTaskFactory.js @@ -17,6 +17,7 @@ const { } = require('./nodeTypes'); const Config = require('../../../config/Config'); +const generateRandomString = require('../../../util/generateRandomString'); /** * @param {ConfigFile} configFile @@ -84,6 +85,9 @@ function setupRegularPresetTaskFactory( ctx.config.set('platform.enable', ctx.isHP); ctx.config.set('core.masternode.enable', ctx.nodeType === NODE_TYPE_MASTERNODE); + ctx.config.set('core.rpc.user', generateRandomString(8)); + ctx.config.set('core.rpc.password', generateRandomString(12)); + // eslint-disable-next-line no-param-reassign task.output = nodeTypeName; }, diff --git a/packages/dashmate/src/listr/tasks/ssl/VerificationServer.js b/packages/dashmate/src/listr/tasks/ssl/VerificationServer.js index 0e27cbac5fd..eedf155d5bd 100644 --- a/packages/dashmate/src/listr/tasks/ssl/VerificationServer.js +++ b/packages/dashmate/src/listr/tasks/ssl/VerificationServer.js @@ -42,9 +42,7 @@ class VerificationServer { // set up envoy config const envoyConfig = template({ route, body }); const configDir = path.join(HOME_DIR_PATH, config.getName()); - const configName = templatePath - .substring(templatePath.lastIndexOf('/') + 1) - .replace('.dot', ''); + const configName = path.basename(templatePath, '.dot'); this.configPath = path.join(configDir, configName); if (!fs.existsSync(configDir)) { diff --git a/packages/dashmate/src/oclif/errors/MuteOneLineError.js b/packages/dashmate/src/oclif/errors/MuteOneLineError.js index 97c5d093eaf..1ac66d02cc6 100644 --- a/packages/dashmate/src/oclif/errors/MuteOneLineError.js +++ b/packages/dashmate/src/oclif/errors/MuteOneLineError.js @@ -9,7 +9,7 @@ class MuteOneLineError extends AbstractError { constructor(error) { super('SIGINT'); - if (settings.debug || (error.message && error.message.trimEnd().includes('\n'))) { + if (settings.debug) { this.name = error.name; this.message = error.message; this.stack = error.stack; diff --git a/packages/dashmate/src/ssl/zerossl/createCertificate.js b/packages/dashmate/src/ssl/zerossl/createCertificate.js index 59fd207dcc6..bc8fe083888 100644 --- a/packages/dashmate/src/ssl/zerossl/createCertificate.js +++ b/packages/dashmate/src/ssl/zerossl/createCertificate.js @@ -1,5 +1,6 @@ const fetch = require('node-fetch'); const qs = require('qs'); +const errorDescriptions = require('./errors/errorDescriptions'); /** * Create a ZeroSSL Certificate @@ -36,7 +37,9 @@ async function createCertificate( const data = await response.json(); if (data.error) { - throw new Error(JSON.stringify(data.error)); + const errorMessage = errorDescriptions[data.error.code]; + + throw new Error(errorMessage || JSON.stringify(data.error)); } return data; diff --git a/packages/dashmate/src/ssl/zerossl/downloadCertificate.js b/packages/dashmate/src/ssl/zerossl/downloadCertificate.js index ddf768b4912..5974388a547 100644 --- a/packages/dashmate/src/ssl/zerossl/downloadCertificate.js +++ b/packages/dashmate/src/ssl/zerossl/downloadCertificate.js @@ -1,5 +1,6 @@ const fetch = require('node-fetch'); const wait = require('../../util/wait'); +const errorDescriptions = require('./errors/errorDescriptions'); /** * Download the certificate specified by id @@ -40,7 +41,9 @@ async function downloadCertificate(id, apiKey) { } if (data.error) { - throw new Error(data.error.type); + const errorMessage = errorDescriptions[data.error.code]; + + throw new Error(errorMessage || JSON.stringify(data.error)); } return `${data['certificate.crt']}\n${data['ca_bundle.crt']}`; diff --git a/packages/dashmate/src/ssl/zerossl/errors/errorDescriptions.js b/packages/dashmate/src/ssl/zerossl/errors/errorDescriptions.js new file mode 100644 index 00000000000..5bff868ae94 --- /dev/null +++ b/packages/dashmate/src/ssl/zerossl/errors/errorDescriptions.js @@ -0,0 +1,24 @@ +module.exports = { + 2804: 'The current certificate cannot be issued due to unpaid invoices on your ZeroSSL account.', + 2808: 'Your domain is not valid', + 2813: 'Only issued certificates can be renewed or replaced by a new certificate.', + 2814: 'Yo do not have the permissions to access ZeroSSL certificate to renew.', + 2815: 'Only issued certificates can be renewed or replaced by a new certificate.', + 2816: 'ZeroSSL certificate to renew was not found.', + 2817: 'Limit of certificates on your ZeroSSL account was reached', + 2820: 'Internal error processing CSR. Please contact ZeroSSL support if this error occurs.', + 2821: 'Internal error generating certificate. Please contact ZeroSSL support if this error occurs.', + 2839: 'ZeroSSL requires an upgrade from Free Plan to Basic Plan', + 2841: 'Your ZeroSSL account has been temporarily suspended due to unpaid invoices', + 101: 'ZeroSSL API key is invalid', + 102: 'Your ZeroSSL account is not active', + 111: 'Something went wrong. If the problem persists please contact ZeroSSL support team (support@zerossl.com)', + 2801: 'You do not have the permissions to access ZeroSSL resource', + 2803: 'Your ZeroSSL certificate ID (hash) could not be found', + 2822: 'The requested ZeroSSL certificate could not be retrieved.', + 2823: 'ZeroSSL domain verification failed and must be retried.', + 2826: 'Internal error verifying domains. Please contact ZeroSSL support if this error occurs', + 2874: 'ZeroSSL is not able to issue certificates for this Top-Level-Domain at the moment', + 2832: 'The given certificate has not been issued yet', + 2860: 'The certificate can currently not be downloaded', +}; diff --git a/packages/dashmate/src/ssl/zerossl/getCertificate.js b/packages/dashmate/src/ssl/zerossl/getCertificate.js index 8fc55a2dd41..d9b9ff228ae 100644 --- a/packages/dashmate/src/ssl/zerossl/getCertificate.js +++ b/packages/dashmate/src/ssl/zerossl/getCertificate.js @@ -1,4 +1,5 @@ const fetch = require('node-fetch'); +const errorDescriptions = require('./errors/errorDescriptions'); /** * Get ZeroSSL certificate @@ -21,7 +22,9 @@ async function getCertificate(apiKey, id) { const data = await response.json(); if (data.error) { - throw new Error(data.error.type); + const errorMessage = errorDescriptions[data.error.code]; + + throw new Error(errorMessage || JSON.stringify(data.error)); } return data; diff --git a/packages/dashmate/src/ssl/zerossl/listCertificates.js b/packages/dashmate/src/ssl/zerossl/listCertificates.js index a6ac9b03046..c2eadd6a25a 100644 --- a/packages/dashmate/src/ssl/zerossl/listCertificates.js +++ b/packages/dashmate/src/ssl/zerossl/listCertificates.js @@ -1,4 +1,5 @@ const fetch = require('node-fetch'); +const errorDescriptions = require('./errors/errorDescriptions'); /** * List ZeroSSL certificates @@ -20,7 +21,9 @@ async function listCertificates(apiKey) { const data = await response.json(); if (data.error) { - throw new Error(data.error.type); + const errorMessage = errorDescriptions[data.error.code]; + + throw new Error(errorMessage || JSON.stringify(data.error)); } return data; diff --git a/packages/dashmate/src/ssl/zerossl/verifyDomain.js b/packages/dashmate/src/ssl/zerossl/verifyDomain.js index 2a1d79a877a..f67f2f883ff 100644 --- a/packages/dashmate/src/ssl/zerossl/verifyDomain.js +++ b/packages/dashmate/src/ssl/zerossl/verifyDomain.js @@ -1,6 +1,7 @@ const fetch = require('node-fetch'); const qs = require('qs'); +const errorDescriptions = require('./errors/errorDescriptions'); /** * Verify the domain/ip specified by certificate id @@ -30,7 +31,9 @@ async function verifyDomain(id, apiKey) { const data = await response.json(); if (data.error) { - throw new Error(data.error.type); + const errorMessage = errorDescriptions[data.error.code]; + + throw new Error(errorMessage || JSON.stringify(data.error)); } return data; diff --git a/packages/dashmate/src/status/scopes/masternode.js b/packages/dashmate/src/status/scopes/masternode.js index e17de8d7380..5935688d2f0 100644 --- a/packages/dashmate/src/status/scopes/masternode.js +++ b/packages/dashmate/src/status/scopes/masternode.js @@ -79,7 +79,7 @@ function getMasternodeScopeFactory(dockerCompose, createRpcClient, getConnection masternode.proTxHash = proTxHash; masternode.status = status; - masternode.state = state; + masternode.state = state || MasternodeStateEnum.UNKNOWN; if (state === MasternodeStateEnum.READY) { const { dmnState } = masternodeStatus.result; diff --git a/packages/dashmate/src/util/generateRandomString.js b/packages/dashmate/src/util/generateRandomString.js new file mode 100644 index 00000000000..74aed6e9980 --- /dev/null +++ b/packages/dashmate/src/util/generateRandomString.js @@ -0,0 +1,16 @@ +/** + * + * @param {number} length + * @returns {string} + */ +function generateRandomString(length) { + let result = ''; + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} + +module.exports = generateRandomString; diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index 08a0069b117..8634665a936 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index 26704ee9cf7..1004c636e24 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index a963f78c32e..4ea19d95501 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index d1681105601..6972f28b98c 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 557c088a898..a7ad1d3acda 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "3.24.0-dev.19", + "version": "3.24.0-dev.27", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/src/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-dpp/package.json b/packages/js-dpp/package.json index 029f35f2d68..60191780730 100644 --- a/packages/js-dpp/package.json +++ b/packages/js-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpp", - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "The JavaScript implementation of the Dash Platform Protocol", "scripts": { "lint": "eslint .", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index bbf52302ff1..43975ac0405 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 624ff11c36c..f5420dd5b6b 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 59c470deddf..5e91f93ab84 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/platform-test-suite/test/functional/platform/Identity.spec.js b/packages/platform-test-suite/test/functional/platform/Identity.spec.js index 2044aa48856..96382057338 100644 --- a/packages/platform-test-suite/test/functional/platform/Identity.spec.js +++ b/packages/platform-test-suite/test/functional/platform/Identity.spec.js @@ -595,6 +595,11 @@ describe('Platform', () => { ); for (const masternodeEntry of mnList) { + if (!masternodeEntry.isValid) { + // eslint-disable-next-line no-continue + continue; + } + const masternodeIdentityId = Identifier.from( Buffer.from(masternodeEntry.proRegTxHash, 'hex'), ); diff --git a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs index 79494babad1..b3f8ad001da 100644 --- a/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs +++ b/packages/rs-dpp/src/state_transition/validation/validate_state_transition_fee.rs @@ -164,6 +164,7 @@ where balance } StateTransition::IdentityCreditWithdrawal(_) => { + // TODO: make it as a top-up, but in reverse return Err(ProtocolError::InvalidStateTransitionTypeError( InvalidStateTransitionTypeError::new( StateTransitionType::IdentityCreditWithdrawal as u8, @@ -192,19 +193,19 @@ where execution_context: &StateTransitionExecutionContext, ) -> Result { let identity_id = st.get_owner_id(); - - let balance = self + let maybe_balance = self .state_repository .fetch_identity_balance(identity_id, Some(execution_context)) - .await? - .ok_or_else(|| { - NonConsensusError::StateRepositoryFetchError(format!( - "state repository fetch identity balance error: {}", - *identity_id - )) - })?; - - Ok(balance) + .await + .map_err(ProtocolError::from)?; + + if let Some(balance) = maybe_balance { + Ok(balance) + } else { + Err(ProtocolError::IdentityNotPresentError( + IdentityNotPresentError::new(*identity_id), + )) + } } } @@ -278,7 +279,7 @@ mod test { identity.balance = 1; state_repository_mock .expect_fetch_identity_balance() - .returning(move |_, _| Ok(Some(identity.balance))); + .returning(move |_, _| Ok(Some(identity.get_balance()))); let data_contract = get_data_contract_fixture(None); let execution_context = execution_context_with_cost(40, 5); @@ -306,7 +307,7 @@ mod test { identity.balance = 52; state_repository_mock .expect_fetch_identity_balance() - .returning(move |_, _| Ok(Some(identity.balance))); + .returning(move |_, _| Ok(Some(identity.get_balance()))); let data_contract = get_data_contract_fixture(None); let execution_context = execution_context_with_cost(40, 5); @@ -332,7 +333,7 @@ mod test { identity.balance = 1; state_repository_mock .expect_fetch_identity_balance() - .returning(move |_, _| Ok(Some(identity.balance))); + .returning(move |_, _| Ok(Some(identity.get_balance()))); let data_contract = get_data_contract_fixture(None); let documents = @@ -363,7 +364,7 @@ mod test { identity.balance = 90; state_repository_mock .expect_fetch_identity_balance() - .returning(move |_, _| Ok(Some(identity.balance))); + .returning(move |_, _| Ok(Some(identity.get_balance()))); let data_contract = get_data_contract_fixture(None); let documents = @@ -392,7 +393,7 @@ mod test { identity.balance = 1; state_repository_mock .expect_fetch_identity_balance() - .returning(move |_, _| Ok(Some(identity.balance))); + .returning(move |_, _| Ok(Some(identity.get_balance()))); let data_contract = get_data_contract_fixture(None); let documents = diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index b294ad52968..2135116aad4 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "7.24.0-dev.19", + "version": "7.24.0-dev.27", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wasm-dpp/README.md b/packages/wasm-dpp/README.md index 43e9919a27a..7f42341283c 100644 --- a/packages/wasm-dpp/README.md +++ b/packages/wasm-dpp/README.md @@ -15,27 +15,32 @@ In order for this binding to work, you have to have a rs-platform cloned alongside platform repo, so you can have access to the rust dpp. ## IMPORTANT! -### Build on a Mac - -To build on a mac, you need to perform two steps. First, install `clang` -from the homebrew. XCode's `clang` doesn't ship with the WASM support. Second, -just adding llvm to the `.zshrc` doesn't seem to work - run -`AR=/usr/local/opt/llvm/bin/llvm-ar CC=/usr/local/opt/llvm/bin/clang yarn workspace @dashevo/wasm-dpp build:node` -instead. -Alternatively, you can add the following to the `yarn workspace @dashevo/wasm-dpp build:node:mac` instead. +### Build on a Mac +Built-in `llvm` on OSX does not work, it needs to be installed from brew: +- `brew install llvm` +- LLVM installed from brew is keg only, and path to it must be provided in the profile file, e.g.`echo 'export PATH="/opt/homebrew/opt/llvm/bin:$PATH"' >> ~/.zshrc` ### Class names minification Library consumers must ignore class names minification for `@dashevo/wasm-dpp` library in their bundlers. ## Table of Contents - -- [Install](#install) +- [Prerequisites](#Prerequisites) +- [Build](#build) - [Usage](#usage) - [Contributing](#contributing) - [License](#license) -## Install + + +## Prerequisites +- Install [Rust](https://www.rust-lang.org/tools/install) v1.67+ +- Add wasm32 target: `$ rustup target add wasm32-unknown-unknown` +- Install wasm-bingen-cli: `cargo install wasm-bindgen-cli` + - _Depending on system, additional packages may need to be installed as a prerequisite for wasm-bindgen-cli. If anything is missing, installation will error and prompt what packages are missing (i.e. clang, llvm, libssl-dev)_ + +## Build +`$ yarn build` ## TODO diff --git a/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture.js b/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture.js index 226b6f3fcff..27833bf7970 100644 --- a/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture.js +++ b/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture.js @@ -1 +1,26 @@ -module.exports = require('@dashevo/dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture'); +const PrivateKey = require('@dashevo/dashcore-lib/lib/privatekey'); + +const getInstantAssetLockProofFixture = require('./getInstantAssetLockProofFixture'); +const generateRandomIdentifier = require('../utils/generateRandomIdentifierAsync'); + +const { default: loadWasmDpp } = require('../../..'); +let { IdentityTopUpTransition } = require('../../..'); + +/** + * @param {PrivateKey} oneTimePrivateKey + * + * @return {IdentityCreateTransition} + */ +module.exports = async function getIdentityCreateTransitionFixture( + oneTimePrivateKey = new PrivateKey(), +) { + ({ IdentityTopUpTransition } = await loadWasmDpp()); + const rawStateTransition = { + protocolVersion: 1, + type: 3, + assetLockProof: (await getInstantAssetLockProofFixture(oneTimePrivateKey)).toObject(), + identityId: await generateRandomIdentifier(), + }; + + return new IdentityTopUpTransition(rawStateTransition); +}; diff --git a/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixtureJs.js b/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixtureJs.js new file mode 100644 index 00000000000..226b6f3fcff --- /dev/null +++ b/packages/wasm-dpp/lib/test/fixtures/getIdentityTopUpTransitionFixtureJs.js @@ -0,0 +1 @@ +module.exports = require('@dashevo/dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture'); diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 21c530c9a2b..19baa88ca03 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs b/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs index ad236f8055b..863c59d839c 100644 --- a/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs +++ b/packages/wasm-dpp/src/errors/consensus/fee/balance_is_not_enough_error.rs @@ -26,13 +26,13 @@ impl BalanceIsNotEnoughErrorWasm { } #[wasm_bindgen(js_name=getBalance)] - pub fn get_balance(&self) -> Credits { - self.inner.balance() + pub fn get_balance(&self) -> f64 { + self.inner.balance() as f64 } #[wasm_bindgen(js_name=getFee)] - pub fn get_fee(&self) -> Credits { - self.inner.fee() + pub fn get_fee(&self) -> f64 { + self.inner.fee() as f64 } #[wasm_bindgen(js_name=getCode)] diff --git a/packages/wasm-dpp/src/identity/credits_converter.rs b/packages/wasm-dpp/src/identity/credits_converter.rs new file mode 100644 index 00000000000..d39f38d2953 --- /dev/null +++ b/packages/wasm-dpp/src/identity/credits_converter.rs @@ -0,0 +1,7 @@ +use dpp::identity::RATIO; +use wasm_bindgen::prelude::wasm_bindgen; + +#[wasm_bindgen(js_name=getCreditsConversionRatio)] +pub fn credit_conversion_ratio() -> f64 { + RATIO as f64 +} diff --git a/packages/wasm-dpp/src/identity/mod.rs b/packages/wasm-dpp/src/identity/mod.rs index f36daeb560c..41f69384c5e 100644 --- a/packages/wasm-dpp/src/identity/mod.rs +++ b/packages/wasm-dpp/src/identity/mod.rs @@ -24,6 +24,7 @@ use crate::buffer::Buffer; use crate::errors::from_dpp_err; pub use state_transition::*; +pub mod credits_converter; pub mod errors; pub mod state_transition; diff --git a/packages/wasm-dpp/src/state_transition/fee/mod.rs b/packages/wasm-dpp/src/state_transition/fee/mod.rs index ccecd5249a0..9f228104f25 100644 --- a/packages/wasm-dpp/src/state_transition/fee/mod.rs +++ b/packages/wasm-dpp/src/state_transition/fee/mod.rs @@ -1,6 +1,8 @@ use dpp::state_transition::fee::operations::Operation; use wasm_bindgen::prelude::*; +pub use operations::*; + use crate::utils::Inner; mod calculate_operation_fees; mod calculate_state_transition_fee; diff --git a/packages/wasm-dpp/src/state_transition/validation/mod.rs b/packages/wasm-dpp/src/state_transition/validation/mod.rs index 63594754391..f85299ce15f 100644 --- a/packages/wasm-dpp/src/state_transition/validation/mod.rs +++ b/packages/wasm-dpp/src/state_transition/validation/mod.rs @@ -1,2 +1,3 @@ +pub mod state_transition_fee_validator; pub mod validate_state_transition_identity_signature; pub mod validate_state_transition_key_signature; diff --git a/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs b/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs new file mode 100644 index 00000000000..073cff563f5 --- /dev/null +++ b/packages/wasm-dpp/src/state_transition/validation/state_transition_fee_validator.rs @@ -0,0 +1,41 @@ +use crate::state_repository::{ExternalStateRepositoryLike, ExternalStateRepositoryLikeWrapper}; +use dpp::state_transition::validation::validate_state_transition_fee::StateTransitionFeeValidator; +use std::sync::Arc; +use wasm_bindgen::prelude::wasm_bindgen; +use wasm_bindgen::JsValue; + +use crate::state_transition::conversion::create_state_transition_from_wasm_instance; +use crate::utils::WithJsError; +use crate::validation::ValidationResultWasm; +use crate::StateTransitionExecutionContextWasm; + +#[wasm_bindgen(js_name=StateTransitionFeeValidator)] +pub struct StateTransitionFeeValidatorWasm( + StateTransitionFeeValidator, +); + +#[wasm_bindgen(js_class=StateTransitionFeeValidator)] +impl StateTransitionFeeValidatorWasm { + #[wasm_bindgen(constructor)] + pub fn new(state_repository: ExternalStateRepositoryLike) -> Self { + Self(StateTransitionFeeValidator::new(Arc::new( + ExternalStateRepositoryLikeWrapper::new(state_repository), + ))) + } + + #[wasm_bindgen] + pub async fn validate( + &self, + state_transition: &JsValue, + execution_context: &StateTransitionExecutionContextWasm, + ) -> Result { + let st = create_state_transition_from_wasm_instance(state_transition)?; + Ok(self + .0 + .validate(&st, &execution_context.to_owned().into()) + .await + .map(|v| v.map(|_| JsValue::undefined())) + .with_js_error()? + .into()) + } +} diff --git a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js index ce51b8d3a1b..e22fdbbfb58 100644 --- a/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js +++ b/packages/wasm-dpp/test/integration/identity/stateTransition/IdentityTopUpTransition/validation/basic/validateIdentityTopUpTransitionBasicFactory.spec.js @@ -1,5 +1,5 @@ const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); -const getIdentityTopUpTransitionFixture = require('../../../../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture'); +const getIdentityTopUpTransitionFixture = require('../../../../../../../lib/test/fixtures/getIdentityTopUpTransitionFixtureJs'); const { expectJsonSchemaError, diff --git a/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js b/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js index d26ecc51375..e8f3822d122 100644 --- a/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js +++ b/packages/wasm-dpp/test/integration/stateTransition/StateTransitionFacade.spec.js @@ -176,6 +176,7 @@ describe('StateTransitionFacade', () => { }); it('should return invalid result if not enough balance to pay fee for State Transition', async () => { + identity.setBalance(0); stateRepositoryMock.fetchIdentityBalance.resolves(0); const result = await dpp.stateTransition.validate( dataContractCreateTransition, executionContext, diff --git a/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js b/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js index 315dbea4fda..caac3067f61 100644 --- a/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js +++ b/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionFeeFactory.spec.js @@ -1,167 +1,157 @@ -const validateStateTransitionFeeFactory = require('@dashevo/dpp/lib/stateTransition/validation/validateStateTransitionFeeFactory'); - -const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); - -const getDocumentsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentsFixture'); -const getDataContractFixture = require('@dashevo/dpp/lib/test/fixtures/getDataContractFixture'); -const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); -const getDocumentTransitionsFixture = require('@dashevo/dpp/lib/test/fixtures/getDocumentTransitionsFixture'); -const getIdentityTopUpTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityTopUpTransitionFixture'); - -const DataContractCreateTransition = require('@dashevo/dpp/lib/dataContract/stateTransition/DataContractCreateTransition/DataContractCreateTransition'); -const DocumentsBatchTransition = require('@dashevo/dpp/lib/document/stateTransition/DocumentsBatchTransition/DocumentsBatchTransition'); - -const { expectValidationError } = require('@dashevo/dpp/lib/test/expect/expectError'); - -const IdentityBalanceIsNotEnoughError = require('@dashevo/dpp/lib/errors/consensus/fee/BalanceIsNotEnoughError'); -const InvalidStateTransitionTypeError = require('@dashevo/dpp/lib/stateTransition/errors/InvalidStateTransitionTypeError'); - -const { RATIO } = require('@dashevo/dpp/lib/identity/creditsConverter'); -const StateTransitionExecutionContext = require('@dashevo/dpp/lib/stateTransition/StateTransitionExecutionContext'); +const { expectValidationError } = require('../../../../lib/test/expect/expectError'); + +const createStateRepositoryMock = require('../../../../lib/test/mocks/createStateRepositoryMock'); +const getBlsMock = require('../../../../lib/test/mocks/getBlsAdapterMock'); + +const getDataContractFixture = require('../../../../lib/test/fixtures/getDataContractFixture'); +const getDocumentsFixture = require('../../../../lib/test/fixtures/getDocumentsFixture'); +const getIdentityCreateTransitionFixture = require('../../../../lib/test/fixtures/getIdentityCreateTransitionFixture'); +const getIdentityTopUpTransitionFixture = require('../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture'); + +let { + StateTransitionFeeValidator, + DashPlatformProtocol, + IdentityBalanceIsNotEnoughError, + StateTransitionExecutionContext, + PreCalculatedOperation, + getCreditsConversionRatio, +} = require('../../../..'); +const { default: loadWasmDpp } = require('../../../..'); describe('validateStateTransitionFeeFactory', () => { let stateRepositoryMock; let validateStateTransitionFee; let dataContract; - let calculateStateTransitionFeeMock; - let fetchAssetLockTransactionOutputMock; - - beforeEach(function beforeEach() { + let dpp; + let dataContractOwnerId; + let executionContext; + + beforeEach(async function beforeEach() { + ({ + StateTransitionFeeValidator, + IdentityBalanceIsNotEnoughError, + DashPlatformProtocol, + StateTransitionExecutionContext, + PreCalculatedOperation, + getCreditsConversionRatio, + } = await loadWasmDpp()); stateRepositoryMock = createStateRepositoryMock(this.sinonSandbox); + stateRepositoryMock.fetchDataContract.resolves(undefined); - const output = getIdentityCreateTransitionFixture().getAssetLockProof().getOutput(); + dpp = new DashPlatformProtocol(getBlsMock(), stateRepositoryMock); - calculateStateTransitionFeeMock = this.sinonSandbox.stub().returns({ - desiredAmount: 42, - }); + const validator = new StateTransitionFeeValidator(stateRepositoryMock); - fetchAssetLockTransactionOutputMock = this.sinonSandbox.stub().resolves(output); + validateStateTransitionFee = (st) => validator.validate(st); - validateStateTransitionFee = validateStateTransitionFeeFactory( - stateRepositoryMock, - calculateStateTransitionFeeMock, - fetchAssetLockTransactionOutputMock, - ); + executionContext = new StateTransitionExecutionContext(); + executionContext.disableDryRun(); - dataContract = getDataContractFixture(); + dataContract = await getDataContractFixture(); }); describe('DataContractCreateTransition', () => { let dataContractCreateTransition; beforeEach(() => { - dataContractCreateTransition = new DataContractCreateTransition({ - dataContract: dataContract.toObject(), - entropy: dataContract.getEntropy(), - }); + dataContractOwnerId = dataContract.getOwnerId().toBuffer(); + dataContractCreateTransition = dpp.dataContract + .createDataContractCreateTransition(dataContract); }); it('should return invalid result if balance is not enough', async () => { + executionContext.addOperation(new PreCalculatedOperation(0, 42, [])); + dataContractCreateTransition.setExecutionContext(executionContext); stateRepositoryMock.fetchIdentityBalance.resolves(1); const result = await validateStateTransitionFee(dataContractCreateTransition); - expectValidationError(result, IdentityBalanceIsNotEnoughError); + await expectValidationError(result, IdentityBalanceIsNotEnoughError); const [error] = result.getErrors(); expect(error.getCode()).to.equal(3000); expect(error.getBalance()).to.equal(1); - expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly( - dataContract.getOwnerId(), - dataContractCreateTransition.getExecutionContext(), - ); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - dataContractCreateTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.not.be.called(); + expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalance.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(dataContractOwnerId); }); it('should return valid result', async () => { stateRepositoryMock.fetchIdentityBalance.resolves(42); + executionContext.addOperation(new PreCalculatedOperation(0, 42, [])); + dataContractCreateTransition.setExecutionContext(executionContext); + const result = await validateStateTransitionFee(dataContractCreateTransition); expect(result.isValid()).to.be.true(); - expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly( - dataContract.getOwnerId(), - dataContractCreateTransition.getExecutionContext(), - ); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - dataContractCreateTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.not.be.called(); + expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalance.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(dataContractOwnerId); }); }); describe('DocumentsBatchTransition', () => { let documentsBatchTransition; + let ownerId; - beforeEach(() => { - const documents = getDocumentsFixture(dataContract); - - const documentTransitions = getDocumentTransitionsFixture({ - create: documents, + beforeEach(async () => { + documentsBatchTransition = await dpp.document.createStateTransition({ + create: await getDocumentsFixture(), }); - documentsBatchTransition = new DocumentsBatchTransition({ - ownerId: getDocumentsFixture.ownerId, - contractId: dataContract.getId(), - transitions: documentTransitions.map((t) => t.toObject()), - }, [dataContract]); + ownerId = documentsBatchTransition.getOwnerId().toBuffer(); }); it('should return invalid result if balance is not enough', async () => { stateRepositoryMock.fetchIdentityBalance.resolves(1); + executionContext.addOperation(new PreCalculatedOperation(0, 42, [])); + documentsBatchTransition.setExecutionContext(executionContext); + const result = await validateStateTransitionFee(documentsBatchTransition); - expectValidationError(result, IdentityBalanceIsNotEnoughError); + await expectValidationError(result, IdentityBalanceIsNotEnoughError); const [error] = result.getErrors(); expect(error.getCode()).to.equal(3000); expect(error.getBalance()).to.equal(1); - expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly( - getDocumentsFixture.ownerId, - documentsBatchTransition.getExecutionContext(), - ); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - documentsBatchTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.not.be.called(); + expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalance.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(ownerId); }); it('should return valid result', async () => { stateRepositoryMock.fetchIdentityBalance.resolves(42); + executionContext.addOperation(new PreCalculatedOperation(0, 42, [])); + documentsBatchTransition.setExecutionContext(executionContext); + const result = await validateStateTransitionFee(documentsBatchTransition); expect(result.isValid()).to.be.true(); - expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly( - getDocumentsFixture.ownerId, - documentsBatchTransition.getExecutionContext(), - ); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - documentsBatchTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.not.be.called(); + expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalance.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(ownerId); }); it('should not increase balance on dry run', async () => { - documentsBatchTransition.getExecutionContext().enableDryRun(); + stateRepositoryMock.fetchIdentityBalance.resolves(1); + + executionContext.enableDryRun(); + + executionContext.addOperation(new PreCalculatedOperation(0, 42, [])); + documentsBatchTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(documentsBatchTransition); @@ -169,12 +159,10 @@ describe('validateStateTransitionFeeFactory', () => { expect(result.isValid()).to.be.true(); - expect(calculateStateTransitionFeeMock).to.be.not.called(); - expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnceWithExactly( - getDocumentsFixture.ownerId, - documentsBatchTransition.getExecutionContext(), - ); - expect(fetchAssetLockTransactionOutputMock).to.not.be.called(); + expect(stateRepositoryMock.fetchIdentityBalance).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalance.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(ownerId); }); }); @@ -182,22 +170,23 @@ describe('validateStateTransitionFeeFactory', () => { let identityCreateTransition; let outputAmount; - beforeEach(() => { - identityCreateTransition = getIdentityCreateTransitionFixture(); + beforeEach(async () => { + identityCreateTransition = await getIdentityCreateTransitionFixture(); const { satoshis } = identityCreateTransition .getAssetLockProof() .getOutput(); - outputAmount = satoshis * RATIO; + outputAmount = satoshis * getCreditsConversionRatio(); }); it('should return invalid result if asset lock output amount is not enough', async () => { - calculateStateTransitionFeeMock.returns({ desiredAmount: outputAmount + 1 }); + executionContext.addOperation(new PreCalculatedOperation(0, outputAmount + 1, [])); + identityCreateTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(identityCreateTransition); - expectValidationError(result, IdentityBalanceIsNotEnoughError); + await expectValidationError(result, IdentityBalanceIsNotEnoughError); const [error] = result.getErrors(); @@ -205,122 +194,91 @@ describe('validateStateTransitionFeeFactory', () => { expect(error.getBalance()).to.equal(outputAmount); expect(stateRepositoryMock.fetchIdentity).to.be.not.called(); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - identityCreateTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.be.calledOnceWithExactly( - identityCreateTransition.getAssetLockProof(), - identityCreateTransition.getExecutionContext(), - ); }); it('should return valid result', async () => { - calculateStateTransitionFeeMock.returns(outputAmount); + executionContext.addOperation(new PreCalculatedOperation(0, outputAmount, [])); + identityCreateTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(identityCreateTransition); expect(result.isValid()).to.be.true(); expect(stateRepositoryMock.fetchIdentity).to.be.not.called(); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - identityCreateTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.be.calledOnceWithExactly( - identityCreateTransition.getAssetLockProof(), - identityCreateTransition.getExecutionContext(), - ); }); it('should not increase balance on dry run', async () => { - identityCreateTransition.getExecutionContext().enableDryRun(); + executionContext.enableDryRun(); + executionContext.addOperation(new PreCalculatedOperation(0, outputAmount + 1, [])); + identityCreateTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(identityCreateTransition); identityCreateTransition.getExecutionContext().disableDryRun(); expect(result.isValid()).to.be.true(); - - expect(calculateStateTransitionFeeMock).to.be.not.called(); - expect(fetchAssetLockTransactionOutputMock).to.be.calledOnceWithExactly( - identityCreateTransition.getAssetLockProof(), - identityCreateTransition.getExecutionContext(), - ); }); }); describe('IdentityTopUpTransition', () => { let identityTopUpTransition; let outputAmount; + let identityId; - beforeEach(() => { - identityTopUpTransition = getIdentityTopUpTransitionFixture(); + beforeEach(async () => { + identityTopUpTransition = await getIdentityTopUpTransitionFixture(); + identityId = identityTopUpTransition.getIdentityId().toBuffer(); const { satoshis } = identityTopUpTransition .getAssetLockProof() .getOutput(); - outputAmount = satoshis * RATIO; + outputAmount = satoshis * getCreditsConversionRatio(); }); it('should return invalid result if sum of balance and asset lock output amount is not enough', async () => { stateRepositoryMock.fetchIdentityBalanceWithDebt.resolves(1); - calculateStateTransitionFeeMock.returns({ desiredAmount: outputAmount + 2 }); + executionContext.addOperation(new PreCalculatedOperation(0, outputAmount + 2, [])); + identityTopUpTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(identityTopUpTransition); - expectValidationError(result, IdentityBalanceIsNotEnoughError); + await expectValidationError(result, IdentityBalanceIsNotEnoughError); const [error] = result.getErrors(); expect(error.getCode()).to.equal(3000); expect(error.getBalance()).to.equal(outputAmount + 1); - expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnceWithExactly( - identityTopUpTransition.getIdentityId(), - identityTopUpTransition.getExecutionContext(), - ); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - identityTopUpTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.be.calledOnceWithExactly( - identityTopUpTransition.getAssetLockProof(), - identityTopUpTransition.getExecutionContext(), - ); + expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalanceWithDebt.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(identityId); }); it('should return valid result', async () => { stateRepositoryMock.fetchIdentityBalanceWithDebt.resolves(41); - calculateStateTransitionFeeMock.returns(outputAmount - 1); + executionContext.addOperation(new PreCalculatedOperation(0, outputAmount - 1, [])); + identityTopUpTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(identityTopUpTransition); expect(result.isValid()).to.be.true(); - expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnceWithExactly( - identityTopUpTransition.getIdentityId(), - identityTopUpTransition.getExecutionContext(), - ); - - expect(calculateStateTransitionFeeMock).to.be.calledOnceWithExactly( - identityTopUpTransition, - ); - - expect(fetchAssetLockTransactionOutputMock).to.be.calledOnceWithExactly( - identityTopUpTransition.getAssetLockProof(), - identityTopUpTransition.getExecutionContext(), - ); + expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalanceWithDebt.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(identityId); }); it('should not increase balance on dry run', async () => { - identityTopUpTransition.getExecutionContext().enableDryRun(); + stateRepositoryMock.fetchIdentityBalanceWithDebt.resolves(1); + + executionContext.enableDryRun(); + executionContext.addOperation(new PreCalculatedOperation(0, outputAmount + 42, [])); + identityTopUpTransition.setExecutionContext(executionContext); const result = await validateStateTransitionFee(identityTopUpTransition); @@ -328,43 +286,10 @@ describe('validateStateTransitionFeeFactory', () => { expect(result.isValid()).to.be.true(); - expect(calculateStateTransitionFeeMock).to.be.not.called(); - expect(fetchAssetLockTransactionOutputMock).to.be.calledOnceWithExactly( - identityTopUpTransition.getAssetLockProof(), - identityTopUpTransition.getExecutionContext(), - ); - expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnceWithExactly( - identityTopUpTransition.getIdentityId(), - identityTopUpTransition.getExecutionContext(), - ); + expect(stateRepositoryMock.fetchIdentityBalanceWithDebt).to.be.calledOnce(); + expect( + stateRepositoryMock.fetchIdentityBalanceWithDebt.getCall(0).args[0].toBuffer(), + ).to.be.deep.equal(identityId); }); }); - - it('should throw InvalidStateTransitionTypeError on invalid State Transition', async function it() { - const rawStateTransitionMock = { - data: 'sample data', - type: -1, - }; - - const stateTransitionMock = { - getType: this.sinonSandbox.stub().returns(rawStateTransitionMock.type), - toBuffer: this.sinonSandbox.stub().returns(Buffer.alloc(0)), - toObject: this.sinonSandbox.stub().returns(rawStateTransitionMock), - getExecutionContext: this.sinonSandbox.stub().returns(new StateTransitionExecutionContext()), - }; - - try { - await validateStateTransitionFee(stateTransitionMock); - - expect.fail('should throw InvalidStateTransitionTypeError'); - } catch (error) { - expect(error).to.be.an.instanceOf(InvalidStateTransitionTypeError); - expect(error.getType()).to.equal(rawStateTransitionMock.type); - - expect(calculateStateTransitionFeeMock).to.not.be.called(); - expect(stateRepositoryMock.fetchIdentity).to.not.be.called(); - - expect(fetchAssetLockTransactionOutputMock).to.not.be.called(); - } - }); }); diff --git a/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js b/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js index 501a9a94840..d3936e313a1 100644 --- a/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js +++ b/packages/wasm-dpp/test/unit/stateTransition/validation/validateStateTransitionKeySignatureFactory.spec.js @@ -2,7 +2,7 @@ const { Transaction, PrivateKey, Script } = require('@dashevo/dashcore-lib'); const createStateRepositoryMock = require('@dashevo/dpp/lib/test/mocks/createStateRepositoryMock'); const getIdentityCreateTransitionFixture = require('@dashevo/dpp/lib/test/fixtures/getIdentityCreateTransitionFixture'); -const getIdentityTopUpTransitionFixture = require('../../../../lib/test/fixtures/getIdentityTopUpTransitionFixture'); +const getIdentityTopUpTransitionFixture = require('../../../../lib/test/fixtures/getIdentityTopUpTransitionFixtureJs'); const { expectValidationError } = require('../../../../lib/test/expect/expectError'); const { default: loadWasmDpp } = require('../../../../dist'); diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index e5cfcd33d16..f1f6e27f007 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "0.24.0-dev.19", + "version": "0.24.0-dev.27", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "", diff --git a/scripts/pack_dashmate.sh b/scripts/pack_dashmate.sh index f1a04d4e9b6..da0cbb0ac16 100755 --- a/scripts/pack_dashmate.sh +++ b/scripts/pack_dashmate.sh @@ -18,6 +18,13 @@ then exit 1 fi +FLAGS="" + +if [[ "$COMMAND" == "tarballs" ]] +then + FLAGS="--no-xz --targets=linux-arm,linux-x64" +fi + FULL_PATH=$(realpath "$0") DIR_PATH=$(dirname "$FULL_PATH") ROOT_PATH=$(dirname "$DIR_PATH") @@ -31,9 +38,11 @@ mkdir .yarn echo "nodeLinker: node-modules" > .yarnrc.yml yarn install --no-immutable yarn oclif manifest -yarn oclif pack $COMMAND +yarn oclif pack $COMMAND $FLAGS cd .. || exit 1 rm package.tgz +rm -rf package/dist/Release +rm -rf package/dist/Packages cp -R package/dist "$ROOT_PATH/packages/dashmate" # fix for deb package build @@ -41,6 +50,6 @@ sudo chown -R $USER "$ROOT_PATH/packages/dashmate/package" || true sudo chgrp -R $USER "$ROOT_PATH/packages/dashmate/package" || true # remove build folder -rm -rf package || true +rm -rf package echo "Done" diff --git a/yarn.lock b/yarn.lock index c8e8dddf16a..b6fe60de35f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1283,6 +1283,13 @@ __metadata: languageName: node linkType: hard +"@balena/dockerignore@npm:^1.0.2": + version: 1.0.2 + resolution: "@balena/dockerignore@npm:1.0.2" + checksum: 0d39f8fbcfd1a983a44bced54508471ab81aaaa40e2c62b46a9f97eac9d6b265790799f16919216db486331dedaacdde6ecbd6b7abe285d39bc50de111991699 + languageName: node + linkType: hard + "@colors/colors@npm:1.5.0": version: 1.5.0 resolution: "@colors/colors@npm:1.5.0" @@ -1556,12 +1563,12 @@ __metadata: languageName: unknown linkType: soft -"@dashevo/docker-compose@npm:^0.24.1": - version: 0.24.1 - resolution: "@dashevo/docker-compose@npm:0.24.1" +"@dashevo/docker-compose@npm:^0.24.2": + version: 0.24.2 + resolution: "@dashevo/docker-compose@npm:0.24.2" dependencies: - yaml: ^1.10.2 - checksum: 7792e09b5d2d216eb883d0fe2d54e422a4cf277e17af99dd108078ca41aab9b66eccf9eddb2716e752b6cfe183a6c45d2292b42cce881c658afdcb6cd0d5ca3a + yaml: ^2.2.2 + checksum: f8803c8ab5ccdaaa2f33b71c830a5ea7aaa9794a7c6e5698cd42190d7f05d0bc2df3cfb998d59ca3d4526bfb75503003b46f3f454ec5f52a61a21b3e089cb80c languageName: node linkType: hard @@ -1716,9 +1723,9 @@ __metadata: languageName: unknown linkType: soft -"@dashevo/oclif@npm:^1.0.2": - version: 1.0.2 - resolution: "@dashevo/oclif@npm:1.0.2" +"@dashevo/oclif@npm:^1.0.4": + version: 1.0.4 + resolution: "@dashevo/oclif@npm:1.0.4" dependencies: "@oclif/core": ^1.20.4 "@oclif/plugin-help": ^5.1.19 @@ -1740,7 +1747,7 @@ __metadata: yosay: ^2.0.2 bin: oclif: bin/run - checksum: b421acd414231e2691e1dbc31dc40f83245fddd19bba0bd3a269979a9a62e80e12366b88301dda6be3e1a117be901f0c59dff3c48ee870a19f770a8468ee0b87 + checksum: 239edbbb304ddfed4a11064491e10b1d283b4480cda31a50e8c9d08591d10ead6b4cd8803ba41915f10b12401346b646af874ca303729dc7b5362d7903129ee0 languageName: node linkType: hard @@ -5916,13 +5923,10 @@ __metadata: languageName: node linkType: hard -"cpu-features@npm:0.0.2": - version: 0.0.2 - resolution: "cpu-features@npm:0.0.2" - dependencies: - nan: ^2.14.1 - node-gyp: latest - checksum: 15177f9a2d465e4d84390f902c977b34f237dadb29fd8553853b13d906ffe5f15be9f091c72db4f34c71412d5ff4e0e4edf04caebc875b02d1d7ecfce2963299 +"cpu-features@https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.2.1.tgz": + version: 1.2.1 + resolution: "cpu-features@https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.2.1.tgz" + checksum: ee452163dbadcf140a085d1364117ad97b8f7d21711c2ad220fc81735a4f101abee2b63ae70e1b7f5bd8a0f2e9552fcf5c3002009833e6ffb39669dff36898b7 languageName: node linkType: hard @@ -6123,12 +6127,12 @@ __metadata: "@dashevo/dashcore-lib": ~0.20.3 "@dashevo/dashd-rpc": ^18.2.0 "@dashevo/dashpay-contract": "workspace:*" - "@dashevo/docker-compose": ^0.24.1 + "@dashevo/docker-compose": ^0.24.2 "@dashevo/dpns-contract": "workspace:*" "@dashevo/dpp": "workspace:*" "@dashevo/feature-flags-contract": "workspace:*" "@dashevo/masternode-reward-shares-contract": "workspace:*" - "@dashevo/oclif": ^1.0.2 + "@dashevo/oclif": ^1.0.4 "@dashevo/wallet-lib": "workspace:*" "@dashevo/withdrawals-contract": "workspace:*" "@oclif/core": ^1.25.0 @@ -6537,24 +6541,25 @@ __metadata: linkType: hard "docker-modem@npm:^3.0.0": - version: 3.0.3 - resolution: "docker-modem@npm:3.0.3" + version: 3.0.8 + resolution: "docker-modem@npm:3.0.8" dependencies: debug: ^4.1.1 readable-stream: ^3.5.0 split-ca: ^1.0.1 - ssh2: ^1.4.0 - checksum: 4ad495d17a7bbb29f48e3bf8ab74508848a3ca62c2dffc399fc0b9b2d1caccb1be54cc53001d5e0d56069e6cb4a91da4b017240733080b6648a66b40345e1f96 + ssh2: ^1.11.0 + checksum: e3675c9b1ad800be8fb1cb9c5621fbef20a75bfedcd6e01b69808eadd7f0165681e4e30d1700897b788a67dbf4769964fcccd19c3d66f6d2499bb7aede6b34df languageName: node linkType: hard "dockerode@npm:^3.2.0, dockerode@npm:^3.2.1": - version: 3.3.1 - resolution: "dockerode@npm:3.3.1" + version: 3.3.5 + resolution: "dockerode@npm:3.3.5" dependencies: + "@balena/dockerignore": ^1.0.2 docker-modem: ^3.0.0 tar-fs: ~2.0.1 - checksum: 930162ae2d8a1fe0e99d9a5885b09aa438da6274d4a30cb90e73046655dbc90764eb755361a63ba08f167e257c4d649d67bce71f650461a20b97fcde0af05ca5 + checksum: 7f6650422b07fa7ea9d5801f04b1a432634446b5fe37b995b8302b953b64e93abf1bb4596c2fb574ba47aafee685ef2ab959cc86c9654add5a26d09541bbbcc6 languageName: node linkType: hard @@ -10910,12 +10915,12 @@ fsevents@~2.3.2: languageName: node linkType: hard -"nan@npm:^2.14.1, nan@npm:^2.15.0": - version: 2.15.0 - resolution: "nan@npm:2.15.0" +"nan@npm:^2.16.0": + version: 2.17.0 + resolution: "nan@npm:2.17.0" dependencies: node-gyp: latest - checksum: 33e1bb4dfca447fe37d4bb5889be55de154828632c8d38646db67293a21afd61ed9909cdf1b886214a64707d935926c4e60e2b09de9edfc2ad58de31d6ce8f39 + checksum: ec609aeaf7e68b76592a3ba96b372aa7f5df5b056c1e37410b0f1deefbab5a57a922061e2c5b369bae9c7c6b5e6eecf4ad2dac8833a1a7d3a751e0a7c7f849ed languageName: node linkType: hard @@ -13529,20 +13534,20 @@ fsevents@~2.3.2: languageName: node linkType: hard -"ssh2@npm:^1.4.0": - version: 1.5.0 - resolution: "ssh2@npm:1.5.0" +"ssh2@npm:^1.11.0": + version: 1.11.0 + resolution: "ssh2@npm:1.11.0" dependencies: asn1: ^0.2.4 bcrypt-pbkdf: ^1.0.2 - cpu-features: 0.0.2 - nan: ^2.15.0 + cpu-features: ~0.0.4 + nan: ^2.16.0 dependenciesMeta: cpu-features: optional: true nan: optional: true - checksum: 6a2252c12d9587eeb31c499d1d13bb14a255d08243762e1a92b2db76add8912b2c8c25103c79b92e156d598c1e2781c5523b58aa9e85aee06fea365e4cc188bb + checksum: e40cb9f171741a807c170dc555078aa8c49dc93dd36fc9c8be026fce1cfd31f0d37078d9b60a0f2cfb11d0e007ed5407376b72f8a0ef9f2cb89574632bbfb824 languageName: node linkType: hard @@ -15389,10 +15394,10 @@ typescript@^3.9.5: languageName: node linkType: hard -"yaml@npm:^1.10.2": - version: 1.10.2 - resolution: "yaml@npm:1.10.2" - checksum: ce4ada136e8a78a0b08dc10b4b900936912d15de59905b2bf415b4d33c63df1d555d23acb2a41b23cf9fb5da41c256441afca3d6509de7247daa062fd2c5ea5f +"yaml@npm:^2.2.2": + version: 2.2.2 + resolution: "yaml@npm:2.2.2" + checksum: d90c235e099e30094dcff61ba3350437aef53325db4a6bcd04ca96e1bfe7e348b191f6a7a52b5211e2dbc4eeedb22a00b291527da030de7c189728ef3f2b4eb3 languageName: node linkType: hard