diff --git a/.github/workflows/cd-docs.yml b/.github/workflows/cd-docs.yml index 07d8483839..db46b85911 100644 --- a/.github/workflows/cd-docs.yml +++ b/.github/workflows/cd-docs.yml @@ -5,7 +5,7 @@ on: jobs: build: - runs-on: arc-ubuntu-20.04 + runs-on: arc-ubuntu-22.04 defaults: run: working-directory: documentation/docs @@ -18,7 +18,7 @@ jobs: - name: Install Python3 modules run: sudo pip3 install pandas tabulate - name: Install rsync - run: sudo apt-get install rsync + run: sudo apt-get install -y rsync - uses: rlespinasse/github-slug-action@v3.x - name: Setup pnpm uses: pnpm/action-setup@v4.0.0 diff --git a/.github/workflows/ci-binary-config-checker.yml b/.github/workflows/ci-binary-config-checker.yml index 7f4717f883..880466cd64 100644 --- a/.github/workflows/ci-binary-config-checker.yml +++ b/.github/workflows/ci-binary-config-checker.yml @@ -33,7 +33,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [arc-ubuntu-20.04] + platform: [arc-ubuntu-22.04] runs-on: ${{ matrix.platform }} steps: diff --git a/.github/workflows/ci-build-ts.yml b/.github/workflows/ci-build-ts.yml index 934f855c5f..7e67dc42c6 100644 --- a/.github/workflows/ci-build-ts.yml +++ b/.github/workflows/ci-build-ts.yml @@ -10,7 +10,7 @@ on: jobs: build: - runs-on: arc-ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - name: Install rsync @@ -19,7 +19,7 @@ jobs: - uses: rlespinasse/github-slug-action@v3.x - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Setup yarn run: npm install -g yarn - name: Build diff --git a/.github/workflows/ci-build-upload-binaries.yml b/.github/workflows/ci-build-upload-binaries.yml index 5e693bbe69..7df2cd4ad4 100644 --- a/.github/workflows/ci-build-upload-binaries.yml +++ b/.github/workflows/ci-build-upload-binaries.yml @@ -21,7 +21,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [ arc-ubuntu-20.04 ] + platform: [ arc-ubuntu-22.04 ] runs-on: ${{ matrix.platform }} env: diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml index 52ad69314c..10cb457d83 100644 --- a/.github/workflows/ci-build.yml +++ b/.github/workflows/ci-build.yml @@ -38,7 +38,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ arc-ubuntu-20.04, custom-windows-11, custom-runner-mac-m1 ] + os: [ arc-ubuntu-22.04, custom-windows-11, custom-runner-mac-m1 ] runs-on: ${{ matrix.os }} env: CARGO_TERM_COLOR: always diff --git a/.github/workflows/ci-contracts-schema.yml b/.github/workflows/ci-contracts-schema.yml index 17e79bed26..4c03f1a575 100644 --- a/.github/workflows/ci-contracts-schema.yml +++ b/.github/workflows/ci-contracts-schema.yml @@ -11,7 +11,7 @@ on: jobs: check-schema: name: Generate and check schema - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 env: CARGO_TERM_COLOR: always steps: diff --git a/.github/workflows/ci-contracts-upload-binaries.yml b/.github/workflows/ci-contracts-upload-binaries.yml index b582b4c19b..b3acd7f0ac 100644 --- a/.github/workflows/ci-contracts-upload-binaries.yml +++ b/.github/workflows/ci-contracts-upload-binaries.yml @@ -11,7 +11,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [ arc-ubuntu-20.04 ] + platform: [ arc-ubuntu-22.04 ] runs-on: ${{ matrix.platform }} env: diff --git a/.github/workflows/ci-contracts.yml b/.github/workflows/ci-contracts.yml index 7091ceab1a..2814fd0a26 100644 --- a/.github/workflows/ci-contracts.yml +++ b/.github/workflows/ci-contracts.yml @@ -17,7 +17,7 @@ jobs: build: # since it's going to be compiled into wasm, there's absolutely # no point in running CI on different OS-es - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 env: CARGO_TERM_COLOR: always steps: diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml index 36f2191f24..a7e3e13946 100644 --- a/.github/workflows/ci-docs.yml +++ b/.github/workflows/ci-docs.yml @@ -10,7 +10,7 @@ on: jobs: build: - runs-on: arc-ubuntu-20.04 + runs-on: arc-ubuntu-22.04 env: RUSTUP_PERMIT_COPY_RENAME: 1 defaults: @@ -25,7 +25,7 @@ jobs: - name: Install Python3 modules run: sudo pip3 install pandas tabulate - name: Install rsync - run: sudo apt-get install rsync + run: sudo apt-get install -y rsync - uses: rlespinasse/github-slug-action@v3.x - name: Setup pnpm uses: pnpm/action-setup@v4.0.0 diff --git a/.github/workflows/ci-lint-typescript.yml b/.github/workflows/ci-lint-typescript.yml index 1c8586a006..b0f4907834 100644 --- a/.github/workflows/ci-lint-typescript.yml +++ b/.github/workflows/ci-lint-typescript.yml @@ -15,7 +15,7 @@ on: jobs: build: - runs-on: arc-ubuntu-20.04 + runs-on: ubuntu-22.04 env: RUSTUP_PERMIT_COPY_RENAME: 1 steps: @@ -24,7 +24,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Setup yarn run: npm install -g yarn diff --git a/.github/workflows/ci-nym-network-explorer.yml b/.github/workflows/ci-nym-network-explorer.yml deleted file mode 100644 index b1cb2d9de3..0000000000 --- a/.github/workflows/ci-nym-network-explorer.yml +++ /dev/null @@ -1,92 +0,0 @@ -name: ci-nym-network-explorer - -on: - workflow_dispatch: - push: - paths: - - 'explorer/**' - - '.github/workflows/ci-nym-network-explorer.yml' - -defaults: - run: - working-directory: explorer - -jobs: - build: - runs-on: custom-linux - steps: - - uses: actions/checkout@v4 - - name: Install rsync - run: sudo apt-get install rsync - continue-on-error: true - - uses: rlespinasse/github-slug-action@v3.x - - uses: actions/setup-node@v4 - with: - node-version: 18 - - name: Setup yarn - run: npm install -g yarn - continue-on-error: true - - name: Build shared packages - run: cd .. && yarn && yarn build - - name: Set environment from the example - run: cp .env.prod .env -# - run: yarn test -# continue-on-error: true - - run: yarn && yarn build - continue-on-error: true - - run: yarn storybook:build - name: Build storybook - - name: Deploy branch to CI www - continue-on-error: true - uses: easingthemes/ssh-deploy@main - env: - SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }} - ARGS: "-rltgoDzvO --delete" - SOURCE: "explorer/dist/" - REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }} - REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }} - TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/network-explorer-${{ env.GITHUB_REF_SLUG }} - EXCLUDE: "/dist/, /node_modules/" - - name: Deploy storybook to CI www - continue-on-error: true - uses: easingthemes/ssh-deploy@main - env: - SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }} - ARGS: "-rltgoDzvO --delete" - SOURCE: "explorer/storybook-static/" - REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }} - REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }} - TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/ne-sb-${{ env.GITHUB_REF_SLUG }} - EXCLUDE: "/dist/, /node_modules/" - - name: Matrix - Node Install - run: npm install - working-directory: .github/workflows/support-files - - name: Matrix - Send Notification - env: - NYM_NOTIFICATION_KIND: network-explorer - NYM_PROJECT_NAME: "Network Explorer" - NYM_CI_WWW_BASE: "${{ secrets.NYM_CI_WWW_BASE }}" - NYM_CI_WWW_LOCATION: "network-explorer-${{ env.GITHUB_REF_SLUG }}" - NYM_CI_WWW_LOCATION_STORYBOOK: "ne-sb-${{ env.GITHUB_REF_SLUG }}" - GIT_COMMIT_MESSAGE: "${{ github.event.head_commit.message }}" - GIT_BRANCH: "${GITHUB_REF##*/}" - IS_SUCCESS: "${{ job.status == 'success' }}" - MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}" - MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}" - MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}" - MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}" - MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}" - uses: docker://keybaseio/client:stable-node - with: - args: .github/workflows/support-files/notifications/entry_point.sh - - name: Deploy - if: github.event_name == 'workflow_dispatch' - uses: easingthemes/ssh-deploy@main - env: - SSH_PRIVATE_KEY: ${{ secrets.CD_PROD_NE_SSH_PRIVATE_KEY }} - ARGS: "-rltgoDzvO --delete" - SOURCE: "explorer/dist/" - REMOTE_HOST: ${{ secrets.CD_PROD_NE_REMOTE_HOST }} - REMOTE_USER: ${{ secrets.CD_PROD_NE_REMOTE_USER }} - TARGET: ${{ secrets.CD_PROD_NE_REMOTE_TARGET }} - EXCLUDE: "/dist/, /node_modules/" diff --git a/.github/workflows/ci-nym-wallet-rust.yml b/.github/workflows/ci-nym-wallet-rust.yml index bfa0ac1962..71cd6d7e90 100644 --- a/.github/workflows/ci-nym-wallet-rust.yml +++ b/.github/workflows/ci-nym-wallet-rust.yml @@ -11,7 +11,7 @@ on: jobs: build: - runs-on: arc-ubuntu-20.04 + runs-on: arc-ubuntu-22.04 env: CARGO_TERM_COLOR: always RUSTUP_PERMIT_COPY_RENAME: 1 diff --git a/.github/workflows/ci-sdk-wasm.yml b/.github/workflows/ci-sdk-wasm.yml index 8f9eaeeeba..5bfd73bc3a 100644 --- a/.github/workflows/ci-sdk-wasm.yml +++ b/.github/workflows/ci-sdk-wasm.yml @@ -11,7 +11,7 @@ on: jobs: wasm: - runs-on: arc-ubuntu-20.04 + runs-on: arc-ubuntu-22.04 env: CARGO_TERM_COLOR: always RUSTUP_PERMIT_COPY_RENAME: 1 @@ -20,7 +20,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - uses: actions-rs/toolchain@v1 with: diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index c5c68a4614..5c02b6d109 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -11,7 +11,7 @@ jobs: fail-fast: false matrix: rust: [stable, beta] - os: [ubuntu-20.04, windows-latest, macos-latest] + os: [ubuntu-22.04, windows-latest, macos-latest] runs-on: ${{ matrix.os }} env: CARGO_TERM_COLOR: always @@ -23,7 +23,7 @@ jobs: - name: Install Dependencies (Linux) run: sudo apt-get update && sudo apt-get install -y build-essential curl wget libssl-dev libudev-dev squashfs-tools protobuf-compiler - if: matrix.os == 'ubuntu-20.04' + if: matrix.os == 'ubuntu-22.04' - name: Install Rust toolchain uses: actions-rs/toolchain@v1 @@ -59,7 +59,7 @@ jobs: # To avoid running out of disk space, skip generating debug symbols - name: Set debug to false (unix) - if: matrix.os == 'ubuntu-20.04' || matrix.os == 'macos-latest' + if: matrix.os == 'ubuntu-22.04' || matrix.os == 'macos-latest' run: | sed -i.bak 's/\[profile.dev\]/\[profile.dev\]\ndebug = false/' Cargo.toml git diff @@ -106,7 +106,7 @@ jobs: uses: actions/setup-node@v4 if: env.WORKFLOW_CONCLUSION == 'failure' with: - node-version: 18 + node-version: 20 - name: Matrix - Node Install if: env.WORKFLOW_CONCLUSION == 'failure' run: npm install diff --git a/.github/workflows/nightly-nym-wallet-build.yml b/.github/workflows/nightly-nym-wallet-build.yml index 232a1273ef..ec0151a43a 100644 --- a/.github/workflows/nightly-nym-wallet-build.yml +++ b/.github/workflows/nightly-nym-wallet-build.yml @@ -10,7 +10,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-20.04, macos-latest, windows-latest] + os: [ubuntu-22.04, macos-latest, windows-latest] runs-on: ${{ matrix.os }} env: CARGO_TERM_COLOR: always @@ -22,7 +22,7 @@ jobs: - name: Install Dependencies (Linux) run: sudo apt-get update && sudo apt-get install -y libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev squashfs-tools - if: matrix.os == 'ubuntu-20.04' + if: matrix.os == 'ubuntu-22.04' - name: Install rust toolchain uses: actions-rs/toolchain@v1 @@ -68,7 +68,7 @@ jobs: uses: actions/setup-node@v4 if: env.WORKFLOW_CONCLUSION == 'failure' with: - node-version: 18 + node-version: 20 - name: Matrix - Node Install if: env.WORKFLOW_CONCLUSION == 'failure' run: npm install diff --git a/.github/workflows/nightly-security-audit.yml b/.github/workflows/nightly-security-audit.yml index 76806575e0..db975e2384 100644 --- a/.github/workflows/nightly-security-audit.yml +++ b/.github/workflows/nightly-security-audit.yml @@ -5,7 +5,7 @@ on: - cron: '5 9 * * *' jobs: cargo-deny: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Checkout repository code uses: actions/checkout@v4 @@ -38,7 +38,7 @@ jobs: - name: install npm uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Matrix - Node Install run: npm install working-directory: .github/workflows/support-files diff --git a/.github/workflows/publish-nym-binaries.yml b/.github/workflows/publish-nym-binaries.yml index b28f118ec7..4e8bcb2966 100644 --- a/.github/workflows/publish-nym-binaries.yml +++ b/.github/workflows/publish-nym-binaries.yml @@ -19,9 +19,7 @@ jobs: if: ${{ (startsWith(github.ref, 'refs/tags/nym-binaries-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }} strategy: fail-fast: false - matrix: - platform: [custom-ubuntu-20.04] - runs-on: ${{ matrix.platform }} + runs-on: arc-ubuntu-22.04 outputs: release_id: ${{ steps.create-release.outputs.id }} diff --git a/.github/workflows/publish-nym-wallet-macos.yml b/.github/workflows/publish-nym-wallet-macos.yml index 40077d2069..037cc68820 100644 --- a/.github/workflows/publish-nym-wallet-macos.yml +++ b/.github/workflows/publish-nym-wallet-macos.yml @@ -31,10 +31,12 @@ jobs: uses: actions/setup-node@v4 with: node-version: 21 + - name: Install Rust stable uses: actions-rs/toolchain@v1 with: toolchain: stable + - name: Install the Apple developer certificate for code signing env: APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} @@ -64,11 +66,25 @@ jobs: fileName: '.env' encodedString: ${{ secrets.WALLET_ADMIN_ADDRESS }} + - name: Add Rust target for x86_64-apple-darwin + run: rustup target add x86_64-apple-darwin + + - name: Set Cargo build target to x86_64 + run: echo "CARGO_BUILD_TARGET=x86_64-apple-darwin" >> $GITHUB_ENV + + - name: Yarn cache clean + shell: bash + run: cd .. && yarn cache clean + - name: Install project dependencies shell: bash run: cd .. && yarn --network-timeout 100000 - - name: Install app dependencies and build it + - name: Yarn build + shell: bash + run: cd .. && yarn build + + - name: Install dependencies and build it env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }} @@ -80,27 +96,29 @@ jobs: APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} - run: yarn && yarn build + run: | + yarn build-macx86 - name: Upload Artifact uses: actions/upload-artifact@v4 with: name: nym-wallet.app.tar.gz - path: nym-wallet/target/release/bundle/macos/nym-wallet.app.tar.gz + path: nym-wallet/target/x86_64-apple-darwin/release/bundle/macos/nym-wallet.app.tar.gz retention-days: 5 - name: Clean up keychain if: ${{ always() }} run: | security delete-keychain $RUNNER_TEMP/app-signing.keychain-db + - id: create-release name: Upload to release based on tag name uses: softprops/action-gh-release@v2 if: github.event_name == 'release' with: files: | - nym-wallet/target/release/bundle/dmg/*.dmg - nym-wallet/target/release/bundle/macos/*.app.tar.gz* + nym-wallet/target/x86_64-apple-darwin/release/bundle/dmg/*.dmg + nym-wallet/target/x86_64-apple-darwin/release/bundle/macos/*.app.tar.gz* - name: Deploy artifacts to CI www continue-on-error: true @@ -108,7 +126,7 @@ jobs: env: SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }} ARGS: "-avzr" - SOURCE: "nym-wallet/target/release/bundle/macos/nym-wallet.app.tar.gz" + SOURCE: "nym-wallet/target/x86_64-apple-darwin/release/bundle/macos/nym-wallet.app.tar.gz" REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }} REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }} TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/builds/${{ github.ref_name }}/nym-wallet diff --git a/.github/workflows/publish-nym-wallet-ubuntu.yml b/.github/workflows/publish-nym-wallet-ubuntu.yml index 5f3ecba624..86554112fe 100644 --- a/.github/workflows/publish-nym-wallet-ubuntu.yml +++ b/.github/workflows/publish-nym-wallet-ubuntu.yml @@ -14,7 +14,7 @@ jobs: strategy: fail-fast: false matrix: - platform: [custom-ubuntu-20.04] + platform: [custom-ubuntu-22.04] runs-on: ${{ matrix.platform }} outputs: diff --git a/.github/workflows/publish-nyms5-android-apk.yml b/.github/workflows/publish-nyms5-android-apk.yml index b1e6d1ad64..2bdaf2b762 100644 --- a/.github/workflows/publish-nyms5-android-apk.yml +++ b/.github/workflows/publish-nyms5-android-apk.yml @@ -12,7 +12,7 @@ on: jobs: build: name: Build APK - runs-on: custom-ubuntu-20.04 + runs-on: custom-ubuntu-22.04 env: ANDROID_HOME: ${{ github.workspace }}/android-sdk NDK_VERSION: 25.2.9519653 diff --git a/.github/workflows/publish-sdk-npm.yml b/.github/workflows/publish-sdk-npm.yml index c3d4ef3fc7..173f94bcff 100644 --- a/.github/workflows/publish-sdk-npm.yml +++ b/.github/workflows/publish-sdk-npm.yml @@ -4,14 +4,14 @@ on: jobs: publish: - runs-on: arc-ubuntu-20.04 + runs-on: arc-ubuntu-22.04 steps: - uses: actions/checkout@v4 - name: Install Node uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 registry-url: "https://registry.npmjs.org" - name: Setup yarn diff --git a/.github/workflows/release-calculate-hash.yml b/.github/workflows/release-calculate-hash.yml index f1a53c09c7..6ea33e821a 100644 --- a/.github/workflows/release-calculate-hash.yml +++ b/.github/workflows/release-calculate-hash.yml @@ -23,7 +23,7 @@ jobs: uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - uses: nymtech/nym/.github/actions/nym-hash-releases@develop env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index c2b9e4e654..bd16457c60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,32 @@ Post 1.0.0 release, the changelog format is based on [Keep a Changelog](https:// ## [Unreleased] +## [2025.7-tex] (2025-04-14) + +- Expand /v3/nym-nodes with geodata ([#5686]) +- chore: clippy for 1.86 ([#5685]) +- Featrure: Bash scripts to init and configure VMs conveniently and update docs ([#5681]) +- Update node versions in CI ([#5677]) +- build(deps): bump the patch-updates group across 1 directory with 8 updates ([#5668]) +- Update log crate ([#5667]) +- Minor fixes involving key cloning and hashing ([#5664]) +- mix throughput tester ([#5661]) +- build(deps): bump blake3 from 1.6.1 to 1.7.0 ([#5658]) +- build(deps): bump elliptic from 6.5.5 to 6.6.1 ([#5483]) +- Move all workflows on ubuntu-20 to ubuntu-22 ([#5455]) + +[#5686]: https://github.com/nymtech/nym/pull/5686 +[#5685]: https://github.com/nymtech/nym/pull/5685 +[#5681]: https://github.com/nymtech/nym/pull/5681 +[#5677]: https://github.com/nymtech/nym/pull/5677 +[#5668]: https://github.com/nymtech/nym/pull/5668 +[#5667]: https://github.com/nymtech/nym/pull/5667 +[#5664]: https://github.com/nymtech/nym/pull/5664 +[#5661]: https://github.com/nymtech/nym/pull/5661 +[#5658]: https://github.com/nymtech/nym/pull/5658 +[#5483]: https://github.com/nymtech/nym/pull/5483 +[#5455]: https://github.com/nymtech/nym/pull/5455 + ## [2025.6-chuckles] (2025-03-31) - Remove Google public DNS ([#5660]) diff --git a/Cargo.lock b/Cargo.lock index 102eb1c295..7686a9e431 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -869,9 +869,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "675f87afced0413c9bb02843499dbbd3882a237645883f71a2b59644a6d2f753" +checksum = "b17679a8d69b6d7fd9cd9801a536cec9fa5e5970b69f9d4747f70b39b031f5e7" dependencies = [ "arrayref", "arrayvec", @@ -1184,9 +1184,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.32" +version = "4.5.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6088f3ae8c3608d19260cd7445411865a485688711b78b5be70d78cd96136f83" +checksum = "e958897981290da2a852763fe9cdb89cd36977a5d729023127095fa94d95e2ff" dependencies = [ "clap_builder", "clap_derive", @@ -1194,9 +1194,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.32" +version = "4.5.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a7ef7f676155edfb82daa97f99441f3ebf4a58d5e32f295a56259f1b6facc8" +checksum = "83b0f35019843db2160b5bb19ae09b4e6411ac33fc6a712003c33e03090e2489" dependencies = [ "anstream", "anstyle", @@ -1206,9 +1206,9 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.46" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5c5508ea23c5366f77e53f5a0070e5a84e51687ec3ef9e0464c86dc8d13ce98" +checksum = "c06f5378ea264ad4f82bbc826628b5aad714a75abf6ece087e923010eb937fb6" dependencies = [ "clap", ] @@ -2016,9 +2016,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" dependencies = [ "powerfmt", "serde", @@ -2805,8 +2805,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.13.3+wasi-0.2.2", + "wasm-bindgen", "windows-targets 0.52.6", ] @@ -3402,19 +3404,20 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.26.0" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http 1.3.1", "hyper 1.6.0", "hyper-util", - "rustls 0.22.4", + "rustls 0.23.25", "rustls-pki-types", "tokio", - "tokio-rustls 0.25.0", + "tokio-rustls 0.26.2", "tower-service", + "webpki-roots 0.26.8", ] [[package]] @@ -3728,6 +3731,7 @@ dependencies = [ "number_prefix", "portable-atomic", "unicode-width 0.2.0", + "vt100", "web-time", ] @@ -3816,7 +3820,7 @@ dependencies = [ "socket2", "widestring", "windows-sys 0.48.0", - "winreg 0.50.0", + "winreg", ] [[package]] @@ -4129,9 +4133,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" [[package]] name = "log" -version = "0.4.26" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "loom" @@ -4681,7 +4685,7 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "nym-api" -version = "1.1.55" +version = "1.1.56" dependencies = [ "anyhow", "async-trait", @@ -4740,7 +4744,7 @@ dependencies = [ "pin-project", "rand 0.8.5", "rand_chacha 0.3.1", - "reqwest 0.12.4", + "reqwest 0.12.15", "schemars", "semver 1.0.26", "serde", @@ -4908,6 +4912,7 @@ dependencies = [ "schemars", "serde", "serde_json", + "tracing", "tracing-opentelemetry", "tracing-subscriber", "tracing-tree", @@ -4932,7 +4937,7 @@ dependencies = [ [[package]] name = "nym-cli" -version = "1.1.52" +version = "1.1.53" dependencies = [ "anyhow", "base64 0.22.1", @@ -5015,7 +5020,7 @@ dependencies = [ [[package]] name = "nym-client" -version = "1.1.52" +version = "1.1.53" dependencies = [ "bs58", "clap", @@ -5311,7 +5316,7 @@ dependencies = [ "nym-network-defaults", "nym-validator-client", "rand 0.8.5", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "sqlx", @@ -5342,7 +5347,7 @@ dependencies = [ "nym-http-api-client", "nym-http-api-common", "nym-serde-helpers", - "reqwest 0.12.4", + "reqwest 0.12.15", "schemars", "serde", "serde_json", @@ -5538,7 +5543,7 @@ dependencies = [ name = "nym-exit-policy" version = "0.1.0" dependencies = [ - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "thiserror 2.0.12", @@ -5563,7 +5568,7 @@ name = "nym-explorer-client" version = "0.1.0" dependencies = [ "nym-explorer-api-requests", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "thiserror 2.0.12", "tokio", @@ -5774,7 +5779,7 @@ dependencies = [ "mime", "nym-bin-common", "once_cell", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "thiserror 2.0.12", @@ -5889,7 +5894,7 @@ dependencies = [ "nym-wireguard", "nym-wireguard-types", "rand 0.8.5", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "thiserror 2.0.12", @@ -6038,7 +6043,7 @@ dependencies = [ "petgraph", "rand 0.8.5", "rand_chacha 0.3.1", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "tokio", @@ -6050,7 +6055,7 @@ dependencies = [ [[package]] name = "nym-network-requester" -version = "1.1.53" +version = "1.1.54" dependencies = [ "addr", "anyhow", @@ -6085,7 +6090,7 @@ dependencies = [ "publicsuffix", "rand 0.8.5", "regex", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "sqlx", @@ -6101,26 +6106,29 @@ dependencies = [ [[package]] name = "nym-node" -version = "1.8.0" +version = "1.9.0" dependencies = [ "anyhow", "arc-swap", + "arrayref", "async-trait", "axum 0.7.9", - "axum-extra", "bip39", + "blake2 0.8.1", "bs58", "cargo_metadata 0.18.1", "celes", + "chacha", "clap", "colored", + "csv", "cupid", - "dashmap", "futures", - "headers", "human-repr", "humantime-serde", + "indicatif", "ipnetwork", + "lioness", "nym-authenticator", "nym-bin-common", "nym-client-core-config-types", @@ -6142,6 +6150,8 @@ dependencies = [ "nym-sphinx-addressing", "nym-sphinx-forwarding", "nym-sphinx-framing", + "nym-sphinx-params", + "nym-sphinx-routing", "nym-sphinx-types", "nym-task", "nym-topology", @@ -6151,10 +6161,8 @@ dependencies = [ "nym-wireguard", "nym-wireguard-types", "rand 0.8.5", - "semver 1.0.26", "serde", "serde_json", - "si-scale", "sysinfo", "thiserror 2.0.12", "time", @@ -6163,6 +6171,7 @@ dependencies = [ "toml 0.8.20", "tower-http", "tracing", + "tracing-indicatif", "tracing-subscriber", "url", "utoipa", @@ -6255,7 +6264,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "regex", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "serde_json_path", @@ -6284,7 +6293,7 @@ dependencies = [ "chrono", "nym-crypto", "nym-http-api-client", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "tracing", @@ -6433,7 +6442,7 @@ dependencies = [ "parking_lot", "pretty_env_logger", "rand 0.8.5", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "tap", "tempfile", @@ -6488,7 +6497,7 @@ dependencies = [ [[package]] name = "nym-socks5-client" -version = "1.1.52" +version = "1.1.53" dependencies = [ "bs58", "clap", @@ -6542,7 +6551,7 @@ dependencies = [ "nym-validator-client", "pin-project", "rand 0.8.5", - "reqwest 0.12.4", + "reqwest 0.12.15", "schemars", "serde", "tap", @@ -6827,7 +6836,7 @@ dependencies = [ "nym-sphinx-routing", "nym-sphinx-types", "rand 0.8.5", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "thiserror 2.0.12", @@ -6865,7 +6874,7 @@ dependencies = [ "nym-mixnet-contract-common", "nym-validator-client", "nym-vesting-contract-common", - "reqwest 0.12.4", + "reqwest 0.12.15", "schemars", "serde", "serde_json", @@ -6913,7 +6922,7 @@ dependencies = [ "nym-serde-helpers", "nym-vesting-contract-common", "prost 0.13.5", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "sha2 0.10.8", @@ -7092,7 +7101,7 @@ dependencies = [ [[package]] name = "nymvisor" -version = "0.1.17" +version = "0.1.18" dependencies = [ "anyhow", "bytes", @@ -7108,7 +7117,7 @@ dependencies = [ "nym-bin-common", "nym-config", "nym-task", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "sha2 0.10.8", @@ -7135,7 +7144,7 @@ dependencies = [ "nym-task", "nym-validator-client", "nyxd-scraper", - "reqwest 0.12.4", + "reqwest 0.12.15", "schemars", "serde", "sqlx", @@ -7186,9 +7195,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.1" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "oorandom" @@ -7934,6 +7943,60 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" +[[package]] +name = "quinn" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.25", + "socket2", + "thiserror 2.0.12", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc" +dependencies = [ + "bytes", + "getrandom 0.3.1", + "rand 0.9.0", + "ring", + "rustc-hash", + "rustls 0.23.25", + "rustls-pki-types", + "slab", + "thiserror 2.0.12", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "quote" version = "1.0.40" @@ -8142,14 +8205,14 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.50.0", + "winreg", ] [[package]] name = "reqwest" -version = "0.12.4" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "async-compression", "base64 0.22.1", @@ -8160,7 +8223,7 @@ dependencies = [ "http-body 1.0.1", "http-body-util", "hyper 1.6.0", - "hyper-rustls 0.26.0", + "hyper-rustls 0.27.5", "hyper-util", "ipnet", "js-sys", @@ -8169,17 +8232,19 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.22.4", + "quinn", + "rustls 0.23.25", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 0.1.2", + "sync_wrapper 1.0.2", "tokio", - "tokio-rustls 0.25.0", + "tokio-rustls 0.26.2", "tokio-socks", "tokio-util", + "tower 0.5.2", "tower-service", "url", "wasm-bindgen", @@ -8187,7 +8252,7 @@ dependencies = [ "wasm-streams", "web-sys", "webpki-roots 0.26.8", - "winreg 0.52.0", + "windows-registry", ] [[package]] @@ -8465,6 +8530,20 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls" +version = "0.23.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.103.1", + "subtle 2.6.1", + "zeroize", +] + [[package]] name = "rustls-native-certs" version = "0.6.3" @@ -8513,6 +8592,9 @@ name = "rustls-pki-types" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +dependencies = [ + "web-time", +] [[package]] name = "rustls-webpki" @@ -8535,6 +8617,17 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.103.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.19" @@ -9578,6 +9671,9 @@ name = "sync_wrapper" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] [[package]] name = "synstructure" @@ -9650,9 +9746,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.19.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488960f40a3fd53d72c2a29a58722561dee8afdd175bd88e3db4677d7b2ba600" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ "fastrand 2.3.0", "getrandom 0.3.1", @@ -9896,9 +9992,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.39" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -9914,15 +10010,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.20" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -10050,6 +10146,16 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls 0.23.25", + "tokio", +] + [[package]] name = "tokio-socks" version = "0.5.2" @@ -10319,6 +10425,18 @@ dependencies = [ "tracing", ] +[[package]] +name = "tracing-indicatif" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8201ca430e0cd893ef978226fd3516c06d9c494181c8bf4e5b32e30ed4b40aa1" +dependencies = [ + "indicatif", + "tracing", + "tracing-core", + "tracing-subscriber", +] + [[package]] name = "tracing-log" version = "0.1.4" @@ -10603,9 +10721,9 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "uniffi" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba62a57e90f9baed5ad02a71a0870180fa1cc35499093b2d21be2edfb68ec0f7" +checksum = "fe34585ac0275accf6c284d0080cc2840f3898c551cda869ec291b5a4218712c" dependencies = [ "anyhow", "camino", @@ -10619,9 +10737,9 @@ dependencies = [ [[package]] name = "uniffi_bindgen" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2242f35214f1e0e3b47c495d340c69f649f9a9ece3a943a29e275686cc884533" +checksum = "1a792af1424cc8b3c43b44c1a6cb7935ed1fbe5584a74f70e8bab9799740266d" dependencies = [ "anyhow", "camino", @@ -10642,9 +10760,9 @@ dependencies = [ [[package]] name = "uniffi_build" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c887a6c9a2857d8dc2ab0c8d578e8aa4978145b4fd65ed44296341e89aebc3cc" +checksum = "00c4138211f2ae951018fcce6a978e1fcd1a47c3fd0bc0d5472a520520060db1" dependencies = [ "anyhow", "camino", @@ -10653,22 +10771,21 @@ dependencies = [ [[package]] name = "uniffi_core" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad9fbdeb7ae4daf8d0f7704a3b638c37018eb16bb701e30fa17a2dd3e2d39c1" +checksum = "c18baace68a52666d33d12d73ca335ecf27a302202cefb53b1f974512bb72417" dependencies = [ "anyhow", "bytes", "once_cell", - "paste", "static_assertions", ] [[package]] name = "uniffi_internal_macros" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9dba1d78b9ce429439891089c223478043d52a1c3176a0fcea2b5573a7fcf" +checksum = "f9902d4ed16c65e6c0222241024dd0bfeed07ea3deb7c470eb175e5f5ef406cd" dependencies = [ "quote", "syn 2.0.98", @@ -10676,9 +10793,9 @@ dependencies = [ [[package]] name = "uniffi_macros" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78dd5f8eefba5898b901086f5e7916da67b9a5286a01cc44e910cd75fa37c630" +checksum = "9d82c82ef945c51082d8763635334b994e63e77650f09d0fae6d28dd08b1de83" dependencies = [ "camino", "fs-err", @@ -10693,9 +10810,9 @@ dependencies = [ [[package]] name = "uniffi_meta" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5965b1d4ffacef1eaa72fef9c00d2491641e87ad910f6c5859b9c503ddb16a" +checksum = "8d6027b971c2aa86350dd180aee9819729c7b99bacd381534511ff29d2c09cea" dependencies = [ "anyhow", "siphasher 0.3.11", @@ -10704,9 +10821,9 @@ dependencies = [ [[package]] name = "uniffi_udl" -version = "0.29.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279b82bac9a382c796a0d210bb8354a0b813499b28aa1de046c85d78ca389805" +checksum = "52300b7a4ab02dc159a038a13d5bfe27aefbad300d91b0b501b3dda094c1e0a2" dependencies = [ "anyhow", "textwrap", @@ -10914,6 +11031,39 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vt100" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84cd863bf0db7e392ba3bd04994be3473491b31e66340672af5d11943c6274de" +dependencies = [ + "itoa", + "log", + "unicode-width 0.1.14", + "vte", +] + +[[package]] +name = "vte" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197" +dependencies = [ + "arrayvec", + "utf8parse", + "vte_generate_state_changes", +] + +[[package]] +name = "vte_generate_state_changes" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e369bee1b05d510a7b4ed645f5faa90619e05437111783ea5848f28d97d3c2e" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "waker-fn" version = "1.2.0" @@ -11298,7 +11448,7 @@ dependencies = [ "windows-implement 0.58.0", "windows-interface 0.58.0", "windows-result 0.2.0", - "windows-strings", + "windows-strings 0.1.0", "windows-targets 0.52.6", ] @@ -11352,6 +11502,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result 0.3.1", + "windows-strings 0.3.1", + "windows-targets 0.53.0", +] + [[package]] name = "windows-result" version = "0.1.2" @@ -11370,6 +11531,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-result" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06374efe858fab7e4f881500e6e86ec8bc28f9462c47e5a9941a0142ad86b189" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-strings" version = "0.1.0" @@ -11380,6 +11550,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -11455,13 +11634,29 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -11480,6 +11675,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -11498,6 +11699,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -11516,12 +11723,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -11540,6 +11759,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -11558,6 +11783,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -11576,6 +11807,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -11594,6 +11831,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" version = "0.7.3" @@ -11613,16 +11856,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wit-bindgen-rt" version = "0.33.0" @@ -11842,7 +12075,7 @@ dependencies = [ "nym-crypto", "nym-http-api-client", "rand 0.8.5", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "thiserror 2.0.12", "tokio", diff --git a/Cargo.toml b/Cargo.toml index b79d83bc4f..15a2722b85 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -203,7 +203,7 @@ bincode = "1.3.3" bip39 = { version = "2.0.0", features = ["zeroize"] } bit-vec = "0.7.0" # can we unify those? bitvec = "1.0.0" -blake3 = "1.6.1" +blake3 = "1.7.0" bloomfilter = "1.0.14" bs58 = "0.5.1" bytecodec = "0.4.15" @@ -215,7 +215,7 @@ chacha20 = "0.9.0" chacha20poly1305 = "0.10.1" chrono = "0.4.40" cipher = "0.4.3" -clap = "4.5.32" +clap = "4.5.34" clap_complete = "4.5" clap_complete_fig = "4.5" colored = "2.2" @@ -283,7 +283,7 @@ moka = { version = "0.12", features = ["future"] } nix = "0.27.1" notify = "5.1.0" okapi = "0.7.0" -once_cell = "1.21.1" +once_cell = "1.21.3" opentelemetry = "0.19.0" opentelemetry-jaeger = "0.18.0" parking_lot = "0.12.3" @@ -302,7 +302,7 @@ rand_pcg = "0.3.1" rand_seeder = "0.2.3" rayon = "1.5.1" regex = "1.10.6" -reqwest = { version = "0.12.4", default-features = false } +reqwest = { version = "0.12.15", default-features = false } rocket = "0.5.0" rocket_cors = "0.6.0" rocket_okapi = "0.8.0" @@ -331,7 +331,7 @@ tap = "1.0.1" tar = "0.4.44" tempfile = "3.19" thiserror = "2.0" -time = "0.3.39" +time = "0.3.41" tokio = "1.44" tokio-postgres = "0.7" tokio-stream = "0.1.17" @@ -347,9 +347,10 @@ tracing-log = "0.2" tracing-opentelemetry = "0.19.0" tracing-subscriber = "0.3.19" tracing-tree = "0.2.2" +tracing-indicatif = "0.3.9" ts-rs = "10.1.0" tungstenite = { version = "0.20.1", default-features = false } -uniffi = "0.29.0" +uniffi = "0.29.1" uniffi_build = "0.29.0" url = "2.5" utoipa = "5.2" diff --git a/clients/native/Cargo.toml b/clients/native/Cargo.toml index 50494b9d15..a626cc874a 100644 --- a/clients/native/Cargo.toml +++ b/clients/native/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-client" -version = "1.1.52" +version = "1.1.53" authors = ["Dave Hrycyszyn ", "Jędrzej Stuczyński "] description = "Implementation of the Nym Client" edition = "2021" diff --git a/clients/socks5/Cargo.toml b/clients/socks5/Cargo.toml index bd45a6e1e6..94ed60ecf0 100644 --- a/clients/socks5/Cargo.toml +++ b/clients/socks5/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-socks5-client" -version = "1.1.52" +version = "1.1.53" authors = ["Dave Hrycyszyn "] description = "A SOCKS5 localhost proxy that converts incoming messages to Sphinx and sends them to a Nym address" edition = "2021" diff --git a/common/authenticator-requests/src/v1/registration.rs b/common/authenticator-requests/src/v1/registration.rs index 4e71f0f84f..6aef222026 100644 --- a/common/authenticator-requests/src/v1/registration.rs +++ b/common/authenticator-requests/src/v1/registration.rs @@ -13,7 +13,7 @@ use std::{fmt, ops::Deref, str::FromStr}; #[cfg(feature = "verify")] use hmac::{Hmac, Mac}; #[cfg(feature = "verify")] -use nym_crypto::asymmetric::encryption::PrivateKey; +use nym_crypto::asymmetric::encryption::{PrivateKey, PublicKey}; #[cfg(feature = "verify")] use sha2::Sha256; @@ -82,16 +82,14 @@ impl GatewayClient { private_ip: IpAddr, nonce: u64, ) -> Self { - // convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek - #[allow(clippy::expect_used)] - let static_secret = x25519_dalek::StaticSecret::from(local_secret.to_bytes()); - let local_public: x25519_dalek::PublicKey = (&static_secret).into(); + let local_public = PublicKey::from(local_secret); + let remote_public = PublicKey::from(remote_public); - let dh = static_secret.diffie_hellman(&remote_public); + let dh = local_secret.diffie_hellman(&remote_public); // TODO: change that to use our nym_crypto::hmac module instead #[allow(clippy::expect_used)] - let mut mac = HmacSha256::new_from_slice(dh.as_bytes()) + let mut mac = HmacSha256::new_from_slice(&dh[..]) .expect("x25519 shared secret is always 32 bytes long"); mac.update(local_public.as_bytes()); @@ -99,7 +97,7 @@ impl GatewayClient { mac.update(&nonce.to_le_bytes()); GatewayClient { - pub_key: PeerPublicKey::new(local_public), + pub_key: PeerPublicKey::new(local_public.into()), private_ip, mac: ClientMac(mac.finalize().into_bytes().to_vec()), } @@ -109,11 +107,8 @@ impl GatewayClient { // Client should perform this step when generating its payload, using its own WG PK #[cfg(feature = "verify")] pub fn verify(&self, gateway_key: &PrivateKey, nonce: u64) -> Result<(), Error> { - // convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek - #[allow(clippy::expect_used)] - let static_secret = x25519_dalek::StaticSecret::from(gateway_key.to_bytes()); - - let dh = static_secret.diffie_hellman(&self.pub_key); + // use gateways key as a ref to an x25519_dalek key + let dh = (gateway_key.as_ref()).diffie_hellman(&self.pub_key); // TODO: change that to use our nym_crypto::hmac module instead #[allow(clippy::expect_used)] diff --git a/common/authenticator-requests/src/v2/registration.rs b/common/authenticator-requests/src/v2/registration.rs index f3aa22d749..4d387e8b5c 100644 --- a/common/authenticator-requests/src/v2/registration.rs +++ b/common/authenticator-requests/src/v2/registration.rs @@ -14,7 +14,7 @@ use std::{fmt, ops::Deref, str::FromStr}; #[cfg(feature = "verify")] use hmac::{Hmac, Mac}; #[cfg(feature = "verify")] -use nym_crypto::asymmetric::encryption::PrivateKey; +use nym_crypto::asymmetric::encryption::{PrivateKey, PublicKey}; #[cfg(feature = "verify")] use sha2::Sha256; @@ -91,16 +91,14 @@ impl GatewayClient { private_ip: IpAddr, nonce: u64, ) -> Self { - // convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek - #[allow(clippy::expect_used)] - let static_secret = x25519_dalek::StaticSecret::from(local_secret.to_bytes()); - let local_public: x25519_dalek::PublicKey = (&static_secret).into(); + let local_public = PublicKey::from(local_secret); + let remote_public = PublicKey::from(remote_public); - let dh = static_secret.diffie_hellman(&remote_public); + let dh = local_secret.diffie_hellman(&remote_public); // TODO: change that to use our nym_crypto::hmac module instead #[allow(clippy::expect_used)] - let mut mac = HmacSha256::new_from_slice(dh.as_bytes()) + let mut mac = HmacSha256::new_from_slice(&dh[..]) .expect("x25519 shared secret is always 32 bytes long"); mac.update(local_public.as_bytes()); @@ -108,7 +106,7 @@ impl GatewayClient { mac.update(&nonce.to_le_bytes()); GatewayClient { - pub_key: PeerPublicKey::new(local_public), + pub_key: PeerPublicKey::new(local_public.into()), private_ip, mac: ClientMac(mac.finalize().into_bytes().to_vec()), } @@ -118,11 +116,8 @@ impl GatewayClient { // Client should perform this step when generating its payload, using its own WG PK #[cfg(feature = "verify")] pub fn verify(&self, gateway_key: &PrivateKey, nonce: u64) -> Result<(), Error> { - // convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek - #[allow(clippy::expect_used)] - let static_secret = x25519_dalek::StaticSecret::from(gateway_key.to_bytes()); - - let dh = static_secret.diffie_hellman(&self.pub_key); + // use gateways key as a ref to an x25519_dalek key + let dh = (gateway_key.as_ref()).diffie_hellman(&self.pub_key); // TODO: change that to use our nym_crypto::hmac module instead #[allow(clippy::expect_used)] diff --git a/common/authenticator-requests/src/v3/registration.rs b/common/authenticator-requests/src/v3/registration.rs index d9fac785a8..dd6467e7c3 100644 --- a/common/authenticator-requests/src/v3/registration.rs +++ b/common/authenticator-requests/src/v3/registration.rs @@ -14,7 +14,7 @@ use std::{fmt, ops::Deref, str::FromStr}; #[cfg(feature = "verify")] use hmac::{Hmac, Mac}; #[cfg(feature = "verify")] -use nym_crypto::asymmetric::encryption::PrivateKey; +use nym_crypto::asymmetric::encryption::{PrivateKey, PublicKey}; #[cfg(feature = "verify")] use sha2::Sha256; @@ -91,16 +91,14 @@ impl GatewayClient { private_ip: IpAddr, nonce: u64, ) -> Self { - // convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek - #[allow(clippy::expect_used)] - let static_secret = x25519_dalek::StaticSecret::from(local_secret.to_bytes()); - let local_public: x25519_dalek::PublicKey = (&static_secret).into(); + let local_public = PublicKey::from(local_secret); + let remote_public = PublicKey::from(remote_public); - let dh = static_secret.diffie_hellman(&remote_public); + let dh = local_secret.diffie_hellman(&remote_public); // TODO: change that to use our nym_crypto::hmac module instead #[allow(clippy::expect_used)] - let mut mac = HmacSha256::new_from_slice(dh.as_bytes()) + let mut mac = HmacSha256::new_from_slice(&dh[..]) .expect("x25519 shared secret is always 32 bytes long"); mac.update(local_public.as_bytes()); @@ -108,7 +106,7 @@ impl GatewayClient { mac.update(&nonce.to_le_bytes()); GatewayClient { - pub_key: PeerPublicKey::new(local_public), + pub_key: PeerPublicKey::new(local_public.into()), private_ip, mac: ClientMac(mac.finalize().into_bytes().to_vec()), } @@ -118,11 +116,8 @@ impl GatewayClient { // Client should perform this step when generating its payload, using its own WG PK #[cfg(feature = "verify")] pub fn verify(&self, gateway_key: &PrivateKey, nonce: u64) -> Result<(), Error> { - // convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek - #[allow(clippy::expect_used)] - let static_secret = x25519_dalek::StaticSecret::from(gateway_key.to_bytes()); - - let dh = static_secret.diffie_hellman(&self.pub_key); + // use gateways key as a ref to an x25519_dalek key + let dh = (gateway_key.as_ref()).diffie_hellman(&self.pub_key); // TODO: change that to use our nym_crypto::hmac module instead #[allow(clippy::expect_used)] diff --git a/common/authenticator-requests/src/v4/registration.rs b/common/authenticator-requests/src/v4/registration.rs index 9bd5c49e44..e370565a55 100644 --- a/common/authenticator-requests/src/v4/registration.rs +++ b/common/authenticator-requests/src/v4/registration.rs @@ -15,7 +15,7 @@ use std::{fmt, ops::Deref, str::FromStr}; #[cfg(feature = "verify")] use hmac::{Hmac, Mac}; #[cfg(feature = "verify")] -use nym_crypto::asymmetric::encryption::PrivateKey; +use nym_crypto::asymmetric::encryption::{PrivateKey, PublicKey}; #[cfg(feature = "verify")] use sha2::Sha256; @@ -143,16 +143,14 @@ impl GatewayClient { private_ips: IpPair, nonce: u64, ) -> Self { - // convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek - #[allow(clippy::expect_used)] - let static_secret = x25519_dalek::StaticSecret::from(local_secret.to_bytes()); - let local_public: x25519_dalek::PublicKey = (&static_secret).into(); + let local_public = PublicKey::from(local_secret); + let remote_public = PublicKey::from(remote_public); - let dh = static_secret.diffie_hellman(&remote_public); + let dh = local_secret.diffie_hellman(&remote_public); // TODO: change that to use our nym_crypto::hmac module instead #[allow(clippy::expect_used)] - let mut mac = HmacSha256::new_from_slice(dh.as_bytes()) + let mut mac = HmacSha256::new_from_slice(&dh[..]) .expect("x25519 shared secret is always 32 bytes long"); mac.update(local_public.as_bytes()); @@ -160,7 +158,7 @@ impl GatewayClient { mac.update(&nonce.to_le_bytes()); GatewayClient { - pub_key: PeerPublicKey::new(local_public), + pub_key: PeerPublicKey::new(local_public.into()), private_ips, mac: ClientMac(mac.finalize().into_bytes().to_vec()), } @@ -170,11 +168,8 @@ impl GatewayClient { // Client should perform this step when generating its payload, using its own WG PK #[cfg(feature = "verify")] pub fn verify(&self, gateway_key: &PrivateKey, nonce: u64) -> Result<(), Error> { - // convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek - #[allow(clippy::expect_used)] - let static_secret = x25519_dalek::StaticSecret::from(gateway_key.to_bytes()); - - let dh = static_secret.diffie_hellman(&self.pub_key); + // use gateways key as a ref to an x25519_dalek key + let dh = (gateway_key.as_ref()).diffie_hellman(&self.pub_key); // TODO: change that to use our nym_crypto::hmac module instead #[allow(clippy::expect_used)] diff --git a/common/authenticator-requests/src/v5/registration.rs b/common/authenticator-requests/src/v5/registration.rs index 9bd5c49e44..e370565a55 100644 --- a/common/authenticator-requests/src/v5/registration.rs +++ b/common/authenticator-requests/src/v5/registration.rs @@ -15,7 +15,7 @@ use std::{fmt, ops::Deref, str::FromStr}; #[cfg(feature = "verify")] use hmac::{Hmac, Mac}; #[cfg(feature = "verify")] -use nym_crypto::asymmetric::encryption::PrivateKey; +use nym_crypto::asymmetric::encryption::{PrivateKey, PublicKey}; #[cfg(feature = "verify")] use sha2::Sha256; @@ -143,16 +143,14 @@ impl GatewayClient { private_ips: IpPair, nonce: u64, ) -> Self { - // convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek - #[allow(clippy::expect_used)] - let static_secret = x25519_dalek::StaticSecret::from(local_secret.to_bytes()); - let local_public: x25519_dalek::PublicKey = (&static_secret).into(); + let local_public = PublicKey::from(local_secret); + let remote_public = PublicKey::from(remote_public); - let dh = static_secret.diffie_hellman(&remote_public); + let dh = local_secret.diffie_hellman(&remote_public); // TODO: change that to use our nym_crypto::hmac module instead #[allow(clippy::expect_used)] - let mut mac = HmacSha256::new_from_slice(dh.as_bytes()) + let mut mac = HmacSha256::new_from_slice(&dh[..]) .expect("x25519 shared secret is always 32 bytes long"); mac.update(local_public.as_bytes()); @@ -160,7 +158,7 @@ impl GatewayClient { mac.update(&nonce.to_le_bytes()); GatewayClient { - pub_key: PeerPublicKey::new(local_public), + pub_key: PeerPublicKey::new(local_public.into()), private_ips, mac: ClientMac(mac.finalize().into_bytes().to_vec()), } @@ -170,11 +168,8 @@ impl GatewayClient { // Client should perform this step when generating its payload, using its own WG PK #[cfg(feature = "verify")] pub fn verify(&self, gateway_key: &PrivateKey, nonce: u64) -> Result<(), Error> { - // convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek - #[allow(clippy::expect_used)] - let static_secret = x25519_dalek::StaticSecret::from(gateway_key.to_bytes()); - - let dh = static_secret.diffie_hellman(&self.pub_key); + // use gateways key as a ref to an x25519_dalek key + let dh = (gateway_key.as_ref()).diffie_hellman(&self.pub_key); // TODO: change that to use our nym_crypto::hmac module instead #[allow(clippy::expect_used)] diff --git a/common/bin-common/Cargo.toml b/common/bin-common/Cargo.toml index 78e8e6ca93..51cfa31b19 100644 --- a/common/bin-common/Cargo.toml +++ b/common/bin-common/Cargo.toml @@ -21,6 +21,7 @@ serde_json = { workspace = true, optional = true } ## tracing tracing-subscriber = { workspace = true, features = ["env-filter"], optional = true } tracing-tree = { workspace = true, optional = true } +tracing = { workspace = true, optional = true } opentelemetry-jaeger = { workspace = true, features = ["rt-tokio", "collector_client", "isahc_collector_client"], optional = true } tracing-opentelemetry = { workspace = true, optional = true } utoipa = { workspace = true, optional = true } @@ -35,7 +36,7 @@ default = [] openapi = ["utoipa"] output_format = ["serde_json", "dep:clap"] bin_info_schema = ["schemars"] -basic_tracing = ["tracing-subscriber"] +basic_tracing = ["dep:tracing", "tracing-subscriber"] tracing = [ "basic_tracing", "tracing-tree", diff --git a/common/bin-common/src/logging/mod.rs b/common/bin-common/src/logging/mod.rs index bd9a76374b..ffbe6a6cb0 100644 --- a/common/bin-common/src/logging/mod.rs +++ b/common/bin-common/src/logging/mod.rs @@ -44,10 +44,38 @@ pub fn setup_logging() { .init(); } +// don't call init so that we could attach additional layers #[cfg(feature = "basic_tracing")] -pub fn setup_tracing_logger() { - let log_builder = tracing_subscriber::fmt() - .with_writer(std::io::stderr) +pub fn build_tracing_logger() -> impl tracing_subscriber::layer::SubscriberExt { + use tracing_subscriber::prelude::*; + + tracing_subscriber::registry() + .with(default_tracing_fmt_layer(std::io::stderr)) + .with(default_tracing_env_filter()) +} + +#[cfg(feature = "basic_tracing")] +pub fn default_tracing_env_filter() -> tracing_subscriber::filter::EnvFilter { + if ::std::env::var("RUST_LOG").is_ok() { + tracing_subscriber::filter::EnvFilter::from_default_env() + } else { + // if the env value was not found, default to `INFO` level rather than `ERROR` + tracing_subscriber::filter::EnvFilter::builder() + .with_default_directive(tracing_subscriber::filter::LevelFilter::INFO.into()) + .parse_lossy("") + } +} + +#[cfg(feature = "basic_tracing")] +pub fn default_tracing_fmt_layer( + writer: W, +) -> impl tracing_subscriber::Layer + Sync + Send + 'static +where + S: tracing::Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>, + W: for<'writer> tracing_subscriber::fmt::MakeWriter<'writer> + Sync + Send + 'static, +{ + tracing_subscriber::fmt::layer() + .with_writer(writer) // Use a more compact, abbreviated log format .compact() // Display source code file paths @@ -55,18 +83,13 @@ pub fn setup_tracing_logger() { // Display source code line numbers .with_line_number(true) // Don't display the event's target (module path) - .with_target(false); + .with_target(false) +} - if ::std::env::var("RUST_LOG").is_ok() { - log_builder - .with_env_filter(tracing_subscriber::filter::EnvFilter::from_default_env()) - .init() - } else { - // default to 'Info - log_builder - .with_max_level(tracing_subscriber::filter::LevelFilter::INFO) - .init() - } +#[cfg(feature = "basic_tracing")] +pub fn setup_tracing_logger() { + use tracing_subscriber::util::SubscriberInitExt; + build_tracing_logger().init() } // TODO: This has to be a macro, running it as a function does not work for the file_appender for some reason diff --git a/common/client-libs/mixnet-client/src/client.rs b/common/client-libs/mixnet-client/src/client.rs index 94e32f8404..8788a0aee7 100644 --- a/common/client-libs/mixnet-client/src/client.rs +++ b/common/client-libs/mixnet-client/src/client.rs @@ -24,10 +24,10 @@ use tracing::*; #[derive(Clone, Copy)] pub struct Config { - initial_reconnection_backoff: Duration, - maximum_reconnection_backoff: Duration, - initial_connection_timeout: Duration, - maximum_connection_buffer_size: usize, + pub initial_reconnection_backoff: Duration, + pub maximum_reconnection_backoff: Duration, + pub initial_connection_timeout: Duration, + pub maximum_connection_buffer_size: usize, } impl Config { @@ -50,7 +50,7 @@ pub trait SendWithoutResponse { // Without response in this context means we will not listen for anything we might get back (not // that we should get anything), including any possible io errors fn send_without_response( - &mut self, + &self, address: NymNodeRoutingAddress, packet: NymPacket, packet_type: PacketType, @@ -196,7 +196,7 @@ impl Client { } } - fn make_connection(&mut self, address: NymNodeRoutingAddress, pending_packet: FramedNymPacket) { + fn make_connection(&self, address: NymNodeRoutingAddress, pending_packet: FramedNymPacket) { let (sender, receiver) = mpsc::channel(self.config.maximum_connection_buffer_size); // this CAN'T fail because we just created the channel which has a non-zero capacity @@ -247,7 +247,7 @@ impl Client { impl SendWithoutResponse for Client { fn send_without_response( - &mut self, + &self, address: NymNodeRoutingAddress, packet: NymPacket, packet_type: PacketType, diff --git a/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs b/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs index f63fb39736..d06df5ca3b 100644 --- a/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs +++ b/common/cosmwasm-smart-contracts/coconut-dkg/src/types.rs @@ -219,7 +219,7 @@ impl Epoch { EpochState::VerificationKeyFinalization { .. } => { time_configuration.verification_key_finalization_time_secs } - EpochState::InProgress { .. } => 0, + EpochState::InProgress => 0, }; finish += adding; } diff --git a/common/crypto/src/asymmetric/encryption/mod.rs b/common/crypto/src/asymmetric/encryption/mod.rs index 6bdeb284d4..4b580f289b 100644 --- a/common/crypto/src/asymmetric/encryption/mod.rs +++ b/common/crypto/src/asymmetric/encryption/mod.rs @@ -132,6 +132,10 @@ impl PublicKey { *self.0.as_bytes() } + pub fn as_bytes(&self) -> &[u8; PUBLIC_KEY_SIZE] { + self.0.as_bytes() + } + pub fn from_bytes(b: &[u8]) -> Result { if b.len() != PUBLIC_KEY_SIZE { return Err(KeyRecoveryError::InvalidSizePublicKey { @@ -228,7 +232,6 @@ impl<'a> From<&'a PrivateKey> for PublicKey { PublicKey((&pk.0).into()) } } - impl FromStr for PrivateKey { type Err = KeyRecoveryError; diff --git a/common/crypto/src/asymmetric/identity/mod.rs b/common/crypto/src/asymmetric/identity/mod.rs index 6bfa513be0..387034a8d1 100644 --- a/common/crypto/src/asymmetric/identity/mod.rs +++ b/common/crypto/src/asymmetric/identity/mod.rs @@ -6,7 +6,6 @@ use ed25519_dalek::{SecretKey, Signer, SigningKey}; pub use ed25519_dalek::{Verifier, PUBLIC_KEY_LENGTH, SECRET_KEY_LENGTH, SIGNATURE_LENGTH}; use nym_pemstore::traits::{PemStorableKey, PemStorableKeyPair}; use std::fmt::{self, Debug, Display, Formatter}; -use std::hash::{Hash, Hasher}; use std::str::FromStr; use thiserror::Error; use zeroize::{Zeroize, ZeroizeOnDrop}; @@ -154,17 +153,9 @@ impl PemStorableKeyPair for KeyPair { } /// ed25519 EdDSA Public Key -#[derive(Copy, Clone, Eq, PartialEq)] +#[derive(Copy, Clone, Eq, PartialEq, Hash)] pub struct PublicKey(ed25519_dalek::VerifyingKey); -impl Hash for PublicKey { - fn hash(&self, state: &mut H) { - // each public key has unique bytes representation which can be used - // for the hash implementation - self.to_bytes().hash(state) - } -} - impl Display for PublicKey { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { Display::fmt(&self.to_base58_string(), f) diff --git a/common/node-tester-utils/src/node.rs b/common/node-tester-utils/src/node.rs index 3ec4d80670..c3aee8b9c7 100644 --- a/common/node-tester-utils/src/node.rs +++ b/common/node-tester-utils/src/node.rs @@ -64,7 +64,7 @@ pub enum NodeType { impl NodeType { pub fn is_mixnode(&self) -> bool { - matches!(self, NodeType::Mixnode { .. }) + matches!(self, NodeType::Mixnode) } } diff --git a/common/nym_offline_compact_ecash/src/scheme/withdrawal.rs b/common/nym_offline_compact_ecash/src/scheme/withdrawal.rs index 3311105d55..af620f3159 100644 --- a/common/nym_offline_compact_ecash/src/scheme/withdrawal.rs +++ b/common/nym_offline_compact_ecash/src/scheme/withdrawal.rs @@ -403,7 +403,7 @@ pub fn issue( /// * `sk_user` - Secret key of the user. /// * `blind_signature` - Blinded signature received from the authority. /// * `req_info` - Information associated with the request, including the joined commitment hash, -/// private attributes openings, v, and expiration date. +/// private attributes openings, v, and expiration date. /// /// # Returns /// diff --git a/common/nymsphinx/cover/src/lib.rs b/common/nymsphinx/cover/src/lib.rs index 41bb6150ed..727206db9a 100644 --- a/common/nymsphinx/cover/src/lib.rs +++ b/common/nymsphinx/cover/src/lib.rs @@ -171,6 +171,7 @@ pub fn is_cover(data: &[u8]) -> bool { #[cfg(test)] mod tests { use super::*; + use std::iter::repeat_n; #[test] fn is_cover_works_for_identical_input() { @@ -182,7 +183,7 @@ mod tests { let input: Vec<_> = LOOP_COVER_MESSAGE_PAYLOAD .iter() .cloned() - .chain(std::iter::repeat(42).take(100)) + .chain(repeat_n(42, 100)) .collect(); assert!(is_cover(&input)) } diff --git a/common/nymsphinx/src/message.rs b/common/nymsphinx/src/message.rs index 8124989339..c8ad5f40c2 100644 --- a/common/nymsphinx/src/message.rs +++ b/common/nymsphinx/src/message.rs @@ -252,7 +252,7 @@ impl NymMessage { bytes .into_iter() .chain(std::iter::once(1u8)) - .chain(std::iter::repeat(0u8).take(space_left)) + .chain(std::iter::repeat_n(0u8, space_left)) .collect::>() .into() } diff --git a/common/nymsphinx/src/preparer/mod.rs b/common/nymsphinx/src/preparer/mod.rs index e4e0e3e7ba..2f1537e256 100644 --- a/common/nymsphinx/src/preparer/mod.rs +++ b/common/nymsphinx/src/preparer/mod.rs @@ -100,7 +100,7 @@ pub trait FragmentPreparer { /// - compute SURB_ACK /// - generate (x, g^x) /// - obtain key k from the reply-surb which was computed as follows: - /// k = KDF(remote encryption key ^ x) this is equivalent to KDF( dh(remote, x) ) + /// k = KDF(remote encryption key ^ x) this is equivalent to KDF( dh(remote, x) ) /// - compute v_b = AES-128-CTR(k, serialized_fragment) /// - compute vk_b = H(k) || v_b /// - compute sphinx_plaintext = SURB_ACK || H(k) || v_b diff --git a/common/nymsphinx/types/src/lib.rs b/common/nymsphinx/types/src/lib.rs index 517e45e783..7afb5df1fe 100644 --- a/common/nymsphinx/types/src/lib.rs +++ b/common/nymsphinx/types/src/lib.rs @@ -8,7 +8,7 @@ use thiserror::Error; use nym_outfox::packet::{OutfoxPacket, OutfoxProcessedPacket}; #[cfg(feature = "sphinx")] -use sphinx_packet::{SphinxPacket, SphinxPacketBuilder}; +pub use sphinx_packet::{SphinxPacket, SphinxPacketBuilder}; #[cfg(feature = "outfox")] pub use nym_outfox::{ @@ -166,4 +166,20 @@ impl NymPacket { } } } + + #[cfg(feature = "sphinx")] + pub fn sphinx_packet_ref(&self) -> Option<&SphinxPacket> { + match self { + NymPacket::Sphinx(packet) => Some(packet), + _ => None, + } + } + + #[cfg(feature = "sphinx")] + pub fn as_sphinx_packet(self) -> Option { + match self { + NymPacket::Sphinx(packet) => Some(packet), + _ => None, + } + } } diff --git a/common/task/src/manager.rs b/common/task/src/manager.rs index a9ebab36c5..ba605f5a55 100644 --- a/common/task/src/manager.rs +++ b/common/task/src/manager.rs @@ -363,7 +363,7 @@ impl TaskClient { "unnamed-TaskClient".to_string() }; - log!(target: target, level, "{}", format!("[{target}] {msg}")) + log!(target: target, level, "{}", format_args!("[{target}] {msg}")) } #[must_use] diff --git a/common/wireguard-types/src/public_key.rs b/common/wireguard-types/src/public_key.rs index 282430c3a8..31cfb448e1 100644 --- a/common/wireguard-types/src/public_key.rs +++ b/common/wireguard-types/src/public_key.rs @@ -6,13 +6,12 @@ use base64::engine::general_purpose; use base64::Engine; use serde::Serialize; use std::fmt; -use std::hash::{Hash, Hasher}; use std::ops::Deref; use std::str::FromStr; use x25519_dalek::PublicKey; -#[derive(Debug, Clone, Copy, Eq, PartialEq)] +#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] pub struct PeerPublicKey(PublicKey); impl PeerPublicKey { @@ -36,12 +35,6 @@ impl fmt::Display for PeerPublicKey { } } -impl Hash for PeerPublicKey { - fn hash(&self, state: &mut H) { - self.0.as_bytes().hash(state) - } -} - impl Deref for PeerPublicKey { type Target = PublicKey; diff --git a/common/wireguard/src/peer_handle.rs b/common/wireguard/src/peer_handle.rs index c21ff10e55..7112972058 100644 --- a/common/wireguard/src/peer_handle.rs +++ b/common/wireguard/src/peer_handle.rs @@ -102,7 +102,7 @@ impl PeerHandle { if SystemTime::now().duration_since(self.startup_timestamp)? >= AUTO_REMOVE_AFTER { log::debug!( "Peer {} has been present for 30 days, removing it", - self.public_key.to_string() + self.public_key ); let success = self.remove_peer().await?; return Ok(!success); @@ -111,7 +111,7 @@ impl PeerHandle { if spent_bandwidth >= BANDWIDTH_CAP_PER_DAY { log::debug!( "Peer {} doesn't have bandwidth anymore, removing it", - self.public_key.to_string() + self.public_key ); let success = self.remove_peer().await?; return Ok(!success); diff --git a/contracts/Cargo.lock b/contracts/Cargo.lock index 7397827afb..f246379774 100644 --- a/contracts/Cargo.lock +++ b/contracts/Cargo.lock @@ -667,9 +667,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" dependencies = [ "powerfmt", ] @@ -1851,9 +1851,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.39" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -1868,15 +1868,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.20" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", diff --git a/documentation/docs/components/outputs/api-scraping-outputs/time-now.md b/documentation/docs/components/outputs/api-scraping-outputs/time-now.md index 6a98dad716..f2de5fca15 100644 --- a/documentation/docs/components/outputs/api-scraping-outputs/time-now.md +++ b/documentation/docs/components/outputs/api-scraping-outputs/time-now.md @@ -1 +1 @@ -Wednesday, March 19th 2025, 18:56:53 UTC +Thursday, April 3rd 2025, 13:40:32 UTC diff --git a/documentation/docs/pages/operators/changelog.mdx b/documentation/docs/pages/operators/changelog.mdx index 0c2ceb54fb..11aa6b8231 100644 --- a/documentation/docs/pages/operators/changelog.mdx +++ b/documentation/docs/pages/operators/changelog.mdx @@ -47,6 +47,166 @@ This page displays a full list of all the changes during our release cycle from +## `v2025.6-chuckles` + +- [Release Binaries](https://github.com/nymtech/nym/releases/tag/nym-binaries-v2025.8-chuckles) +- [`nym-node`](nodes/nym-node.mdx) version `1.8.0` + +```shell +nym-node +Binary Name: nym-node +Build Timestamp: 2025-04-01T09:55:02.982234741Z +Build Version: 1.8.0 +Commit SHA: a429d6528e99b878a310b71bdbe6d31923c52d84 +Commit Date: 2025-04-01T11:41:15.000000000+02:00 +Commit Branch: HEAD +rustc Version: 1.85.1 +rustc Channel: stable +cargo Profile: release +``` + +### Operators Updates & Tools + +- [**Nym Wallet v1.2.16**](https://github.com/nymtech/nym/releases/tag/nym-wallet-v1.2.16): Operators can change their parameters in the GUI interface again. Remember that while changing node settings will take effect in the next epoch (max 60 min), *Operator cost* and *Profit margin* will be updated with the change of interval (720 epochs). You can track the state of epochs and intervals [here](https://explorer.nym.spectredao.net/dashboard). Currently we are less than 24h from the end of interval, **if you were to change OC or PM, do it now!** + +- [**Nym Explorer v2.1.0**](https://nym.com/explorer) is out as a beta release + +- Since last release [**Wireguard exit policy is out!**](nodes/nym-node/configuration#wireguard-exit-policy-configuration). Make sure to apply it on the servers hosting `nym-node` in `exit-gateway` mode. + +#### Community Tools + +Nym operators are coming with diverse backgrounds. While for some running a `nym-node` is an introduction to sys-administration, others are well seasoned builders and hackers. It's amazing to see the effort people put in order to lift each other by day-to-day mutual problem solving support in [Matrix channel](https://matrix.to/#/#operators:nymtech.chat). More and more people take it further and build tools to improve network monitoring and node administration. + +While we are planning to make a page aggregating these tools together, here are some tools released lately by the technical community: + +- [SpectreDAO token dashboard](https://explorer.nym.spectredao.net/token): Including stats, distribution, alongside all fundamental stats + +- [SpectreDAO privacy check](https://explorer.nym.spectredao.net/privacy-check): Testing users browser, IP info, WebRTC leaks, fingerprinting, extensions and most importantly whether you access via [NymVPN](https://nym.com/) + +- Service status dashboards: Uptime dashboards showing status of Nym Nodes, either squads using self-hosted [Uptime Kuma](https://uptime.kuma.pet/) or a custom dashboard, like the one from [Oceanus](https://oceanus.p17o.com/) + +- [Nym Node Widget](https://github.com/koutakou/NymNodeWidget): A MacOS widget following status of your nodes by [koutakou](https://github.com/koutakou/) + +- [Nymesis](https://nymesis.vercel.app/): Beta version of an explorer tracking node rewards in a simple graph + +### Features + +- [Bump `http-proxy-middleware` from `2.0.6` to `2.0.7`](https://github.com/nymtech/nym/pull/5019): Bumps [`http-proxy-middleware`](https://github.com/chimurai/http-proxy-middleware) + +- [Bump `next` from `13.5.7` to `14.2.15` in `/documentation/docs`](https://github.com/nymtech/nym/pull/5281): Bumps [`next`](https://github.com/vercel/next.js) + +- [Bump `next` from `14.1.4` to `14.2.21` in `/explorer-nextjs`](https://github.com/nymtech/nym/pull/5308): Bumps [`next`](https://github.com/vercel/next.js) + +- [Bump `nanoid` from `3.3.7` to `3.3.8` in `/documentation/docs`](https://github.com/nymtech/nym/pull/5335): Bumps [`nanoid`](https://github.com/ai/nanoid) + +- [Bump `store2` from `2.14.3` to `2.14.4`](https://github.com/nymtech/nym/pull/5391): Bumps [`store2`](https://github.com/nbubna/store) + +- [Bump `@octokit/plugin-paginate-rest` and `@actions/github` in `/.github/actions/nym-hash-releases/src`](https://github.com/nymtech/nym/pull/5488): Bumps [`@octokit/plugin-paginate-rest`](https://github.com/octokit/plugin-paginate-rest.js) + +- [Clean stale partially received buffers](https://github.com/nymtech/nym/pull/5536): Clean up old `ReconstructionBuffer`s that have not received fragments in a long time. The motivation is that we want to allow the client to cap the number of re-transmissions done, meaning we can't assume that these will eventually arrive + +- [Explorer V2](https://github.com/nymtech/nym/pull/5548) + +- [Bump `braces` from `3.0.2` to `3.0.3` in `/sdk/typescript/packages/mix-fetch-node`](https://github.com/nymtech/nym/pull/5612): Bumps [`braces`](https://github.com/micromatch/braces) + +- [Bump `golang.org/x/net` from `0.23.0` to `0.36.0` in `/wasm/mix-fetch/go-mix-conn`](https://github.com/nymtech/nym/pull/5613): Bumps [golang.org/x/net](https://github.com/golang/net) + +- [Bump `ws` from `8.13.0` to `8.18.1` in `/wasm/client/internal-dev`](https://github.com/nymtech/nym/pull/5614): Bumps [`ws`](https://github.com/websockets/ws) + +- [Bump webpack from `5.77.0` to `5.98.0` in `/wasm/client/internal-dev`](https://github.com/nymtech/nym/pull/5615): Bumps [`webpack`](https://github.com/webpack/webpack) + +- [Feature/paginated ticketbooks challenge](https://github.com/nymtech/nym/pull/5619): This PR makes changes to how ticketbook rewarding works and in particular the challenge portion of the exchange. Rather than requesting merkle proof alongside all binary data of the associated ticketbooks in a single `/issued-ticketbooks-challenge` query (that could have potentially lead to ddos of nym-apis as it made them load all of the data into the memory at once) the query got split into `/issued-ticketbooks-challenge-commitment` for obtaining the merkle proof and `/issued-ticketbooks-data` for obtaining the binary data. Note that the latter query might have to be called multiple times with different arguments due to the enforced limit on the maximum number of values returned at once. + + +- added: + - `/issued-ticketbooks-count` + - `/issued-ticketbooks-for-count/:expiration_date` + - `/issued-ticketbooks-on-count/:issuance_date` + - `/issued-ticketbooks-challenge-commitment` + - `/issued-ticketbooks-data` + +- removed: + - `/issued-ticketbooks-challenge` + + +}> +Testing Steps Performed: +New issue ticketbook related endpoints work - tickets are issued and consumed as before. +Redeeming tickets is happening as normal on the gateway side. + +Notes (if any): +Chuckles will not require the rewarder binary to be updated; as there will be additional changes to rewarding, this will be extensively tested in the future. + + +- [Bump `@babel/runtime` from `7.16.3` to `7.26.10` in `/testnet-faucet`](https://github.com/nymtech/nym/pull/5621): Bumps [`@babel/runtime`](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) + +- [Bump the `patch-updates` group with 8 updates](https://github.com/nymtech/nym/pull/5624): + +| Package | From | To | +| --- | --- | --- | +| [`async-trait`](https://github.com/dtolnay/async-trait) | `0.1.87` | `0.1.88` | +| [`clap`](https://github.com/clap-rs/clap) | `4.5.31` | `4.5.32` | +| [`env_logger`](https://github.com/rust-cli/env_logger) | `0.11.6` | `0.11.7` | +| [`http-body-util`](https://github.com/hyperium/http-body) | `0.1.2` | `0.1.3` | +| [`quote`](https://github.com/dtolnay/quote) | `1.0.39` | `1.0.40` | +| [`tokio`](https://github.com/tokio-rs/tokio) | `1.44.0` | `1.44.1` | +| [`tokio-util`](https://github.com/tokio-rs/tokio) | `0.7.13` | `0.7.14` | +| [`indexed_db_futures`](https://github.com/Alorel/rust-indexed-db) | `0.6.0` | `0.6.1` | + +- [Bump `humantime` from `2.1.0` to `2.2.0`](https://github.com/nymtech/nym/pull/5625): Bumps [`humantime`](https://github.com/chronotope/humantime) + +- [Bump `http` from `1.2.0` to `1.3.1`](https://github.com/nymtech/nym/pull/5626): Bumps [`http`](https://github.com/hyperium/http) + +- [Bump `celes` from `2.5.0` to `2.6.0`](https://github.com/nymtech/nym/pull/5627) + +- [Bump `uuid` from `1.15.1` to `1.16.0`](https://github.com/nymtech/nym/pull/5628): Bumps [`uuid`](https://github.com/uuid-rs/uuid) + +- [Bump `once_cell` from `1.20.3` to `1.21.1`](https://github.com/nymtech/nym/pull/5629): Bumps [`once_cell`](https://github.com/matklad/once_cell) + +- [Bump `zeroize` from `1.6.0` to `1.8.1`](https://github.com/nymtech/nym/pull/5630): Bumps [`zeroize`](https://github.com/RustCrypto/utils) + +- [Bump `tempfile` from `3.18.0` to `3.19.0`](https://github.com/nymtech/nym/pull/5631): Bumps [`tempfile`](https://github.com/Stebalien/tempfile) + +- [Rework IPR codec to extract out timer and implement AsyncWrite](https://github.com/nymtech/nym/pull/5632): The goal is to be able to handle back pressure in the vpn client. For that we need to extract out the timer from the codec since we want to move control over that to the mixnet processor. Once the timer is removed we can reformulate the mixnet sender as a `Sink` wrapped in a `FramedWrite` + + - Extract out timer from IPR codec + - Implement AsyncWrite on mixnet client sender + - Add functions to wait for lanes to clear on `LaneQueueLenghts` + +- [Remove `explorer-api` from the main workspace](https://github.com/nymtech/nym/pull/5635) + +- [Bump `dtolnay/rust-toolchain` from `1.90.0` to `1.100.0`](https://github.com/nymtech/nym/pull/5638): Bumps [`dtolnay/rust-toolchain`](https://github.com/dtolnay/rust-toolchain) + +- [Bump `zip` from `2.2.2` to `2.4.1`](https://github.com/nymtech/nym/pull/5639): Bumps [`zip`](https://github.com/zip-rs/zip2) + +- [Add `max_retransmissions` flag on each message](https://github.com/nymtech/nym/pull/5642): Add an optional `max_retransmissions` field on `InputMessage`, to be able to selectively disable or turn down the number of `retransmissions` done for specific packets + +- [Upgrade `sha2` to workspace version for validator-client](https://github.com/nymtech/nym/pull/5644) + +- [Add `RUSTUP_PERMIT_COPY_RENAME` in two workflows that we forgot about](https://github.com/nymtech/nym/pull/5646) + +- [Remove `UNIQUE` constraint on node pubkey](https://github.com/nymtech/nym/pull/5649): This accounts for the case when a node rebonds with the same key remove nodes that weren't updated in a week + +- [Add concurrency limit to CI](https://github.com/nymtech/nym/pull/5651): For `ci-build` workflow only + +- [Update wallet to include Interval Operator Cost and Profit Margin](https://github.com/nymtech/nym/pull/5652): Created a new modal for Interval Operator Cost and Profit Margin changes + - Uses existing update node operating cost functionality for old mixnodes (If it works it works) + - Prompts a warning that a user "Can send the request as many times as they want but it will only update the last message when the interval changes" + +- [Wallet-revamp to be in line with new nym-theming](https://github.com/nymtech/nym/pull/5653): Updating colour palette to match the [nym.com](https://nym.com) sites: + - Used the same font too + - Updated icons + +- [Add `fd` callback for initial authentication](https://github.com/nymtech/nym/pull/5654): One thing that was missed was the registration `ws` connection that happens before the actual connection, if it's the first time connecting to a gateway. This PR extends connection `fd` callback to that initial connection, so that it can also be allowed by firewalls. + +- [Revert using `AsyncWrite` sink in IPR](https://github.com/nymtech/nym/pull/5656): Revert the use of the `AsyncWrite` sink in the IPR until it's fully ready. + +- [Remove Google public DNS](https://github.com/nymtech/nym/pull/5660): We had a lot of complaints about Google, so we're removing this in VPN client, Nym should follow to avoid issues with firewall. + +### Bugfix + +- [Corrected typos](https://github.com/nymtech/nym/pull/5497) in `CHANGELOG.md` + ## `v2025.5-chokito` - [Release Binaries](https://github.com/nymtech/nym/releases/tag/nym-binaries-v2025.5-chokito) @@ -67,18 +227,14 @@ cargo Profile: release ### Release Summary -1. WebSocket Connection Counter Fix (this is the fix for which we have a [pre-release branch](https://github.com/nymtech/nym/releases/tag/nym-binaries-v2025.4-dorina-nym-node-patch) out already which will be replaced by this release) - - Prevents incorrect session tracking for WebSockets +1. WebSocket Connection Counter Fix (this is the fix for which we have a [pre-release branch](https://github.com/nymtech/nym/releases/tag/nym-binaries-v2025.4-dorina-nym-node-patch) out already which will be replaced by this release): Prevents incorrect session tracking for WebSockets -2. Security Fixes in Dependencies - - Address known security vulnerabilities, making updating highly recommended +2. Security Fixes in Dependencies: Address known security vulnerabilities, making updating highly recommended -3. Authorisation & Timestamp Changes - - Modifies how timestamps are validated in Auth v2 - this is going to be what the clients use. For example: the clients will start to use v2 variants of everything (prepping the network for the breaking change to come on April 1st which will force clients to only use v2). +3. Authorisation & Timestamp Changes: Modifies how timestamps are validated in Auth v2 - this is going to be what the clients use. For example: the clients will start to use v2 variants of everything (prepping the network for the breaking change to come on April 1st which will force clients to only use v2). 4. Wireguard exit policy [scripts](https://github.com/nymtech/nym/tree/develop/scripts/wireguard-exit-policy) - ### Operators Updates & Tools - [**Wireguard exit policy is out!**](nodes/nym-node/configuration#wireguard-exit-policy-configuration) Operators can use a new guide with our scripts to setup wireguard exit policy using IP tables rules. diff --git a/documentation/docs/pages/operators/nodes/nym-node/setup.mdx b/documentation/docs/pages/operators/nodes/nym-node/setup.mdx index 39ceee1219..a282d9a8ac 100644 --- a/documentation/docs/pages/operators/nodes/nym-node/setup.mdx +++ b/documentation/docs/pages/operators/nodes/nym-node/setup.mdx @@ -20,12 +20,12 @@ This documentation page provides a guide on how to set up and run a [NYM NODE](. ```sh nym-node Binary Name: nym-node -Build Timestamp: 2025-03-18T12:17:10.782554174Z -Build Version: 1.7.0 -Commit SHA: 82e82943aa14e530ab4eb3aaab28ce86d47e5298 -Commit Date: 2025-03-18T10:39:55.000000000+01:00 +Build Timestamp: 2025-04-01T09:55:02.982234741Z +Build Version: 1.8.0 +Commit SHA: a429d6528e99b878a310b71bdbe6d31923c52d84 +Commit Date: 2025-04-01T11:41:15.000000000+02:00 Commit Branch: HEAD -rustc Version: 1.85.0 +rustc Version: 1.85.1 rustc Channel: stable cargo Profile: release ``` diff --git a/documentation/docs/pages/operators/nodes/preliminary-steps/vps-setup/advanced.mdx b/documentation/docs/pages/operators/nodes/preliminary-steps/vps-setup/advanced.mdx index 14637e0a8d..95c3a2a864 100644 --- a/documentation/docs/pages/operators/nodes/preliminary-steps/vps-setup/advanced.mdx +++ b/documentation/docs/pages/operators/nodes/preliminary-steps/vps-setup/advanced.mdx @@ -23,13 +23,13 @@ This guide explains how to prepare your server in order to be able to host multi This guide is based on Ubuntu 22.04, in case you prefer another OS, you may have to do a bit of your own research to troubleshoot networking configuration and other parameters. -### Installing KVM on a Server with Ubuntu 22.04 +## Installing KVM on a Server with Ubuntu 22.04 **KVM** stands for **Kernel-based Virtual Machine**. It is a virtualization technology for Linux that allows a user to run multiple virtual machines (VMs) on a single physical machine. KVM turns the Linux kernel into a hypervisor, enabling it to manage multiple virtualised systems. Follow the steps below to install KVM on Ubuntu 22.04 LTS. -#### Prerequisites +### Prerequisites Operators aiming to run Nym node as mixnet [Exit Gateway](../../../community-counsel/exit-gateway) or with wireguard enabled should familiarize themselves with the challenges possibly coming along `nym-node` operation, described in our [community counsel](../../../community-counsel) and follow up with [legal suggestions](../../../community-counsel/legal). Particularly important is to [introduce yourself](../../../community-counsel/legal#introduce-nym-node-to-your-provider) and your intentions to run a Nym node to your provider. @@ -510,16 +510,56 @@ Your KVM installation is now ready to deploy and manage VMs. -### Setting Up Virtual Machines +## Setting Up Virtual Machines -After finishing the [installation of KVM](#installing-kvm-on-a-server-with-ubuntu-2204), we can move to the virtualisation configuration. +**After finishing the [installation of KVM](#installing-kvm-on-a-server-with-ubuntu-2204), we can move to the virtualisation configuration.** -> **The steps below will guide you through a setup of one VM, therefore you will have to repeat this process for each VM**. That also means that you have to be mindful of space and memory allocation. +> **This tutorial will guide you through a setup of one VM, therefore you will have to repeat this process for each VM**. + + +A good practice before initialising any VMs, is to calculate space and memory allocation for each of them and your host machine. + + +You can choose in between using [bash scripts](#setting-up-vm-using-scripts) or [manual steps](#setting-up-vm-step-by-step) approach. While scripts may be faster, they give you much less flexibility. Therefore if you prefer to have room for customisation coming along installing software, do it step by step. + +Remember, that anytime you execute a script on your computer, make sure to read and understand the script first. + +### Seting up VM Using Scripts + + +In case you want to initialise and configure your VMs manually - skip this chapter and go directly to the [*step-by-step* part](#setting-up-vm-step-by-step). + + +Using the scripts is a two-step process. First, initialisation part is done from the host root using [`initialise-vm.sh`](https://github.com/nymtech/nym/blob/develop/scripts/kvm-setup/initialise-vm.sh) and second, configuration part is done from the VM itself using [`configure-vm.sh`](https://github.com/nymtech/nym/blob/develop/scripts/kvm-setup/configure-vm.sh). + + +##### 1. Initialise VM from the host machine +- Log in to your host as `root` +- Run this block and follow the prompts carefully: +```bash +wget "https://raw.githubusercontent.com/nymtech/nym/refs/heads/develop/scripts/kvm-setup/initialise-vm.sh" +chmod +x ./initialise-vm.sh +./initialise-vm.sh +``` + +##### 2. Configure VM from within +- After logging into your VM run this block and follow the prompts carefully: +```bash +wget "https://raw.githubusercontent.com/nymtech/nym/refs/heads/develop/scripts/kvm-setup/configure-vm.sh" +chmod +x ./configure-vm.sh +./configure-vm.sh +``` + + + +### Setting up VM Step-by-step + +In case you did't use the scripts and prefer manual approach, follow the steps below carefully. ##### 1. Install OS for VMs -This is the OS on which the nodes themselves will run. You can chose any GNU/Linux of your preference. For this guide we are going to be using Ubuntu 24.04 LTS (Noble Numbat) cloud image from [cloud-images.ubuntu.com](https://cloud-images.ubuntu.com/noble/current/). +This is the OS on which the nodes themselves will run. You can chose any GNU/Linux of your preference. For this guide we are going to be using Ubuntu 24.04 LTS (Noble Numbat) cloud image from [cloud-images.ubuntu.com](https://cloud-images.ubuntu.com/noble/current/). - Download Ubuntu Cloud image: ```bash @@ -651,7 +691,7 @@ network: addresses: - 1.1.1.1 # Cloudflare IPv4 DNS - 8.8.8.8 # Google IPv4 DNS - - 8.8.4.4 # Secondary Google IPv4 DNS + - 8.8.4.4 # Secondary Google IPv4 DNS - 2606:4700:4700::1111 # Cloudflare IPv6 DNS - 2001:4860:4860::8888 # Google IPv6 DNS ``` diff --git a/documentation/docs/pages/operators/tokenomics/mixnet-rewards.mdx b/documentation/docs/pages/operators/tokenomics/mixnet-rewards.mdx index 7f76d40e98..fc33513f9c 100644 --- a/documentation/docs/pages/operators/tokenomics/mixnet-rewards.mdx +++ b/documentation/docs/pages/operators/tokenomics/mixnet-rewards.mdx @@ -57,7 +57,7 @@ This is a quick summary, to understand the full picture, please see detailed [*R * NymVPN users can chose to route through Nym Network in two ways: - Mixnet: 5 layers routing and mixing - full privacy - Wireguard: 2 layers routing, skipping 3 mixing layers - fast mode -* **The current reward system is *Native rewarding* - an intermediate step - where each layer get's rewarded the same** +* **The current reward system is [*Naive rewarding*](#naive-rewarding) - an intermediate step - where each layer get's rewarded the same** * In the final model, nodes will get rewarded based on their layer position and the work they do (collected user tickets), where and the reward distribution per layer will be according to a [decision made by the operators](https://forum.nymtech.net/t/poll-what-should-be-the-split-of-mixmining-rewards-among-the-layers-of-the-nym-mixnet/407) as follows: - 5-hop: 16%-16%-16%-16%-36% - 2-hop: 33%-67% diff --git a/nym-node/Cargo.toml b/nym-node/Cargo.toml index bd8537857b..9682d4e2e0 100644 --- a/nym-node/Cargo.toml +++ b/nym-node/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "nym-node" -version = "1.8.0" +version = "1.9.0" authors.workspace = true repository.workspace = true homepage.workspace = true @@ -21,18 +21,19 @@ bip39 = { workspace = true, features = ["zeroize"] } bs58.workspace = true celes = { workspace = true } # country codes colored = { workspace = true } +csv = { workspace = true } clap = { workspace = true, features = ["cargo", "env"] } -dashmap = { workspace = true } futures = { workspace = true } humantime-serde = { workspace = true } human-repr = { workspace = true } ipnetwork = { workspace = true } +indicatif = { workspace = true } rand = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json.workspace = true -si-scale = { workspace = true } thiserror.workspace = true tracing.workspace = true +tracing-indicatif = { workspace = true } tracing-subscriber.workspace = true tokio = { workspace = true, features = ["macros", "sync", "rt-multi-thread"] } tokio-util = { workspace = true, features = ["codec"] } @@ -40,9 +41,6 @@ toml = { workspace = true } url = { workspace = true, features = ["serde"] } zeroize = { workspace = true, features = ["zeroize_derive"] } -# temporary bonding information v1 (to grab and parse nym-mixnode and nym-gateway package versions) -semver = { workspace = true } - # system info: cupid = { workspace = true } sysinfo = { workspace = true } @@ -62,6 +60,8 @@ nym-sphinx-addressing = { path = "../common/nymsphinx/addressing" } nym-sphinx-framing = { path = "../common/nymsphinx/framing" } nym-sphinx-types = { path = "../common/nymsphinx/types" } nym-sphinx-forwarding = { path = "../common/nymsphinx/forwarding" } +nym-sphinx-routing = { path = "../common/nymsphinx/routing" } +nym-sphinx-params = { path = "../common/nymsphinx/params" } nym-task = { path = "../common/task" } nym-types = { path = "../common/types" } nym-validator-client = { path = "../common/client-libs/validator-client" } @@ -77,8 +77,6 @@ nym-http-api-client = { path = "../common/http-api-client" } # useful for `#[axum_macros::debug_handler]` #axum-macros = "0.3.8" axum.workspace = true -axum-extra = { workspace = true, features = ["typed-header"] } -headers.workspace = true time = { workspace = true, features = ["serde"] } tower-http = { workspace = true, features = ["fs"] } utoipa = { workspace = true, features = ["axum_extras", "time"] } @@ -95,6 +93,22 @@ nym-network-requester = { path = "../service-providers/network-requester" } nym-ip-packet-router = { path = "../service-providers/ip-packet-router" } +# throughput tester to recreate lioness +# we don't care about particular versions - just pull whatever is used by sphinx +[dependencies.lioness] +version = "*" + +[dependencies.chacha] +version = "*" + +[dependencies.arrayref] +version = "*" + +[dependencies.blake2] +version = "*" + + + [build-dependencies] # temporary bonding information v1 (to grab and parse nym-mixnode and nym-gateway package versions) cargo_metadata = { workspace = true } diff --git a/nym-node/src/cli/commands/bonding_information.rs b/nym-node/src/cli/commands/bonding_information.rs index a864e14cbb..6edc7fd7c4 100644 --- a/nym-node/src/cli/commands/bonding_information.rs +++ b/nym-node/src/cli/commands/bonding_information.rs @@ -3,7 +3,6 @@ use crate::cli::helpers::ConfigArgs; use crate::config::upgrade_helpers::try_load_current_config; -use crate::error::NymNodeError; use crate::node::bonding_information::BondingInformation; use nym_bin_common::output_format::OutputFormat; @@ -21,7 +20,7 @@ pub struct Args { pub(crate) output: OutputFormat, } -pub async fn execute(args: Args) -> Result<(), NymNodeError> { +pub async fn execute(args: Args) -> anyhow::Result<()> { let config = try_load_current_config(args.config.config_path()).await?; let info = BondingInformation::try_load(&config)?; args.output.to_stdout(&info); diff --git a/nym-node/src/cli/commands/build_info.rs b/nym-node/src/cli/commands/build_info.rs index 612f681e4e..7bddf236f3 100644 --- a/nym-node/src/cli/commands/build_info.rs +++ b/nym-node/src/cli/commands/build_info.rs @@ -1,7 +1,6 @@ // Copyright 2024 - Nym Technologies SA // SPDX-License-Identifier: GPL-3.0-only -use crate::error::NymNodeError; use nym_bin_common::bin_info_owned; use nym_bin_common::output_format::OutputFormat; @@ -11,7 +10,7 @@ pub(crate) struct Args { output: OutputFormat, } -pub(crate) fn execute(args: Args) -> Result<(), NymNodeError> { +pub(crate) fn execute(args: Args) -> anyhow::Result<()> { println!("{}", args.output.format(&bin_info_owned!())); Ok(()) } diff --git a/nym-node/src/cli/commands/migrate.rs b/nym-node/src/cli/commands/migrate.rs index b47ee6853c..4575d7d020 100644 --- a/nym-node/src/cli/commands/migrate.rs +++ b/nym-node/src/cli/commands/migrate.rs @@ -11,7 +11,7 @@ pub(crate) struct Args { _args: Vec, } -pub(crate) async fn execute(_args: Args) -> Result<(), NymNodeError> { +pub(crate) fn execute(_args: Args) -> Result<(), NymNodeError> { let orange = TrueColor { r: 251, g: 110, diff --git a/nym-node/src/cli/commands/mod.rs b/nym-node/src/cli/commands/mod.rs index 16d6e3611b..dea762daf9 100644 --- a/nym-node/src/cli/commands/mod.rs +++ b/nym-node/src/cli/commands/mod.rs @@ -7,3 +7,4 @@ pub(super) mod migrate; pub(crate) mod node_details; pub(super) mod run; pub(super) mod sign; +pub(crate) mod test_throughput; diff --git a/nym-node/src/cli/commands/node_details.rs b/nym-node/src/cli/commands/node_details.rs index 1b8ec69360..11ef51f120 100644 --- a/nym-node/src/cli/commands/node_details.rs +++ b/nym-node/src/cli/commands/node_details.rs @@ -3,7 +3,6 @@ use crate::cli::helpers::ConfigArgs; use crate::config::upgrade_helpers::try_load_current_config; -use crate::error::NymNodeError; use crate::node::NymNode; use nym_bin_common::output_format::OutputFormat; @@ -21,7 +20,7 @@ pub(crate) struct Args { pub(crate) output: OutputFormat, } -pub async fn execute(args: Args) -> Result<(), NymNodeError> { +pub async fn execute(args: Args) -> anyhow::Result<()> { let config = try_load_current_config(args.config.config_path()).await?; let details = NymNode::new(config).await?.display_details()?; args.output.to_stdout(&details); diff --git a/nym-node/src/cli/commands/sign.rs b/nym-node/src/cli/commands/sign.rs index 0b9fc56d5b..a9326df24f 100644 --- a/nym-node/src/cli/commands/sign.rs +++ b/nym-node/src/cli/commands/sign.rs @@ -3,7 +3,6 @@ use crate::cli::helpers::ConfigArgs; use crate::config::upgrade_helpers::try_load_current_config; -use crate::error::NymNodeError; use crate::node::helpers::load_ed25519_identity_keypair; use nym_bin_common::output_format::OutputFormat; use nym_crypto::asymmetric::identity; @@ -70,7 +69,7 @@ fn print_signed_contract_msg( // SAFETY: clippy ArgGroup ensures only a single branch is actually called #[allow(clippy::unreachable)] -pub async fn execute(args: Args) -> Result<(), NymNodeError> { +pub async fn execute(args: Args) -> anyhow::Result<()> { let config = try_load_current_config(args.config.config_path()).await?; let identity_keypair = load_ed25519_identity_keypair(config.storage_paths.keys.ed25519_identity_storage_paths())?; diff --git a/nym-node/src/cli/commands/test_throughput.rs b/nym-node/src/cli/commands/test_throughput.rs new file mode 100644 index 0000000000..af7cc8ad42 --- /dev/null +++ b/nym-node/src/cli/commands/test_throughput.rs @@ -0,0 +1,87 @@ +// Copyright 2025 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use crate::cli::helpers::ConfigArgs; +use crate::logging::granual_filtered_env; +use crate::throughput_tester::test_mixing_throughput; +use anyhow::bail; +use humantime_serde::re::humantime; +use indicatif::ProgressStyle; +use nym_bin_common::logging::default_tracing_fmt_layer; +use std::env::temp_dir; +use std::path::PathBuf; +use std::time::Duration; +use time::OffsetDateTime; +use tracing_indicatif::IndicatifLayer; +use tracing_subscriber::layer::SubscriberExt; +use tracing_subscriber::util::SubscriberInitExt; + +#[derive(Debug, clap::Args)] +pub struct Args { + #[clap(flatten)] + config: ConfigArgs, + + #[clap(long, default_value_t = 10)] + senders: usize, + + /// target packet latency, if current value is below threshold, clients will increase their sending rates + /// and similarly if it's above it, they will decrease it + #[clap(long, default_value = "15ms", value_parser = humantime::parse_duration)] + packet_latency_threshold: Duration, + + #[clap(long, default_value_t = 50)] + starting_sending_batch_size: usize, + + #[clap(long, default_value = "50ms", value_parser = humantime::parse_duration)] + starting_sending_delay: Duration, + + #[clap(long, short)] + output_directory: Option, +} + +fn init_test_logger() -> anyhow::Result<()> { + let indicatif_layer = IndicatifLayer::new() + .with_progress_style(ProgressStyle::with_template( + "{span_child_prefix}{spinner} {span_fields} -- {span_name} {wide_msg}", + )?) + .with_span_child_prefix_symbol("↳ ") + .with_span_child_prefix_indent(" "); + + tracing_subscriber::registry() + .with(default_tracing_fmt_layer( + indicatif_layer.get_stderr_writer(), + )) + .with(indicatif_layer) + .with(granual_filtered_env()?) + .init(); + Ok(()) +} + +pub fn execute(args: Args) -> anyhow::Result<()> { + init_test_logger()?; + + let output_dir = match args.output_directory { + Some(output_dir) => { + if !output_dir.is_dir() { + bail!("'{}' is not a directory", output_dir.display()); + } + + output_dir + } + None => { + let now = OffsetDateTime::now_utc().unix_timestamp(); + temp_dir() + .join("nym-node-throughput-testing") + .join(now.to_string()) + } + }; + + test_mixing_throughput( + args.config.config_path(), + args.senders, + args.packet_latency_threshold, + args.starting_sending_batch_size, + args.starting_sending_delay, + output_dir, + ) +} diff --git a/nym-node/src/cli/mod.rs b/nym-node/src/cli/mod.rs index d3374c7fdf..40b05b4a84 100644 --- a/nym-node/src/cli/mod.rs +++ b/nym-node/src/cli/mod.rs @@ -1,14 +1,17 @@ // Copyright 2024 - Nym Technologies SA // SPDX-License-Identifier: GPL-3.0-only -use crate::cli::commands::{bonding_information, build_info, migrate, node_details, run, sign}; +use crate::cli::commands::{ + bonding_information, build_info, migrate, node_details, run, sign, test_throughput, +}; use crate::env::vars::{NYMNODE_CONFIG_ENV_FILE_ARG, NYMNODE_NO_BANNER_ARG}; -use crate::error::NymNodeError; +use crate::logging::setup_tracing_logger; use clap::{Parser, Subcommand}; use nym_bin_common::bin_info; +use std::future::Future; use std::sync::OnceLock; -mod commands; +pub(crate) mod commands; mod helpers; pub const DEFAULT_NYMNODE_ID: &str = "default-nym-node"; @@ -42,15 +45,31 @@ pub(crate) struct Cli { } impl Cli { - pub(crate) async fn execute(self) -> Result<(), NymNodeError> { - match self.command { - Commands::BuildInfo(args) => build_info::execute(args), - Commands::BondingInformation(args) => bonding_information::execute(args).await, - Commands::NodeDetails(args) => node_details::execute(args).await, - Commands::Run(args) => run::execute(*args).await, - Commands::Migrate(args) => migrate::execute(*args).await, - Commands::Sign(args) => sign::execute(args).await, + fn execute_async(fut: F) -> anyhow::Result { + Ok(tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build()? + .block_on(fut)) + } + + pub(crate) fn execute(self) -> anyhow::Result<()> { + // NOTE: `test_throughput` sets up its own logger as it has to include additional layers + if !matches!(self.command, Commands::TestThroughput(..)) { + setup_tracing_logger()?; } + + match self.command { + Commands::BuildInfo(args) => build_info::execute(args)?, + Commands::BondingInformation(args) => { + { Self::execute_async(bonding_information::execute(args))? }? + } + Commands::NodeDetails(args) => { Self::execute_async(node_details::execute(args))? }?, + Commands::Run(args) => { Self::execute_async(run::execute(*args))? }?, + Commands::Migrate(args) => migrate::execute(*args)?, + Commands::Sign(args) => { Self::execute_async(sign::execute(args))? }?, + Commands::TestThroughput(args) => test_throughput::execute(args)?, + } + Ok(()) } } @@ -73,6 +92,11 @@ pub(crate) enum Commands { /// Use identity key of this node to sign provided message. Sign(sign::Args), + + /// Attempt to approximate the maximum mixnet throughput if nym-node + /// was running on this machine in mixnet mode + #[clap(hide = true)] + TestThroughput(test_throughput::Args), } #[cfg(test)] diff --git a/nym-node/src/logging.rs b/nym-node/src/logging.rs index 2fd15d94b6..332e274944 100644 --- a/nym-node/src/logging.rs +++ b/nym-node/src/logging.rs @@ -1,35 +1,34 @@ // Copyright 2024 - Nym Technologies SA // SPDX-License-Identifier: GPL-3.0-only -use tracing::level_filters::LevelFilter; -use tracing_subscriber::{filter::Directive, EnvFilter}; +use nym_bin_common::logging::{default_tracing_env_filter, default_tracing_fmt_layer}; +use tracing_subscriber::filter::Directive; +use tracing_subscriber::layer::SubscriberExt; +use tracing_subscriber::util::SubscriberInitExt; -pub(crate) fn setup_tracing_logger() -> anyhow::Result<()> { +pub(crate) fn granual_filtered_env() -> anyhow::Result { fn directive_checked(directive: impl Into) -> anyhow::Result { directive.into().parse().map_err(From::from) } - let log_builder = tracing_subscriber::fmt() - // Use a more compact, abbreviated log format - .compact() - // Display source code file paths - .with_file(true) - // Display source code line numbers - .with_line_number(true) - // Don't display the event's target (module path) - .with_target(false); + let mut filter = default_tracing_env_filter(); - let mut filter = EnvFilter::builder() - // if RUST_LOG isn't set, set default level - .with_default_directive(LevelFilter::INFO.into()) - .from_env_lossy(); // these crates are more granularly filtered let filter_crates = ["defguard_wireguard_rs"]; for crate_name in filter_crates { filter = filter.add_directive(directive_checked(format!("{}=warn", crate_name))?); } + Ok(filter) +} - log_builder.with_env_filter(filter).init(); +pub(crate) fn build_tracing_logger() -> anyhow::Result { + Ok(tracing_subscriber::registry() + .with(default_tracing_fmt_layer(std::io::stderr)) + .with(granual_filtered_env()?)) +} + +pub(crate) fn setup_tracing_logger() -> anyhow::Result<()> { + build_tracing_logger()?.init(); Ok(()) } diff --git a/nym-node/src/main.rs b/nym-node/src/main.rs index 9d66d778d2..04ff85bb91 100644 --- a/nym-node/src/main.rs +++ b/nym-node/src/main.rs @@ -4,7 +4,7 @@ #![warn(clippy::expect_used)] #![warn(clippy::unwrap_used)] -use crate::{cli::Cli, logging::setup_tracing_logger}; +use crate::cli::Cli; use clap::{crate_name, crate_version, Parser}; use nym_bin_common::logging::maybe_print_banner; use nym_config::defaults::setup_env; @@ -15,10 +15,10 @@ mod env; pub(crate) mod error; mod logging; pub(crate) mod node; +pub(crate) mod throughput_tester; pub(crate) mod wireguard; -#[tokio::main] -async fn main() -> anyhow::Result<()> { +fn main() -> anyhow::Result<()> { // std::env::set_var( // "RUST_LOG", // "trace,handlebars=warn,tendermint_rpc=warn,h2=warn,hyper=warn,rustls=warn,reqwest=warn,tungstenite=warn,async_tungstenite=warn,tokio_util=warn,tokio_tungstenite=warn,tokio-util=warn", @@ -26,13 +26,12 @@ async fn main() -> anyhow::Result<()> { let cli = Cli::parse(); setup_env(cli.config_env_file.as_ref()); - setup_tracing_logger()?; if !cli.no_banner { maybe_print_banner(crate_name!(), crate_version!()); } - cli.execute().await?; + cli.execute()?; Ok(()) } diff --git a/nym-node/src/node/mixnet/packet_forwarding/mod.rs b/nym-node/src/node/mixnet/packet_forwarding/mod.rs index a61f5517ec..db120e23a7 100644 --- a/nym-node/src/node/mixnet/packet_forwarding/mod.rs +++ b/nym-node/src/node/mixnet/packet_forwarding/mod.rs @@ -1,7 +1,6 @@ // Copyright 2024 - Nym Technologies SA // SPDX-License-Identifier: GPL-3.0-only -use crate::node::mixnet::packet_forwarding::global::is_global_ip; use crate::node::shared_network::RoutingFilter; use futures::StreamExt; use nym_mixnet_client::forwarder::{ @@ -13,38 +12,33 @@ use nym_nonexhaustive_delayqueue::{Expired, NonExhaustiveDelayQueue}; use nym_sphinx_forwarding::packet::MixPacket; use nym_task::ShutdownToken; use std::io; -use std::net::IpAddr; use tokio::time::Instant; use tracing::{debug, error, trace, warn}; pub(crate) mod global; -pub struct PacketForwarder { - testnet: bool, - +pub struct PacketForwarder { delay_queue: NonExhaustiveDelayQueue, mixnet_client: C, metrics: NymNodeMetrics, - routing_filter: RoutingFilter, + routing_filter: F, packet_sender: MixForwardingSender, packet_receiver: MixForwardingReceiver, shutdown: ShutdownToken, } -impl PacketForwarder { +impl PacketForwarder { pub fn new( client: C, - testnet: bool, - routing_filter: RoutingFilter, + routing_filter: F, metrics: NymNodeMetrics, shutdown: ShutdownToken, ) -> Self { let (packet_sender, packet_receiver) = mix_forwarding_channels(); PacketForwarder { - testnet, delay_queue: NonExhaustiveDelayQueue::new(), mixnet_client: client, metrics, @@ -59,22 +53,14 @@ impl PacketForwarder { self.packet_sender.clone() } - fn should_route(&mut self, ip_addr: IpAddr) -> bool { - // only allow non-global ips on testnets - if self.testnet && !is_global_ip(&ip_addr) { - return true; - } - - self.routing_filter.attempt_resolve(ip_addr).should_route() - } - fn forward_packet(&mut self, packet: MixPacket) where C: SendWithoutResponse, + F: RoutingFilter, { let next_hop = packet.next_hop(); - if !self.should_route(next_hop.as_ref().ip()) { + if !self.routing_filter.should_route(next_hop.as_ref().ip()) { debug!("dropping packet as the egress address does not belong to any known node"); self.metrics .mixnet @@ -113,6 +99,7 @@ impl PacketForwarder { fn handle_done_delaying(&mut self, packet: Expired) where C: SendWithoutResponse, + F: RoutingFilter, { let delayed_packet = packet.into_inner(); self.forward_packet(delayed_packet); @@ -121,6 +108,7 @@ impl PacketForwarder { fn handle_new_packet(&mut self, new_packet: PacketToForward) where C: SendWithoutResponse, + F: RoutingFilter, { // in case of a zero delay packet, don't bother putting it in the delay queue, // just forward it immediately @@ -152,6 +140,7 @@ impl PacketForwarder { pub async fn run(&mut self) where C: SendWithoutResponse, + F: RoutingFilter, { let mut processed = 0; trace!("starting PacketForwarder"); diff --git a/nym-node/src/node/mod.rs b/nym-node/src/node/mod.rs index f68a2d5553..abf53ee102 100644 --- a/nym-node/src/node/mod.rs +++ b/nym-node/src/node/mod.rs @@ -29,7 +29,7 @@ use crate::node::mixnet::packet_forwarding::PacketForwarder; use crate::node::mixnet::shared::ProcessingConfig; use crate::node::mixnet::SharedFinalHopData; use crate::node::shared_network::{ - CachedNetwork, CachedTopologyProvider, NetworkRefresher, RoutingFilter, + CachedNetwork, CachedTopologyProvider, NetworkRefresher, OpenFilter, RoutingFilter, }; use nym_bin_common::bin_info; use nym_crypto::asymmetric::{ed25519, x25519}; @@ -461,6 +461,10 @@ impl NymNode { &self.config } + pub(crate) fn shutdown_token>(&self, child_suffix: S) -> ShutdownToken { + self.shutdown_manager.clone_token(child_suffix) + } + pub(crate) fn with_accepted_operator_terms_and_conditions( mut self, accepted_operator_terms_and_conditions: bool, @@ -528,12 +532,17 @@ impl NymNode { self.x25519_sphinx_keys.public_key() } + pub(crate) fn x25519_sphinx_keys(&self) -> Arc { + self.x25519_sphinx_keys.clone() + } + pub(crate) fn x25519_noise_key(&self) -> &x25519::PublicKey { self.x25519_noise_keys.public_key() } async fn build_network_refresher(&self) -> Result { NetworkRefresher::initialise_new( + self.config.debug.testnet, self.user_agent(), self.config.mixnet.nym_api_urls.clone(), self.config.debug.topology_cache_ttl, @@ -970,12 +979,15 @@ impl NymNode { events_sender } - pub(crate) fn start_mixnet_listener( + pub(crate) fn start_mixnet_listener( &self, active_clients_store: &ActiveClientsStore, - routing_filter: RoutingFilter, + routing_filter: F, shutdown: ShutdownToken, - ) -> (MixForwardingSender, ActiveConnections) { + ) -> (MixForwardingSender, ActiveConnections) + where + F: RoutingFilter + Send + Sync + 'static, + { let processing_config = ProcessingConfig::new(&self.config); // we're ALWAYS listening for mixnet packets, either for forward or final hops (or both) @@ -1002,7 +1014,6 @@ impl NymNode { let mut packet_forwarder = PacketForwarder::new( mixnet_client, - self.config.debug.testnet, routing_filter, self.metrics.clone(), shutdown.clone_with_suffix("mix-packet-forwarder"), @@ -1028,6 +1039,19 @@ impl NymNode { (mix_packet_sender, active_connections) } + pub(crate) async fn run_minimal_mixnet_processing(self) -> Result<(), NymNodeError> { + self.start_mixnet_listener( + &ActiveClientsStore::new(), + OpenFilter, + self.shutdown_manager.clone_token("mixnet-traffic"), + ); + + self.shutdown_manager.close(); + self.shutdown_manager.wait_for_shutdown_signal().await; + + Ok(()) + } + pub(crate) async fn run(mut self) -> Result<(), NymNodeError> { info!("starting Nym Node {} with the following modes: mixnode: {}, entry: {}, exit: {}, wireguard: {}", self.ed25519_identity_key(), diff --git a/nym-node/src/node/shared_network.rs b/nym-node/src/node/shared_network.rs index aa2e378541..3abd2f843a 100644 --- a/nym-node/src/node/shared_network.rs +++ b/nym-node/src/node/shared_network.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-only use crate::error::NymNodeError; +use crate::node::mixnet::packet_forwarding::global::is_global_ip; use arc_swap::ArcSwap; use async_trait::async_trait; use nym_gateway::node::UserAgent; @@ -22,8 +23,34 @@ use tracing::log::error; use tracing::{debug, trace, warn}; use url::Url; +pub(crate) trait RoutingFilter { + fn should_route(&self, ip: IpAddr) -> bool; +} + +#[derive(Debug, Copy, Clone, Default)] +pub(crate) struct OpenFilter; + +impl RoutingFilter for OpenFilter { + fn should_route(&self, _: IpAddr) -> bool { + true + } +} + +impl RoutingFilter for NetworkRoutingFilter { + fn should_route(&self, ip: IpAddr) -> bool { + // only allow non-global ips on testnets + if self.testnet_mode && !is_global_ip(&ip) { + return true; + } + + self.attempt_resolve(ip).should_route() + } +} + #[derive(Clone)] -pub(crate) struct RoutingFilter { +pub(crate) struct NetworkRoutingFilter { + testnet_mode: bool, + resolved: KnownNodes, // while this is technically behind a lock, it should not be called too often as once resolved it will @@ -31,9 +58,10 @@ pub(crate) struct RoutingFilter { pending: UnknownNodes, } -impl RoutingFilter { - fn new_empty() -> Self { - RoutingFilter { +impl NetworkRoutingFilter { + fn new_empty(testnet_mode: bool) -> Self { + NetworkRoutingFilter { + testnet_mode, resolved: Default::default(), pending: Default::default(), } @@ -254,11 +282,12 @@ pub struct NetworkRefresher { shutdown_token: ShutdownToken, network: CachedNetwork, - routing_filter: RoutingFilter, + routing_filter: NetworkRoutingFilter, } impl NetworkRefresher { pub(crate) async fn initialise_new( + testnet: bool, user_agent: UserAgent, nym_api_urls: Vec, full_refresh_interval: Duration, @@ -280,7 +309,7 @@ impl NetworkRefresher { pending_check_interval, shutdown_token, network: CachedNetwork::new_empty(), - routing_filter: RoutingFilter::new_empty(), + routing_filter: NetworkRoutingFilter::new_empty(testnet), }; this.obtain_initial_network().await?; @@ -403,7 +432,7 @@ impl NetworkRefresher { .map_err(|source| NymNodeError::InitialTopologyQueryFailure { source }) } - pub(crate) fn routing_filter(&self) -> RoutingFilter { + pub(crate) fn routing_filter(&self) -> NetworkRoutingFilter { self.routing_filter.clone() } diff --git a/nym-node/src/throughput_tester/client.rs b/nym-node/src/throughput_tester/client.rs new file mode 100644 index 0000000000..3031ce5252 --- /dev/null +++ b/nym-node/src/throughput_tester/client.rs @@ -0,0 +1,438 @@ +// Copyright 2025 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use crate::throughput_tester::stats::ClientStats; +use anyhow::bail; +use arrayref::array_ref; +use blake2::VarBlake2b; +use chacha::ChaCha; +use futures::{stream, SinkExt, Stream, StreamExt}; +use human_repr::{HumanCount, HumanDuration, HumanThroughput}; +use lioness::Lioness; +use nym_crypto::asymmetric::x25519; +use nym_sphinx_addressing::nodes::NymNodeRoutingAddress; +use nym_sphinx_framing::codec::{NymCodec, NymCodecError}; +use nym_sphinx_framing::packet::FramedNymPacket; +use nym_sphinx_params::PacketSize; +use nym_sphinx_routing::generate_hop_delays; +use nym_sphinx_types::header::keys::PayloadKey; +use nym_sphinx_types::{ + Destination, DestinationAddressBytes, Node, NymPacket, SphinxHeader, + DESTINATION_ADDRESS_LENGTH, IDENTIFIER_LENGTH, +}; +use nym_task::ShutdownToken; +use rand::rngs::OsRng; +use std::net::SocketAddr; +use std::pin::Pin; +use std::task::{Context, Poll, Waker}; +use std::time::Duration; +use time::OffsetDateTime; +use tokio::net::{TcpListener, TcpStream}; +use tokio::select; +use tokio::time::{interval, sleep, Instant}; +use tokio_util::codec::Framed; +use tracing::{debug, error, info, Span}; +use tracing_indicatif::span_ext::IndicatifSpanExt; + +struct PacketTag { + sending_timestamp: OffsetDateTime, + batch_id: u64, + index: u64, +} + +impl PacketTag { + const SIZE: usize = 32; + + fn elapsed(&self) -> time::Duration { + OffsetDateTime::now_utc() - self.sending_timestamp + } + + fn elapsed_nanos(&self) -> u64 { + // here we're making few assumptions: the latency is lower than u64::MAX + // and it's strictly positive (which are rather valid...) + self.elapsed().whole_nanoseconds() as u64 + } + + fn to_bytes(&self) -> Vec { + self.sending_timestamp + .unix_timestamp_nanos() + .to_be_bytes() + .into_iter() + .chain(self.batch_id.to_be_bytes()) + .chain(self.index.to_be_bytes()) + .collect() + } + + #[allow(clippy::unwrap_used)] + fn from_bytes(bytes: &[u8]) -> PacketTag { + let sending_timestamp = i128::from_be_bytes(bytes[0..16].try_into().unwrap()); + let sending_timestamp = + OffsetDateTime::from_unix_timestamp_nanos(sending_timestamp).unwrap(); + + let batch_id = u64::from_be_bytes(bytes[8..16].try_into().unwrap()); + let index = u64::from_be_bytes(bytes[16..24].try_into().unwrap()); + PacketTag { + sending_timestamp, + batch_id, + index, + } + } +} + +pub(crate) struct ThroughputTestingClient { + stats: ClientStats, + last_received_update: Instant, + last_received_at_update: usize, + current_batch: u64, + sending_delay: Duration, + latency_threshold: Duration, + current_batch_size: usize, + forward_header_bytes: Vec, + unwrapped_forward_payload_bytes: Vec, + shutdown_token: ShutdownToken, + local_address: SocketAddr, + listener: TcpListener, + forward_connection: Framed, + payload_key: PayloadKey, +} + +impl ThroughputTestingClient { + pub(crate) async fn try_create( + initial_sending_delay: Duration, + initial_batch_size: usize, + latency_threshold: Duration, + node_keys: &x25519::KeyPair, + node_listener: SocketAddr, + stats: ClientStats, + cancellation_token: ShutdownToken, + ) -> anyhow::Result { + // attempt to bind to some port to receive processed packets + let listener = TcpListener::bind(SocketAddr::from(([127, 0, 0, 1], 0))).await?; + let local_address = listener.local_addr()?; + + info!("listening on {local_address}"); + + // create the sphinx packet we're going to be repeatedly sending + // (next hop has to be our mixnode, then this client, and then it doesn't matter since the packet won't + // get further processed) + let mut rng = OsRng; + // keys of this client + let ephemeral_keys = x25519::KeyPair::new(&mut rng); + + let route = [ + Node::new( + NymNodeRoutingAddress::from(node_listener).try_into()?, + (*node_keys.public_key()).into(), + ), + Node::new( + NymNodeRoutingAddress::from(local_address).try_into()?, + (*ephemeral_keys.public_key()).into(), + ), + Node::new( + NymNodeRoutingAddress::from(local_address).try_into()?, + (*ephemeral_keys.public_key()).into(), + ), + ]; + let destination = Destination::new( + DestinationAddressBytes::from_bytes([0u8; DESTINATION_ADDRESS_LENGTH]), + [0u8; IDENTIFIER_LENGTH], + ); + let delays = generate_hop_delays(Duration::default(), 3); + let payload = PacketSize::RegularPacket.payload_size(); + + let forward_packet = + NymPacket::sphinx_build(payload, b"foomp", &route, &destination, &delays)?; + + // SAFETY: we constructed a sphinx packet... + #[allow(clippy::unwrap_used)] + let sphinx_packet = forward_packet.as_sphinx_packet().unwrap(); + let header = &sphinx_packet.header; + + // derive the routing keys of our node so we could tag the payload to figure out latency + // by tagging the packet + let routing_keys = SphinxHeader::compute_routing_keys( + &header.shared_secret, + (&node_keys.private_key()).as_ref(), + ); + let payload_key = routing_keys.payload_key; + let unwrapped_payload = sphinx_packet.payload.unwrap(&payload_key)?; + let unwrapped_forward_payload_bytes = unwrapped_payload.into_bytes(); + + let start = Instant::now(); + let forward_connection = loop { + if let Ok(connection) = TcpStream::connect(node_listener).await { + break connection; + } + // fallback + sleep(Duration::from_secs(1)).await; + if start.elapsed() > Duration::from_secs(10) { + bail!("failed to connect to local nym-node") + } + }; + + Ok(ThroughputTestingClient { + stats, + last_received_update: Instant::now(), + last_received_at_update: 0, + current_batch: 0, + sending_delay: initial_sending_delay, + latency_threshold, + current_batch_size: initial_batch_size, + forward_header_bytes: sphinx_packet.header.to_bytes(), + unwrapped_forward_payload_bytes, + shutdown_token: cancellation_token, + local_address, + listener, + forward_connection: Framed::new(forward_connection, NymCodec), + payload_key, + }) + } + + fn update_progress_bar(&mut self) { + let received = self.stats.received(); + let sent = self.stats.sent(); + let latency = self.stats.average_latency_duration(); + let received_since_update = received - self.last_received_at_update; + + let time_delta_secs = self.last_received_update.elapsed().as_secs_f64(); + let receive_rate = received_since_update as f64 / time_delta_secs; + + self.last_received_at_update = received; + self.last_received_update = Instant::now(); + // I couldn't figure out how to directly pull it from span fields without duplication, + // so that's a second best + Span::current().pb_set_message(&format!( + "{}: CURRENT SENDING DELAY/BATCH: {} / {} | received: {} sent: {} (avg packet latency: {}, avg receive rate: {})", + self.local_address, + self.sending_delay.human_duration(), + self.current_batch_size, + received.human_count_bare(), + sent.human_count_bare(), + latency.human_duration(), + receive_rate.human_throughput("packets") + )); + } + + fn lioness_encrypt(&self, block: &mut [u8]) -> anyhow::Result<()> { + let lioness_cipher = Lioness::::new_raw(array_ref!( + self.payload_key, + 0, + lioness::RAW_KEY_SIZE + )); + lioness_cipher.encrypt(block)?; + Ok(()) + } + + fn tag_framed_packet(&self, tag: PacketTag) -> anyhow::Result { + let tag_bytes = tag.to_bytes(); + + let mut payload_bytes = self.unwrapped_forward_payload_bytes.clone(); + payload_bytes[..PacketTag::SIZE].copy_from_slice(&tag_bytes); + + self.lioness_encrypt(&mut payload_bytes)?; + + let mut packet_bytes = self.forward_header_bytes.clone(); + packet_bytes.append(&mut payload_bytes); + + let forward_packet = NymPacket::sphinx_from_bytes(&packet_bytes)?; + Ok(FramedNymPacket::new(forward_packet, Default::default())) + } + + async fn send_packets(&mut self) -> anyhow::Result<()> { + // mess with our payload in such a way that upon unwrapping by the first hop, + // we'll get our tag + let mut batch = Vec::with_capacity(self.current_batch_size); + let now = OffsetDateTime::now_utc(); + for i in 0..self.current_batch_size { + let tag = PacketTag { + sending_timestamp: now, + batch_id: self.current_batch, + index: i as u64, + }; + let framed_packet = self.tag_framed_packet(tag)?; + batch.push(Ok(framed_packet)); + } + + self.current_batch += 1; + self.forward_connection + .send_all(&mut stream::iter(batch)) + .await?; + self.stats.new_sent_batch(self.current_batch_size); + + Ok(()) + } + + // don't bother processing packets, just increment the count because that's the only thing that matters + fn handle_received(&mut self, maybe_packet: Result) { + let Ok(received) = maybe_packet else { + error!("FAILED TO RECEIVE PACKET"); + return; + }; + let inner = received.into_inner(); + // safety: we sent a sphinx packet... + #[allow(clippy::unwrap_used)] + let sphinx = inner.as_sphinx_packet().unwrap(); + let tag = PacketTag::from_bytes(sphinx.payload.as_bytes()); + + self.stats.new_received(tag.elapsed_nanos()); + } + + fn update_sending_rates(&mut self) { + let current = self.stats.average_latency_nanos() as f64; + let threshold = self.latency_threshold.as_nanos() as f64; + + let saturation = current / threshold; + + let sending_delay_nanos = self.sending_delay.as_nanos(); + let batch_size = self.current_batch_size; + + let diff = 1. - saturation; + + if saturation > 1. { + debug!("saturation {saturation:.2}, packet latency over threshold: need to decrease sending rate"); + } else { + debug!("saturation {saturation:.2}, packet latency under threshold: can increase sending rate"); + } + + // be conservative and only apply 50% of the diff + // (and split it equally between sending delay and batch size) + // but also make sure the current values don't increase by more than 5% + let mut new_batch_size = (batch_size as f64 * (1. + 0.25 * diff)).floor() as u64; + let mut new_sending_delay_nanos = + (sending_delay_nanos as f64 * (1. - 0.25 * diff)).floor() as u64; + + if (new_batch_size as f64) > (batch_size as f64 * 1.05) { + new_batch_size = ((batch_size as f64) * 1.05) as u64; + } + if (new_batch_size as f64) < (batch_size as f64 * 0.95) { + new_batch_size = ((batch_size as f64) * 0.95) as u64; + } + + if (new_sending_delay_nanos as f64) > (sending_delay_nanos as f64 * 1.05) { + new_sending_delay_nanos = ((sending_delay_nanos as f64) * 1.05) as u64; + } + if (new_sending_delay_nanos as f64) < (sending_delay_nanos as f64 * 0.95) { + new_sending_delay_nanos = ((sending_delay_nanos as f64) * 0.95) as u64; + } + + // normalize values + if new_batch_size < 20 { + new_batch_size = 20; + } + let mut new_sending_delay = Duration::from_nanos(new_sending_delay_nanos); + + if new_sending_delay.is_zero() { + new_sending_delay = Duration::from_micros(500); + } + if new_sending_delay.as_millis() > 100 { + new_sending_delay = Duration::from_millis(100); + } + + debug!( + "changing sending delay from {} to {}", + self.sending_delay.human_duration(), + new_sending_delay.human_duration() + ); + debug!("changing sending batch from {batch_size} to {new_batch_size}"); + + self.sending_delay = new_sending_delay; + self.current_batch_size = new_batch_size as usize; + } + + #[allow(clippy::panic)] + pub(crate) async fn run(mut self) -> anyhow::Result<()> { + let mut ingress_connection = StreamWrapper::default(); + + let mut sending_interval = interval(self.sending_delay); + sending_interval.reset(); + + // quite arbitrary + let mut update_interval = interval(Duration::from_millis(500)); + update_interval.reset(); + + let mut last_rate_update = Instant::now(); + + loop { + select! { + biased; + _ = self.shutdown_token.cancelled() => { + info!("cancelled"); + return Ok(()); + } + _ = update_interval.tick() => { + self.update_progress_bar(); + + // every 500ms attempt to adjust sending rates + if last_rate_update.elapsed() > Duration::from_millis(500) { + last_rate_update = Instant::now(); + self.update_sending_rates(); + sending_interval = interval(self.sending_delay); + sending_interval.reset(); + } + + } + accepted = self.listener.accept() => { + info!("accepted connection"); + if ingress_connection.inner.is_some() { + // this should never happen under local settings + // (and since it's not exposed to 'proper' traffic, it's fine to panic and shutdown) + panic!("attempted to overwrite existing connection") + } + let (stream, _) = accepted?; + let framed = Framed::new(stream, NymCodec); + ingress_connection.set(framed); + } + received = ingress_connection.next() => { + let Some(received) = received else { + // if the stream has terminated, we return + if ingress_connection.inner.is_some() { + return Ok(()) + } + continue; + }; + self.handle_received(received) + } + _ = sending_interval.tick() => { + self.send_packets().await?; + } + } + } + } +} + +// I must be blind, because I couldn't find something to do equivalent of `OptionStream`... +#[derive(Default)] +struct StreamWrapper { + inner: Option>, + maybe_initial_waker: Option, +} + +impl StreamWrapper { + fn set(&mut self, inner: Framed) { + self.inner = Some(inner); + if let Some(waker) = self.maybe_initial_waker.take() { + waker.wake(); + } + } +} + +impl Stream for StreamWrapper { + type Item = as Stream>::Item; + + fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + match self.inner.as_mut() { + None => { + self.maybe_initial_waker = Some(cx.waker().clone()); + Poll::Pending + } + Some(inner) => Pin::new(inner).poll_next(cx), + } + } + + fn size_hint(&self) -> (usize, Option) { + match &self.inner { + None => (0, None), + Some(inner) => inner.size_hint(), + } + } +} diff --git a/nym-node/src/throughput_tester/global_stats.rs b/nym-node/src/throughput_tester/global_stats.rs new file mode 100644 index 0000000000..97239ddcee --- /dev/null +++ b/nym-node/src/throughput_tester/global_stats.rs @@ -0,0 +1,183 @@ +// Copyright 2025 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use crate::throughput_tester::stats::ClientStats; +use colored::Colorize; +use human_repr::{HumanCount, HumanDuration, HumanThroughput}; +use nym_task::ShutdownToken; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::fs::create_dir_all; +use std::path::PathBuf; +use std::time::Duration; +use sysinfo::System; +use time::OffsetDateTime; +use tokio::select; +use tokio::time::{interval, Instant}; +use tracing::{error, info, Span}; +use tracing_indicatif::span_ext::IndicatifSpanExt; + +#[derive(Default, Serialize, Deserialize)] +pub(crate) struct StatsRecord { + timestamp: i64, + receive_rate: f64, + latency: u64, + sent: usize, + received: usize, +} + +pub(crate) struct GlobalStatsUpdater { + system: System, + last_update: Instant, + last_total_received: usize, + header_span: Span, + client_stats: Vec, + + global_records: Vec, + records: HashMap>, + + output_directory: PathBuf, + shutdown: ShutdownToken, +} + +impl GlobalStatsUpdater { + pub(crate) fn new( + header_span: Span, + client_stats: Vec, + output_directory: PathBuf, + shutdown: ShutdownToken, + ) -> Self { + let mut system_info = System::new_all(); + system_info.refresh_cpu_usage(); + + // pre-allocate vecs + let mut records = HashMap::new(); + for (i, _) in client_stats.iter().enumerate() { + records.insert(i, vec![]); + } + + GlobalStatsUpdater { + system: system_info, + last_update: Instant::now(), + last_total_received: 0, + header_span, + client_stats, + global_records: vec![], + records, + output_directory, + shutdown, + } + } + + fn update_stats_span(&mut self) { + let now = OffsetDateTime::now_utc().unix_timestamp(); + let time_delta_secs = self.last_update.elapsed().as_secs_f64(); + + let mut all_received = 0; + let mut all_sent = 0; + let mut all_latencies = 0; + for (i, stat) in self.client_stats.iter().enumerate() { + // SAFETY: we create all entries during initialisation + #[allow(clippy::unwrap_used)] + let records = self.records.get_mut(&i).unwrap(); + + let mut client_record = StatsRecord::default(); + + let sent = stat.sent(); + let received = stat.received(); + let latency = stat.average_latency_nanos(); + + client_record.timestamp = now; + client_record.received = received; + client_record.sent = sent; + client_record.latency = latency; + if let Some(last) = records.last() { + let receive_rate = (received - last.received) as f64 / time_delta_secs; + client_record.receive_rate = receive_rate; + } + records.push(client_record); + + all_sent += sent; + all_received += received; + all_latencies += latency; + } + + let receive_rate = (all_received - self.last_total_received) as f64 / time_delta_secs; + let avg_rate = receive_rate.human_throughput("packets"); + let avg_latency = all_latencies as f64 / self.client_stats.len() as f64; + + self.global_records.push(StatsRecord { + timestamp: now, + receive_rate, + latency: avg_latency as u64, + sent: all_sent, + received: all_received, + }); + + self.system.refresh_cpu_usage(); + let cpu_usage = self.system.global_cpu_usage(); + let cpu_count = self.system.cpus().len(); + let usage_per_cpu = cpu_usage / cpu_count as f32; + + let formatted_usage = if usage_per_cpu < 0.3 { + format!("{:.2}%", usage_per_cpu * 100.).green().bold() + } else if usage_per_cpu < 0.7 { + format!("{:.2}%", usage_per_cpu * 100.).yellow().bold() + } else { + format!("{:.2}%", usage_per_cpu * 100.).red().bold() + }; + + self.header_span.pb_set_message(&format!( + "active_clients: {} | total received: {} total sent {} (avg packet latency: {}, total receive rate: {avg_rate}), avg core load: {formatted_usage}", + self.client_stats.len(), + all_received.human_count_bare(), + all_sent.human_count_bare(), + Duration::from_nanos(avg_latency as u64).human_duration() + )); + self.last_total_received = all_received; + self.last_update = Instant::now(); + } + + fn save_results_to_files(&self) -> anyhow::Result<()> { + create_dir_all(self.output_directory.as_path())?; + + let global = self.output_directory.join("global_stats.csv"); + let mut writer = csv::Writer::from_path(&global)?; + for record in &self.global_records { + writer.serialize(record)?; + } + + info!("wrote global stats to {}", global.display()); + + for (sender_id, records) in self.records.iter() { + let output = self + .output_directory + .join(format!("sender{}.csv", sender_id)); + let mut writer = csv::Writer::from_path(&output)?; + for record in records { + writer.serialize(record)?; + } + info!("wrote client records to {}", output.display()); + } + Ok(()) + } + + pub(crate) async fn run(&mut self) { + let mut update_interval = interval(Duration::from_millis(500)); + + loop { + select! { + biased; + _ = self.shutdown.cancelled() => { + if let Err(err) = self.save_results_to_files() { + error!("failed to save measurement results to files: {err}") + } + break; + } + _ = update_interval.tick() => { + self.update_stats_span(); + } + } + } + } +} diff --git a/nym-node/src/throughput_tester/mod.rs b/nym-node/src/throughput_tester/mod.rs new file mode 100644 index 0000000000..68a7719fbd --- /dev/null +++ b/nym-node/src/throughput_tester/mod.rs @@ -0,0 +1,185 @@ +// Copyright 2025 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use crate::config::upgrade_helpers::try_load_current_config; +use crate::node::NymNode; +use crate::throughput_tester::client::ThroughputTestingClient; +use crate::throughput_tester::global_stats::GlobalStatsUpdater; +use crate::throughput_tester::stats::ClientStats; +use futures::future::join_all; +use human_repr::HumanDuration; +use indicatif::{ProgressState, ProgressStyle}; +use nym_crypto::asymmetric::x25519; +use nym_task::ShutdownToken; +use rand::{thread_rng, Rng}; +use std::net::{IpAddr, Ipv4Addr, SocketAddr}; +use std::path::PathBuf; +use std::sync::Arc; +use std::time::Duration; +use tokio::runtime; +use tokio::runtime::Runtime; +use tokio::time::sleep; +use tracing::{info, info_span, instrument}; +use tracing_indicatif::span_ext::IndicatifSpanExt; + +pub(crate) mod client; +pub(crate) mod global_stats; +mod stats; + +pub struct ThroughputTest { + node_runtime: Runtime, + clients_runtime: Runtime, +} + +impl ThroughputTest { + fn new(senders: usize) -> anyhow::Result { + Ok(ThroughputTest { + node_runtime: runtime::Builder::new_multi_thread() + .enable_all() + .thread_name("nym-node-pool") + .build()?, + clients_runtime: runtime::Builder::new_multi_thread() + .enable_all() + .worker_threads(senders) + .thread_name("testing-clients-pool") + .build()?, + }) + } + + fn prepare_nymnode(&self, config_path: PathBuf) -> anyhow::Result { + self.node_runtime.block_on(async { + let mut config = try_load_current_config(config_path).await?; + + // make sure to change bind address to localhost! + config + .mixnet + .bind_address + .set_ip(IpAddr::V4(Ipv4Addr::LOCALHOST)); + + let nym_node = NymNode::new(config).await?; + Ok(nym_node) + }) + } +} + +#[instrument( + skip_all, + fields( + sender_id = %sender_id + ) + +)] +#[allow(clippy::too_many_arguments)] +async fn run_testing_client( + sender_id: usize, + node_keys: Arc, + node_listener: SocketAddr, + packet_latency_threshold: Duration, + starting_sending_batch_size: usize, + starting_sending_delay: Duration, + stats: ClientStats, + shutdown_token: ShutdownToken, +) -> anyhow::Result<()> { + let _ = sender_id; + let client = ThroughputTestingClient::try_create( + starting_sending_delay, + starting_sending_batch_size, + packet_latency_threshold, + &node_keys, + node_listener, + stats, + shutdown_token, + ) + .await?; + + // wait a random amount of time before actually starting to desync the clients a bit + // (so they wouldn't update their rates at the same time) + let delay = Duration::from_millis(thread_rng().gen_range(10..200)); + info!( + "waiting for {} before attempting to start the processing loop", + delay.human_duration() + ); + sleep(delay).await; + + client.run().await +} + +pub(crate) fn test_mixing_throughput( + config_path: PathBuf, + senders: usize, + packet_latency_threshold: Duration, + starting_sending_batch_size: usize, + starting_sending_delay: Duration, + output_directory: PathBuf, +) -> anyhow::Result<()> { + let tester = ThroughputTest::new(senders)?; + + let nym_node = tester.prepare_nymnode(config_path)?; + let listener = nym_node.config().mixnet.bind_address; + + let sphinx_keys = nym_node.x25519_sphinx_keys(); + + let mut stats = Vec::with_capacity(senders); + for _ in 0..senders { + stats.push(ClientStats::default()) + } + + let header_span = info_span!("header"); + header_span.pb_set_style( + &ProgressStyle::with_template( + "testing mixing throughput of this machine... {wide_msg} {elapsed}\n{wide_bar}", + )? + .with_key( + "elapsed", + |state: &ProgressState, writer: &mut dyn std::fmt::Write| { + let _ = writer.write_str(&format!("{}", state.elapsed().human_duration())); + }, + ) + .progress_chars("---"), + ); + header_span.pb_start(); + + // Bit of a hack to show a full "-----" line underneath the header. + header_span.pb_set_length(1); + header_span.pb_set_position(1); + + let mut tasks_handles = Vec::new(); + + for (sender_id, stats) in stats.iter().enumerate() { + let token = nym_node.shutdown_token(format!("dummy-load-client-{sender_id}")); + + let client_future = run_testing_client( + sender_id, + sphinx_keys.clone(), + listener, + packet_latency_threshold, + starting_sending_batch_size, + starting_sending_delay, + stats.clone(), + token, + ); + let handle = tester.clients_runtime.spawn(client_future); + tasks_handles.push(handle); + } + + let mut global_stats = GlobalStatsUpdater::new( + header_span, + stats, + output_directory, + nym_node.shutdown_token("global-stats"), + ); + + let stats_handle = tester.clients_runtime.spawn(async move { + global_stats.run().await; + Ok(()) + }); + tasks_handles.push(stats_handle); + + tester + .node_runtime + .block_on(async move { nym_node.run_minimal_mixnet_processing().await })?; + + tester.clients_runtime.block_on(join_all(tasks_handles)); + + Ok(()) +} diff --git a/nym-node/src/throughput_tester/stats.rs b/nym-node/src/throughput_tester/stats.rs new file mode 100644 index 0000000000..b28a8942e5 --- /dev/null +++ b/nym-node/src/throughput_tester/stats.rs @@ -0,0 +1,58 @@ +// Copyright 2025 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use std::sync::atomic::{AtomicU64, AtomicUsize, Ordering}; +use std::sync::Arc; +use std::time::Duration; + +#[derive(Clone, Default)] +pub(crate) struct ClientStats { + inner: Arc, +} + +impl ClientStats { + pub(crate) fn new_received(&self, new_measurement: u64) { + const ALPHA: f64 = 0.0005; + const ONE_SUB_ALPHA: f64 = 1.0 - ALPHA; + + let old_average_latency = self.inner.average_latency_nanos.load(Ordering::SeqCst); + + let new_average = if old_average_latency == 0 { + new_measurement + } else { + ((ALPHA * new_measurement as f64) + ONE_SUB_ALPHA * old_average_latency as f64) as u64 + }; + + self.inner.received.fetch_add(1, Ordering::SeqCst); + self.inner + .average_latency_nanos + .store(new_average, Ordering::SeqCst); + } + + pub(crate) fn new_sent_batch(&self, batch_size: usize) { + self.inner.sent.fetch_add(batch_size, Ordering::SeqCst); + } + + pub(crate) fn received(&self) -> usize { + self.inner.received.load(Ordering::SeqCst) + } + + pub(crate) fn sent(&self) -> usize { + self.inner.sent.load(Ordering::SeqCst) + } + + pub(crate) fn average_latency_nanos(&self) -> u64 { + self.inner.average_latency_nanos.load(Ordering::SeqCst) + } + + pub(crate) fn average_latency_duration(&self) -> Duration { + Duration::from_nanos(self.average_latency_nanos()) + } +} + +#[derive(Default)] +struct ClientStatsInner { + sent: AtomicUsize, + received: AtomicUsize, + average_latency_nanos: AtomicU64, +} diff --git a/nym-wallet/CHANGELOG.md b/nym-wallet/CHANGELOG.md index 707de916ae..43e550ddf0 100644 --- a/nym-wallet/CHANGELOG.md +++ b/nym-wallet/CHANGELOG.md @@ -2,6 +2,16 @@ ## [Unreleased] +## [2025.7-tex] (2025-04-14) + +- Fix the mac build of the wallet ([#5684]) +- Allow copy and paste on logins fields for the wallet ([#5699]) +- Tauri V2 - Wallet Migration ([#5687]) + +[#5684]: https://github.com/nymtech/nym/pull/5684 +[#5699]: https://github.com/nymtech/nym/pull/5699 +[#5687]: https://github.com/nymtech/nym/pull/5687 + ## [2025.6-chuckles] (2025-04-01) - Wallet-revamp to be in line with new nym-theming ([#5653]) diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index d5f95eb219..cf9ec89098 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -67,7 +67,7 @@ dependencies = [ "cfg-if", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -732,6 +732,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "cipher" version = "0.4.4" @@ -1345,9 +1351,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.9" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" dependencies = [ "powerfmt", "serde", @@ -2044,6 +2050,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", +] + [[package]] name = "getset" version = "0.1.5" @@ -2521,9 +2541,9 @@ checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" [[package]] name = "httparse" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -2582,9 +2602,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.3.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -2616,19 +2636,20 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.26.0" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.3.1", + "hyper 1.6.0", "hyper-util", - "rustls 0.22.4", + "rustls 0.23.25", "rustls-pki-types", "tokio", - "tokio-rustls 0.25.0", + "tokio-rustls 0.26.2", "tower-service", + "webpki-roots 0.26.1", ] [[package]] @@ -2639,7 +2660,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.3.1", + "hyper 1.6.0", "hyper-util", "native-tls", "tokio", @@ -2649,20 +2670,20 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.3" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.0", - "hyper 1.3.1", + "hyper 1.6.0", + "libc", "pin-project-lite", - "socket2 0.5.5", + "socket2 0.5.9", "tokio", - "tower", "tower-service", "tracing", ] @@ -2923,10 +2944,10 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.5", + "socket2 0.5.9", "widestring", "windows-sys 0.48.0", - "winreg 0.50.0", + "winreg", ] [[package]] @@ -3030,10 +3051,11 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -3082,18 +3104,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.169" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" - -[[package]] -name = "line-wrap" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" -dependencies = [ - "safemem", -] +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" [[package]] name = "linked-hash-map" @@ -3603,7 +3616,7 @@ dependencies = [ "mime", "nym-bin-common", "once_cell", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "thiserror 2.0.11", @@ -3756,7 +3769,7 @@ dependencies = [ "nym-mixnet-contract-common", "nym-validator-client", "nym-vesting-contract-common", - "reqwest 0.12.4", + "reqwest 0.12.15", "schemars", "serde", "serde_json", @@ -3803,7 +3816,7 @@ dependencies = [ "nym-serde-helpers", "nym-vesting-contract-common", "prost", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "sha2 0.10.8", @@ -3878,7 +3891,7 @@ dependencies = [ [[package]] name = "nym_wallet" -version = "1.2.15" +version = "1.2.17" dependencies = [ "async-trait", "base64 0.13.1", @@ -3906,9 +3919,10 @@ dependencies = [ "nym-vesting-contract-common", "nym-wallet-types", "once_cell", + "plist", "pretty_env_logger", "rand_chacha 0.3.1", - "reqwest 0.12.4", + "reqwest 0.12.15", "serde", "serde_json", "serde_repr", @@ -3978,9 +3992,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.1" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "opaque-debug" @@ -4424,13 +4438,12 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "plist" -version = "1.5.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdc0001cfea3db57a2e24bc0d818e9e20e554b5f97fabb9bc231dc240269ae06" +checksum = "eac26e981c03a6e53e0aee43c113e3202f5581d5360dae7bd2c70e800dd0451d" dependencies = [ - "base64 0.21.4", - "indexmap 1.9.3", - "line-wrap", + "base64 0.22.1", + "indexmap 2.5.0", "quick-xml", "serde", "time", @@ -4606,13 +4619,67 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.29.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b9228215d82c7b61490fec1de287136b5de6f5700f6e58ea9ad61a7964ca51" +checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" dependencies = [ "memchr", ] +[[package]] +name = "quinn" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.25", + "socket2 0.5.9", + "thiserror 2.0.11", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc" +dependencies = [ + "bytes", + "getrandom 0.3.2", + "rand 0.9.0", + "ring", + "rustc-hash", + "rustls 0.23.25", + "rustls-pki-types", + "slab", + "thiserror 2.0.11", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.5.9", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "quote" version = "1.0.35" @@ -4622,6 +4689,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "rand" version = "0.7.3" @@ -4647,6 +4720,17 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "zerocopy 0.8.24", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -4667,6 +4751,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + [[package]] name = "rand_core" version = "0.5.1" @@ -4685,6 +4779,15 @@ dependencies = [ "getrandom 0.2.10", ] +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -4831,7 +4934,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "system-configuration", + "system-configuration 0.5.1", "tokio", "tokio-rustls 0.24.1", "tower-service", @@ -4839,14 +4942,14 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.50.0", + "winreg", ] [[package]] name = "reqwest" -version = "0.12.4" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "async-compression", "base64 0.22.1", @@ -4858,8 +4961,8 @@ dependencies = [ "http 1.1.0", "http-body 1.0.0", "http-body-util", - "hyper 1.3.1", - "hyper-rustls 0.26.0", + "hyper 1.6.0", + "hyper-rustls 0.27.5", "hyper-tls", "hyper-util", "ipnet", @@ -4870,25 +4973,27 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.22.4", + "quinn", + "rustls 0.23.25", "rustls-pemfile 2.1.2", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", + "system-configuration 0.6.1", "tokio", "tokio-native-tls", - "tokio-rustls 0.25.0", + "tokio-rustls 0.26.2", "tokio-util", + "tower", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", "webpki-roots 0.26.1", - "winreg 0.52.0", + "windows-registry", ] [[package]] @@ -4995,6 +5100,12 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc_version" version = "0.4.0" @@ -5031,14 +5142,14 @@ dependencies = [ [[package]] name = "rustls" -version = "0.22.4" +version = "0.23.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" +checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" dependencies = [ - "log", + "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.102.4", + "rustls-webpki 0.103.1", "subtle", "zeroize", ] @@ -5076,9 +5187,12 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +dependencies = [ + "web-time", +] [[package]] name = "rustls-webpki" @@ -5092,9 +5206,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.102.4" +version = "0.103.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" +checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" dependencies = [ "ring", "rustls-pki-types", @@ -5113,12 +5227,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - [[package]] name = "same-file" version = "1.0.6" @@ -5539,12 +5647,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5727,9 +5835,12 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] [[package]] name = "synstructure" @@ -5750,7 +5861,18 @@ checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", "core-foundation", - "system-configuration-sys", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.4.0", + "core-foundation", + "system-configuration-sys 0.6.0", ] [[package]] @@ -5763,6 +5885,16 @@ dependencies = [ "libc", ] +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "system-deps" version = "5.0.0" @@ -6218,9 +6350,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.39" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa 1.0.9", @@ -6235,15 +6367,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.20" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -6287,7 +6419,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2 0.5.9", "tokio-macros", "windows-sys 0.52.0", ] @@ -6325,27 +6457,25 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.25.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", + "rustls 0.23.25", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" dependencies = [ "bytes", "futures-core", "futures-sink", "pin-project-lite", "tokio", - "tracing", ] [[package]] @@ -6418,31 +6548,30 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.13" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper", "tokio", "tower-layer", "tower-service", - "tracing", ] [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -6450,7 +6579,6 @@ version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -6756,24 +6884,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "wasm-bindgen" -version = "0.2.87" +name = "wasi" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn 2.0.96", @@ -6794,9 +6932,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -6804,9 +6942,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -6817,9 +6955,12 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasmtimer" @@ -6845,6 +6986,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webkit2gtk" version = "0.18.2" @@ -7038,12 +7189,47 @@ dependencies = [ "windows-tokens", ] +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + [[package]] name = "windows-metadata" version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.53.0", +] + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.42.0" @@ -7101,13 +7287,29 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows-tokens" version = "0.39.0" @@ -7132,6 +7334,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.37.0" @@ -7162,6 +7370,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.37.0" @@ -7192,12 +7406,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.37.0" @@ -7228,6 +7454,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.37.0" @@ -7258,6 +7490,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -7276,6 +7514,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.37.0" @@ -7306,6 +7550,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" version = "0.5.10" @@ -7334,16 +7584,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "winres" version = "0.1.12" @@ -7353,6 +7593,15 @@ dependencies = [ "toml 0.5.11", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.4.0", +] + [[package]] name = "write16" version = "1.0.0" @@ -7475,7 +7724,16 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive 0.8.24", ] [[package]] @@ -7489,6 +7747,17 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "zerofrom" version = "0.1.5" diff --git a/nym-wallet/package.json b/nym-wallet/package.json index af6580bc0d..d9534c4a21 100644 --- a/nym-wallet/package.json +++ b/nym-wallet/package.json @@ -1,11 +1,12 @@ { "name": "@nymproject/nym-wallet-app", - "version": "1.2.16", + "version": "1.2.17", "license": "MIT", "main": "index.js", "scripts": { "build": "run-s webpack:prod tauri:build", "dev": "run-p tauri:dev webpack:dev", + "build-macx86": "run-s webpack:prod tauri:buildx86", "lint": "eslint src", "lint:fix": "eslint src --fix", "prebuild": "yarn --cwd .. build", @@ -14,6 +15,7 @@ "storybook": "start-storybook -p 6006", "storybook:build": "build-storybook", "tauri:build": "yarn tauri build", + "tauri:buildx86": "yarn tauri build --target x86_64-apple-darwin", "tauri:dev": "yarn tauri dev", "tsc": "tsc --noEmit true", "tsc:watch": "tsc --noEmit true --watch", diff --git a/nym-wallet/src-tauri/Cargo.toml b/nym-wallet/src-tauri/Cargo.toml index 19bc4f130e..54bddba346 100644 --- a/nym-wallet/src-tauri/Cargo.toml +++ b/nym-wallet/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym_wallet" -version = "1.2.16" +version = "1.2.17" description = "Nym Native Wallet" authors = ["Nym Technologies SA"] license = "" @@ -48,6 +48,7 @@ url = "2.2" k256 = { version = "0.13", features = ["ecdsa", "sha256"] } base64 = "0.13" zeroize = { version = "1.5", features = ["zeroize_derive", "serde"] } +plist = "1.6.0" cosmwasm-std = "2.2.1" cosmrs = { version = "0.21.0" } diff --git a/nym-wallet/src-tauri/src/utils.rs b/nym-wallet/src-tauri/src/utils.rs index 1c18d0206a..59a3305264 100644 --- a/nym-wallet/src-tauri/src/utils.rs +++ b/nym-wallet/src-tauri/src/utils.rs @@ -12,10 +12,7 @@ use nym_validator_client::nyxd::contract_traits::MixnetQueryClient; use nym_wallet_types::app::AppEnv; fn get_env_as_option(key: &str) -> Option { - match ::std::env::var(key) { - Ok(res) => Some(res), - Err(_e) => None, - } + ::std::env::var(key).ok() } #[tauri::command] diff --git a/nym-wallet/src-tauri/src/wallet_storage/mod.rs b/nym-wallet/src-tauri/src/wallet_storage/mod.rs index 14d295a8a4..7280eb911a 100644 --- a/nym-wallet/src-tauri/src/wallet_storage/mod.rs +++ b/nym-wallet/src-tauri/src/wallet_storage/mod.rs @@ -1,6 +1,8 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +#![allow(clippy::doc_overindented_list_items)] + /// The wallet storage file contains a set of logins, each with an associated login ID and an /// encrypted field. Once decrypted, each login contains either an account, or a set of accounts. /// One difference is that the latter have an associated account ID. @@ -2151,7 +2153,7 @@ mod tests { assert!(matches!(acc2, StoredLogin::Mnemonic(_))); let expected_acc1 = bip39::Mnemonic::from_str("country mean universe text phone begin deputy reject result good cram illness common cluster proud swamp digital patrol spread bar face december base kick").unwrap(); - let expected_acc2 = bip39::Mnemonic::from_str("home mansion start quiz dress decide hint second dragon sunny juice always steak real minimum art rival skin draw total pulp foot goddess agent").unwrap(); + let expected_acc2 = bip39::Mnemonic::from_str("home mansion start quiz dress decide hint second dragon sunny juice always steak real minimum art rival skin draw total pulp foot goddess agent").unwrap(); assert_eq!( acc1.as_mnemonic_account().unwrap().mnemonic(), diff --git a/nym-wallet/src-tauri/tauri.conf.json b/nym-wallet/src-tauri/tauri.conf.json index ba7704c0fd..a1e64c03b2 100644 --- a/nym-wallet/src-tauri/tauri.conf.json +++ b/nym-wallet/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "package": { "productName": "nym-wallet", - "version": "1.2.16" + "version": "1.2.17" }, "build": { "distDir": "../dist", diff --git a/package.json b/package.json index afd6cf2240..dbf9d0561b 100644 --- a/package.json +++ b/package.json @@ -1,61 +1,60 @@ { - "name": "@nymproject/nymsphere", - "version": "1.0.0", - "private": true, - "license": "Apache 2.0", - "workspaces": [ - "dist/wasm/**", - "dist/node/**", - "dist/ts/**", - "sdk/typescript/packages/mui-theme", - "sdk/typescript/packages/react-components", - "sdk/typescript/packages/validator-client", - "ts-packages/*", - "nym-wallet", - "explorer", - "explorer-nextjs", - "explorer-v2", - "types", - "clients/validator" - ], - "scripts": { - "nuke": "npx rimraf **/node_modules node_modules", - "scrub": "npx rimraf **/dist dist", - "clean": "lerna run clean", - "build": "run-s build:types build:packages", - "build:wasm": "make sdk-wasm-build", - "build:types": "lerna run --scope @nymproject/types build --stream", - "build:packages": "run-s build:packages:theme build:packages:react", - "build:packages:theme": "lerna run --scope @nymproject/mui-theme build", - "build:packages:react": "lerna run --scope @nymproject/react build", - "build:react-example": "lerna run --scope @nymproject/react-webpack-with-theme-example build --stream", - "build:playground": "lerna run --scope @nymproject/react storybook:build --stream", - "build:ci:storybook": "yarn build && yarn dev:on && run-p build:react-example build:playground && yarn build:ci:storybook:collect-artifacts", - "build:ci:storybook:collect-artifacts": "mkdir -p ts-packages/dist && mv sdk/typescript/packages/react-components/storybook-static ts-packages/dist/storybook && mv sdk/typescript/examples/react/mui-theme/dist ts-packages/dist/example", - "prebuild:ci": "yarn dev:on && yarn", - "build:ci": "run-s build:types build:packages build:wasm build:ci:sdk", - "postbuild:ci": "yarn dev:off", - "build:ci:sdk": "lerna run --scope '{@nymproject/sdk,@nymproject/node-tester,@nymproject/contract-clients,@nymproject/sdk-react,@nymproject/mix-fetch,@nymproject/nodejs-client,@nymproject/mix-fetch-node}' build --stream", - "docs:prod:build": "run-s docs:prod:build:ws", - "docs:prod:build:ws": "lerna run docs:prod:build --stream", - "sdk:build": "./sdk/typescript/scripts/build-prod-sdk.sh", - "sdk:publish": "./sdk/typescript/scripts/publish.sh", - "lint": "lerna run lint --stream", - "lint:fix": "lerna run lint:fix --stream", - "tsc": "lerna run tsc --stream", - "types:lint:fix": "lerna run lint:fix --scope @nymproject/types --scope @nymproject/nym-wallet-app", - "audit:fix": "npm_config_yes=true npx yarn-audit-fix -- --dry-run", - "dev:on": "node sdk/typescript/scripts/dev-mode-add.mjs", - "dev:off": "node sdk/typescript/scripts/dev-mode-remove.mjs" - }, - "devDependencies": { - "@npmcli/node-gyp": "^3.0.0", - "lerna": "^7.3.0", - "node-gyp": "^9.3.1", - "npm-run-all": "^4.1.5", - "tslog": "3.3.3" - }, - "dependencies": { - "lucide-react": "^0.453.0" - } + "name": "@nymproject/nymsphere", + "version": "1.0.0", + "private": true, + "license": "Apache 2.0", + "workspaces": [ + "dist/wasm/**", + "dist/node/**", + "dist/ts/**", + "sdk/typescript/packages/mui-theme", + "sdk/typescript/packages/react-components", + "sdk/typescript/packages/validator-client", + "ts-packages/*", + "nym-wallet", + "explorer-nextjs", + "explorer-v2", + "types", + "clients/validator" + ], + "scripts": { + "nuke": "npx rimraf **/node_modules node_modules", + "scrub": "npx rimraf **/dist dist", + "clean": "lerna run clean", + "build": "run-s build:types build:packages", + "build:wasm": "make sdk-wasm-build", + "build:types": "lerna run --scope @nymproject/types build --stream", + "build:packages": "run-s build:packages:theme build:packages:react", + "build:packages:theme": "lerna run --scope @nymproject/mui-theme build", + "build:packages:react": "lerna run --scope @nymproject/react build", + "build:react-example": "lerna run --scope @nymproject/react-webpack-with-theme-example build --stream", + "build:playground": "lerna run --scope @nymproject/react storybook:build --stream", + "build:ci:storybook": "yarn build && yarn dev:on && run-p build:react-example build:playground && yarn build:ci:storybook:collect-artifacts", + "build:ci:storybook:collect-artifacts": "mkdir -p ts-packages/dist && mv sdk/typescript/packages/react-components/storybook-static ts-packages/dist/storybook && mv sdk/typescript/examples/react/mui-theme/dist ts-packages/dist/example", + "prebuild:ci": "yarn dev:on && yarn", + "build:ci": "run-s build:types build:packages build:wasm build:ci:sdk", + "postbuild:ci": "yarn dev:off", + "build:ci:sdk": "lerna run --scope '{@nymproject/sdk,@nymproject/node-tester,@nymproject/contract-clients,@nymproject/sdk-react,@nymproject/mix-fetch,@nymproject/nodejs-client,@nymproject/mix-fetch-node}' build --stream", + "docs:prod:build": "run-s docs:prod:build:ws", + "docs:prod:build:ws": "lerna run docs:prod:build --stream", + "sdk:build": "./sdk/typescript/scripts/build-prod-sdk.sh", + "sdk:publish": "./sdk/typescript/scripts/publish.sh", + "lint": "lerna run lint --stream", + "lint:fix": "lerna run lint:fix --stream", + "tsc": "lerna run tsc --stream", + "types:lint:fix": "lerna run lint:fix --scope @nymproject/types --scope @nymproject/nym-wallet-app", + "audit:fix": "npm_config_yes=true npx yarn-audit-fix -- --dry-run", + "dev:on": "node sdk/typescript/scripts/dev-mode-add.mjs", + "dev:off": "node sdk/typescript/scripts/dev-mode-remove.mjs" + }, + "devDependencies": { + "@npmcli/node-gyp": "^3.0.0", + "lerna": "^7.3.0", + "node-gyp": "^9.3.1", + "npm-run-all": "^4.1.5", + "tslog": "3.3.3" + }, + "dependencies": { + "lucide-react": "^0.453.0" + } } diff --git a/scripts/kvm-setup/configure-vm.sh b/scripts/kvm-setup/configure-vm.sh new file mode 100644 index 0000000000..e1904313d5 --- /dev/null +++ b/scripts/kvm-setup/configure-vm.sh @@ -0,0 +1,135 @@ + +#!/bin/bash + +# detect active network interface +INTERFACE=$(ip -o link show | awk -F': ' '{print $2}' | grep -v lo | head -n 1) + +echo "Detected active network interface: $INTERFACE" +read -p "Is this correct? (y/n): " CONFIRM +if [[ "$CONFIRM" != "y" ]]; then + echo "Exiting. Please manually specify the correct network interface." + exit 1 +fi + +# prompt for network settings +read -p "Enter IPv4 address for VM (leave blank if not used): " IPv4_VM +read -p "Enter IPv6 address for VM (leave blank if not used): " IPv6_VM +read -p "Enter IPv4 gateway (host server, leave blank if not used): " IPv4_GATEWAY_HOST_SERVER +read -p "Enter IPv6 gateway (host server, leave blank if not used): " IPv6_GATEWAY_HOST_SERVER + +# resize partition +echo "Expanding partition and resizing filesystem..." +growpart /dev/vda 1 +resize2fs /dev/vda1 +df -h + +# ask before continuing +read -p "Continue with network configuration? (y/n): " CONTINUE +if [[ "$CONTINUE" != "y" ]]; then + echo "Exiting." + exit 1 +fi + +# generate Netplan config +NETPLAN_CONFIG="/etc/netplan/01-network-config.yaml" +echo "Creating Netplan configuration at $NETPLAN_CONFIG..." + +cat < $NETPLAN_CONFIG +network: + version: 2 + renderer: networkd + ethernets: + $INTERFACE: + dhcp4: false + dhcp6: false + addresses: +EOF + +# append IPv4 address if provided +if [[ -n "$IPv4_VM" ]]; then + echo " - $IPv4_VM/24" >> $NETPLAN_CONFIG +fi + +# append IPv6 address if provided +if [[ -n "$IPv6_VM" ]]; then + echo " - $IPv6_VM/64" >> $NETPLAN_CONFIG +fi + +echo " routes:" >> $NETPLAN_CONFIG + +# append IPv4 route if provided +if [[ -n "$IPv4_GATEWAY_HOST_SERVER" ]]; then + echo " - to: default" >> $NETPLAN_CONFIG + echo " via: $IPv4_GATEWAY_HOST_SERVER" >> $NETPLAN_CONFIG +fi + +# append IPv6 route if provided +if [[ -n "$IPv6_GATEWAY_HOST_SERVER" ]]; then + echo " - to: default" >> $NETPLAN_CONFIG + echo " via: $IPv6_GATEWAY_HOST_SERVER" >> $NETPLAN_CONFIG +fi + +cat <> $NETPLAN_CONFIG + nameservers: + addresses: + - 1.1.1.1 # Cloudflare IPv4 DNS + - 8.8.8.8 # Google IPv4 DNS + - 2606:4700:4700::1111 # Cloudflare IPv6 DNS + - 2001:4860:4860::8888 # Google IPv6 DNS +EOF + +# secure Netplan config +chmod 600 $NETPLAN_CONFIG + +# generate Netplan configuration +netplan generate + +# ask before applying Netplan +read -p "Apply Netplan changes? (y/n): " CONTINUE +if [[ "$CONTINUE" != "y" ]]; then + echo "Exiting." + exit 1 +fi + +# apply Netplan and verify settings +netplan --debug apply + +# show IP configurations +ip -4 a +ip -6 a +ip -4 r +ip -6 r + +# test network connectivity +echo "Testing IPv4 connectivity for 10 seconds..." +timeout 10 ping -4 google.com + +echo "Testing IPv6 connectivity for 10 seconds..." +timeout 10 ping -6 google.com + +# ask before updating system +read -p "Proceed with system update and upgrade? (y/n): " CONTINUE +if [[ "$CONTINUE" != "y" ]]; then + echo "Skipping updates." +else + apt update && apt upgrade -y +fi + +# generate SSH host keys without password +echo "Generating SSH host keys..." +ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N "" +ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N "" +ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N "" +ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" + +# restart SSH service +systemctl restart ssh.service + +# ensure ~/.ssh directory exists +mkdir -p ~/.ssh + +# Open authorized_keys file for user input +echo "# Add your admin SSH keys here, save and exit!" > ~/.ssh/authorized_keys +nano ~/.ssh/authorized_keys + +echo "Setup complete! Try to ping and ssh from the outside before killing this console" diff --git a/scripts/kvm-setup/initialise-vm.sh b/scripts/kvm-setup/initialise-vm.sh new file mode 100644 index 0000000000..f8755d50c1 --- /dev/null +++ b/scripts/kvm-setup/initialise-vm.sh @@ -0,0 +1,108 @@ +#!/bin/bash + +# check if noble-server-cloudimg-amd64.img is in working dir - if not, wget it +if [[ ! -f noble-server-cloudimg-amd64.img ]]; then + echo "Base image not found. Downloading noble-server-cloudimg-amd64.img..." + wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img + if [[ $? -ne 0 ]]; then + echo "Error: Failed to download the base image. Exiting." + exit 1 + fi +fi + +# prompt for VM_NAME +read -p "Enter VM name: " VM_NAME +if [[ -z "$VM_NAME" ]]; then + echo "Error: VM_NAME cannot be empty. Exiting." + exit 1 +fi + +# prompt for PASSWORD w silent input +read -s -p "Enter password for the VM: " PASSWORD +echo +if [[ -z "$PASSWORD" ]]; then + echo "Error: PASSWORD cannot be empty. Exiting." + exit 1 +fi + +# prompt for number of vCPUs +read -p "Enter the number of vCPUs for the VM: " VCPUS +if [[ -z "$VCPUS" || ! "$VCPUS" =~ ^[0-9]+$ ]]; then + echo "Error: Invalid number of vCPUs. Exiting." + exit 1 +fi + +# prompt for RAM size with suggestions +DEFAULT_RAM=4096 +HALF_RAM=$((DEFAULT_RAM / 2)) +DOUBLE_RAM=$((DEFAULT_RAM * 2)) +TRIPLE_RAM=$((DEFAULT_RAM * 3)) +FOUR_TIMES_RAM=$((DEFAULT_RAM * 4)) +SIX_TIMES_RAM=$((DEFAULT_RAM * 6)) +EIGHT_TIMES_RAM=$((DEFAULT_RAM * 8)) + +echo "Choose the amount of RAM for the VM:" +echo "1) $HALF_RAM MB" +echo "2) $DEFAULT_RAM MB (recommended)" +echo "3) $DOUBLE_RAM MB" +echo "4) $TRIPLE_RAM MB" +echo "5) $FOUR_TIMES_RAM MB" +echo "6) $SIX_TIMES_RAM MB" +echo "7) $EIGHT_TIMES_RAM MB" +read -p "Enter your choice (1-7) or specify a custom amount in MB: " RAM_CHOICE + +case $RAM_CHOICE in + 1) RAM=$HALF_RAM ;; + 2) RAM=$DEFAULT_RAM ;; + 3) RAM=$DOUBLE_RAM ;; + 4) RAM=$TRIPLE_RAM ;; + 5) RAM=$FOUR_TIMES_RAM ;; + 6) RAM=$SIX_TIMES_RAM ;; + 7) RAM=$EIGHT_TIMES_RAM ;; + *) + if [[ "$RAM_CHOICE" =~ ^[0-9]+$ ]]; then + RAM=$RAM_CHOICE + else + echo "Invalid choice. Exiting." + exit 1 + fi + ;; +esac + +# define image path +IMAGE_PATH="/var/lib/libvirt/images/${VM_NAME}.img" + +# copy the base image +echo "Copying the base image to $IMAGE_PATH..." +cp noble-server-cloudimg-amd64.img "$IMAGE_PATH" + +# install guestfs-tools if missing +echo "Checking and installing guestfs-tools if needed..." +if ! dpkg -l | grep -q guestfs-tools; then + sudo apt update && sudo apt install guestfs-tools -y +fi + +# set root password inside the image +echo "Setting root password inside the VM image..." +virt-customize -a "$IMAGE_PATH" --root-password password:"$PASSWORD" + +# resize the image +echo "Resizing the image by +100G..." +qemu-img resize "$IMAGE_PATH" +100G + +# install the VM and run log in prompt +echo "Starting VM installation..." +virt-install \ +--name "$VM_NAME" \ +--ram="$RAM" \ +--vcpus="$VCPUS" \ +--cpu host \ +--hvm \ +--disk bus=virtio,path="$IMAGE_PATH" \ +--network bridge=br0 \ +--graphics none \ +--console pty,target_type=serial \ +--osinfo ubuntunoble \ +--import + +echo "VM $VM_NAME has been successfully installed!" diff --git a/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/src/index.tsx b/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/src/index.tsx index 1c6b557d7e..778645ad4e 100644 --- a/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/src/index.tsx +++ b/sdk/typescript/examples/chat-app/react-webpack-with-theme-example/src/index.tsx @@ -1,5 +1,6 @@ -import * as React from 'react'; -import ReactDOM from 'react-dom'; -import { App } from './App'; +import * as React from "react"; +import ReactDOM from "react-dom/client"; +import { App } from "./App"; -ReactDOM.render(, document.getElementById('app')); +const root = ReactDOM.createRoot(document.getElementById("app") as HTMLElement); +root.render(); diff --git a/sdk/typescript/tests/integration-tests/mix-fetch/package-lock.json b/sdk/typescript/tests/integration-tests/mix-fetch/package-lock.json index fcf414162d..6a334e69d7 100644 --- a/sdk/typescript/tests/integration-tests/mix-fetch/package-lock.json +++ b/sdk/typescript/tests/integration-tests/mix-fetch/package-lock.json @@ -8,90 +8,85 @@ "name": "mix-fetch-tests-runner", "version": "1.0.0", "dependencies": { - "puppeteer": "^21.1.1", + "puppeteer": "^24.4.0", "serve-handler": "^6.1.5" } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", - "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@puppeteer/browsers": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.7.0.tgz", - "integrity": "sha512-sl7zI0IkbQGak/+IE3VEEZab5SSOlI5F6558WvzWGC1n3+C722rfewC1ZIkcF9dsoGSsxhsONoseVlNQG4wWvQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.8.0.tgz", + "integrity": "sha512-yTwt2KWRmCQAfhvbCRjebaSX8pV1//I0Y3g+A7f/eS7gf0l4eRJoUCvcYdVtboeU4CTOZQuqYbZNS8aBYb8ROQ==", + "license": "Apache-2.0", "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" + "debug": "^4.4.0", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.1", + "tar-fs": "^3.0.8", + "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" }, "engines": { - "node": ">=16.3.0" + "node": ">=18" } }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" }, "node_modules/@types/node": { - "version": "20.6.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", - "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", - "optional": true + "version": "22.13.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.14.tgz", + "integrity": "sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==", + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~6.20.0" + } }, "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" } }, "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dependencies": { - "debug": "^4.3.4" - }, + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", "engines": { "node": ">= 14" } @@ -100,30 +95,37 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", "dependencies": { "tslib": "^2.0.1" }, @@ -132,38 +134,93 @@ } }, "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "license": "Apache-2.0" }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.0.2.tgz", + "integrity": "sha512-S5mmkMesiduMqnz51Bfh0Et9EX0aTCJxhsI4bvzFFLs8Z1AV8RDHadfY5CyLwdoLHgXbNBEN1gQcbEtGwuvixw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true } - ] + } + }, + "node_modules/bare-os": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } }, "node_modules/basic-ftp": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", - "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -177,33 +234,11 @@ "concat-map": "0.0.1" } }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", "engines": { "node": "*" } @@ -220,29 +255,19 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/chromium-bidi": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.22.tgz", - "integrity": "sha512-wR7Y9Ioez+cNXT4ZP7VNM1HRTljpNnMSLw4/RnwhhZUP4yCU7kIQND00YiktuHekch68jklGPK1q9Jkb29+fQg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-2.1.2.tgz", + "integrity": "sha512-vtRWBK2uImo5/W2oG6/cDkkHSm+2t6VHgnj+Rcwhb0pP74OoUb4GipyRX/T/y39gYQPhioP0DPShn+A7P6CHNw==", + "license": "Apache-2.0", "dependencies": { - "mitt": "3.0.1" + "mitt": "^3.0.1", + "zod": "^3.24.1" }, "peerDependencies": { "devtools-protocol": "*" @@ -252,6 +277,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -262,17 +288,22 @@ } }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", @@ -288,44 +319,47 @@ } }, "node_modules/cosmiconfig": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", - "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "license": "MIT", "dependencies": { - "import-fresh": "^3.2.1", + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" + "parse-json": "^5.2.0" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/d-fischer" - } - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/data-uri-to-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", - "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -340,6 +374,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -350,51 +385,58 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1159816", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1159816.tgz", - "integrity": "sha512-2cZlHxC5IlgkIWe2pSDmCrDiTzbSJWywjbDDnupOImEBcG31CQgBLV8wWE+5t+C4rimcjHsbzy7CBzf9oFjboA==" + "version": "0.0.1413902", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1413902.tgz", + "integrity": "sha512-yRtvFD8Oyk7C9Os3GmnFZLu53yAfsnyw1s+mLmHHUK0GQEc9zthHWvS1r67Zqzm5t7v56PILHIVZ7kmFMaL2yQ==", + "license": "BSD-3-Clause" }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/escodegen": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -415,6 +457,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -427,6 +470,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -435,6 +479,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -443,6 +488,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -461,7 +507,8 @@ "node_modules/fast-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" }, "node_modules/fast-url-parser": { "version": "1.1.3", @@ -475,27 +522,16 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", "dependencies": { "pend": "~1.2.0" } }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -504,6 +540,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -515,36 +552,24 @@ } }, "node_modules/get-uri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz", - "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", + "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", + "license": "MIT", "dependencies": { "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^5.0.1", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" }, "engines": { "node": ">= 14" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -554,40 +579,23 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { "node": ">= 14" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -599,20 +607,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ip": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", - "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==" + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } @@ -620,12 +638,14 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -633,28 +653,29 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, "node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -692,78 +713,59 @@ "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/netmask": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" }, "engines": { "node": ">= 14" } }, "node_modules/pac-resolver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", - "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", "dependencies": { "degenerator": "^5.0.0", - "ip": "^1.1.8", "netmask": "^2.0.2" }, "engines": { @@ -774,6 +776,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -785,6 +788,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -808,40 +812,41 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/proxy-agent": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", - "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.0", + "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.1" + "socks-proxy-agent": "^8.0.5" }, "engines": { "node": ">= 14" @@ -850,12 +855,14 @@ "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" }, "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -867,40 +874,43 @@ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/puppeteer": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.1.1.tgz", - "integrity": "sha512-2TLntjGA4qLrI9/8N0UK/5OoZJ2Ue7QgphN2SD+RsaHiha12AEiVyMGsB+i6LY1IoPAtEgYIjblQ7lw3kWDNRw==", + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.4.0.tgz", + "integrity": "sha512-E4JhJzjS8AAI+6N/b+Utwarhz6zWl3+MR725fal+s3UlOlX2eWdsvYYU+Q5bXMjs9eZEGkNQroLkn7j11s2k1Q==", "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "1.7.0", - "cosmiconfig": "8.2.0", - "puppeteer-core": "21.1.1" + "@puppeteer/browsers": "2.8.0", + "chromium-bidi": "2.1.2", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1413902", + "puppeteer-core": "24.4.0", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" }, "engines": { - "node": ">=16.3.0" + "node": ">=18" } }, "node_modules/puppeteer-core": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.1.1.tgz", - "integrity": "sha512-Tlcajcf44zwfa9Sbwv3T8BtaNMJ69wtpHIxwl2NOBTyTK3D1wppQovXTjfw0TDOm3a16eCfQ+5BMi3vRQ4kuAQ==", + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.4.0.tgz", + "integrity": "sha512-eFw66gCnWo0X8Hyf9KxxJtms7a61NJVMiSaWfItsFPzFBsjsWdmcNlBdsA1WVwln6neoHhsG+uTVesKmTREn/g==", + "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "1.7.0", - "chromium-bidi": "0.4.22", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1159816", - "ws": "8.13.0" + "@puppeteer/browsers": "2.8.0", + "chromium-bidi": "2.1.2", + "debug": "^4.4.0", + "devtools-protocol": "0.0.1413902", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.1" }, "engines": { - "node": ">=16.3.0" + "node": ">=18" } }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, "node_modules/range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -913,6 +923,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -921,10 +932,23 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/serve-handler": { "version": "6.1.5", "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", @@ -944,64 +968,74 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "license": "MIT", "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" } }, - "node_modules/socks/node_modules/ip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==" - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, "node_modules/streamx": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", - "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "license": "MIT", "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" } }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -1015,6 +1049,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1022,87 +1057,64 @@ "node": ">=8" } }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", + "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", + "license": "MIT", "dependencies": { - "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" } }, "node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "license": "MIT" }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "license": "MIT", + "optional": true }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -1115,45 +1127,17 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -1174,14 +1158,16 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -1199,6 +1185,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -1207,10 +1194,20 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } + }, + "node_modules/zod": { + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/sdk/typescript/tests/integration-tests/mix-fetch/package.json b/sdk/typescript/tests/integration-tests/mix-fetch/package.json index c1d3ae39df..f9b50ae5a6 100644 --- a/sdk/typescript/tests/integration-tests/mix-fetch/package.json +++ b/sdk/typescript/tests/integration-tests/mix-fetch/package.json @@ -3,6 +3,6 @@ "version": "1.0.0", "dependencies": { "serve-handler": "^6.1.5", - "puppeteer": "^21.1.1" + "puppeteer": "^24.4.0" } } diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index 33977371c8..aece5f7091 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -4,7 +4,7 @@ [package] name = "nym-network-requester" license = "GPL-3.0" -version = "1.1.53" +version = "1.1.54" authors.workspace = true edition.workspace = true rust-version = "1.70" diff --git a/tools/nym-cli/Cargo.toml b/tools/nym-cli/Cargo.toml index b0926a71d8..c255f53fcf 100644 --- a/tools/nym-cli/Cargo.toml +++ b/tools/nym-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nym-cli" -version = "1.1.52" +version = "1.1.53" authors.workspace = true edition = "2021" license.workspace = true diff --git a/tools/nymvisor/Cargo.toml b/tools/nymvisor/Cargo.toml index 5e2eb6412d..54bf2ff786 100644 --- a/tools/nymvisor/Cargo.toml +++ b/tools/nymvisor/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nymvisor" -version = "0.1.17" +version = "0.1.18" authors.workspace = true repository.workspace = true homepage.workspace = true