diff --git a/.github/actions/create-pr/action.yml b/.github/actions/create-pr/action.yml new file mode 100644 index 000000000..b92f47ba0 --- /dev/null +++ b/.github/actions/create-pr/action.yml @@ -0,0 +1,29 @@ +name: Create Pull Request + +description: Create a pull request for the changes that were detected + +inputs: + title: + description: 'Title and commit message for the PR' + required: true + body: + description: 'Body of the PR' + required: true + branch: + description: 'Branch name for the PR' + required: true + +runs: + using: 'composite' + steps: + - name: Create Pull Request + uses: peter-evans/create-pull-request@v6 + with: + base: main + commit-message: ${{ inputs.title }} + committer: GitHub + author: gix-bot + branch: ${{ inputs.branch }} + delete-branch: true + title: ${{ inputs.title }} + body: ${{ inputs.body }} \ No newline at end of file diff --git a/.github/scripts/candid b/.github/scripts/candid index ce35eb356..e1c6aacbc 100755 --- a/.github/scripts/candid +++ b/.github/scripts/candid @@ -2,8 +2,9 @@ function copy_candid() { local canister=$1 + local file=${2:-"$canister".did} - cp src/"$canister"/"$canister".did . + cp src/"$canister"/"$file" . } -copy_candid "$CANISTER" \ No newline at end of file +copy_candid "$CANISTER" "$CUSTOM_DID_FILE" \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e26da0111..93641205b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -125,9 +125,33 @@ jobs: name: ${{ matrix.name }} path: ./${{ matrix.name }} + candid_extension: + runs-on: ubuntu-latest + strategy: + matrix: + include: + - name: satellite_extension.did + target: satellite + custom_did_file: satellite_extension.did + + steps: + - uses: actions/checkout@v4 + + - name: 'Copy ${{ matrix.name }}' + run: bash .github/scripts/candid + env: + CANISTER: ${{ matrix.target }} + CUSTOM_DID_FILE: ${{ matrix.custom_did_file }} + + - name: 'Upload ${{ matrix.name }}' + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.name }} + path: ./${{ matrix.name }} + release: runs-on: ubuntu-latest - needs: ['docker-build', 'metadata', 'candid'] + needs: ['docker-build', 'metadata', 'candid', 'candid_extension'] steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/update-env.yml b/.github/workflows/update-env.yml new file mode 100644 index 000000000..eb12a8894 --- /dev/null +++ b/.github/workflows/update-env.yml @@ -0,0 +1,33 @@ +name: Update Env + +on: + schedule: + - cron: '30 3 * * MON' + workflow_dispatch: + +jobs: + update-subnets: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Prepare + uses: ./.github/actions/prepare + - name: Update + run: npm run build:subnets + + - name: Check for Changes + run: | + if ! git diff --quiet; then + echo "CHANGES_DETECTED=true" >> $GITHUB_ENV + fi + + # This action creates a PR only if there are changes. + - name: Create Pull Request + if: env.CHANGES_DETECTED == 'true' + uses: ./.github/actions/create-pr + with: + branch: bot-cmc-subnets-update + title: 'feat(frontend): Update Subnets' + body: | + Modifications have been made to the list of default subnets known by the CMC canister. diff --git a/.github/workflows/update-rust.yml b/.github/workflows/update-rust.yml new file mode 100644 index 000000000..9c89b2d2b --- /dev/null +++ b/.github/workflows/update-rust.yml @@ -0,0 +1,61 @@ +# A GitHub Actions workflow that regularly checks for new Rust toolchain release +# and creates a PR on new versions. +name: Update Rust + +on: + schedule: + # check for new rust versions weekly + - cron: '30 3 * * FRI' + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + rust-update: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + + # First, check rust GitHub releases for a new version. We assume that the + # latest version's tag name is the version. + - name: Check new rust version + id: update + run: | + current_rust_version=$(cat ./rust-toolchain.toml | sed -n 's/^channel[[:space:]]*=[[:space:]]"\(.*\)"/\1/p') + echo "current rust version '$current_rust_version'" + release_data=$(curl --silent -H 'Accept: application/vnd.github.v3+json' https://api.github.com/repos/rust-lang/rust/releases/latest) + latest_rust_version=$(echo -n "$release_data" | jq -cMr .tag_name) + + # The GitHub API has some hiccups, so we check the value before going further + if [ -z "$latest_rust_version" ] || [ "$latest_rust_version" = "null" ] + then + echo "expected a rust version, got '$latest_rust_version'" + echo "data received from API:" + echo "$release_data" + exit 1 + fi + + echo "latest rust version '$latest_rust_version'" + + if [ "$current_rust_version" != "$latest_rust_version" ] + then + echo rust toolchain needs an update + sed -i -e "s/$current_rust_version/$latest_rust_version/g" ./rust-toolchain.toml + echo "updated=1" >> "$GITHUB_OUTPUT" + else + echo "updated=0" >> "$GITHUB_OUTPUT" + fi + + cat ./rust-toolchain.toml + + # This action creates a PR only if there are changes. + - name: Create Pull Request + if: ${{ steps.update.outputs.updated == '1' }} + uses: ./.github/actions/create-pr + with: + branch: bot-rust-update + title: 'build(backend): Update Rust version' + body: | + A new Rust version available. \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index d858c058d..6f44d89a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -252,7 +252,7 @@ dependencies = [ [[package]] name = "console" -version = "0.0.12" +version = "0.0.13" dependencies = [ "candid", "ciborium", @@ -593,9 +593,9 @@ dependencies = [ [[package]] name = "ic-cdk" -version = "0.15.1" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038ff230bf0fc8630943e3c52e989d248a7c89834ccb65da408fabc5817a475b" +checksum = "dd8ecacd682fa05a985253592963306cb9799622d7b1cce4b1edb89c6ec85be1" dependencies = [ "candid", "ic-cdk-macros", @@ -606,9 +606,9 @@ dependencies = [ [[package]] name = "ic-cdk-macros" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af44fb4ec3a4b18831c9d3303ca8fa2ace846c4022d50cb8df4122635d3782e" +checksum = "0d4d857135deef20cc7ea8f3869a30cd9cfeb1392b3a81043790b2cd82adc3e0" dependencies = [ "candid", "proc-macro2", @@ -620,9 +620,9 @@ dependencies = [ [[package]] name = "ic-cdk-timers" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61fdca8e1d9ffb65ae68019b342c182009de9dc206fd849db0b0e90ee19f6fa4" +checksum = "0c7c528bbb3d4d934b43a364855995d318649217c7510f40f92ad52eba3ff7be" dependencies = [ "futures", "ic-cdk", @@ -680,9 +680,9 @@ dependencies = [ [[package]] name = "ic-ledger-types" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fd70c701d11208d5d853c1a908bb143848d89c1951f401413cef9c062642112" +checksum = "1a144b5b4c9e4b164b338440cfbdcf9f30ff45e3d48a3be62d2424996dc93d6f" dependencies = [ "candid", "crc32fast", @@ -826,7 +826,7 @@ checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "junobuild-collections" -version = "0.0.4" +version = "0.0.7" dependencies = [ "candid", "ic-cdk", @@ -852,7 +852,7 @@ dependencies = [ [[package]] name = "junobuild-satellite" -version = "0.0.20-patch.1" +version = "0.0.20-patch.3" dependencies = [ "candid", "ciborium", @@ -864,7 +864,7 @@ dependencies = [ "junobuild-collections", "junobuild-shared", "junobuild-storage", - "junobuild-utils 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "junobuild-utils 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand", "regex", "serde", @@ -875,7 +875,7 @@ dependencies = [ [[package]] name = "junobuild-shared" -version = "0.0.18" +version = "0.0.20" dependencies = [ "candid", "ciborium", @@ -892,7 +892,7 @@ dependencies = [ [[package]] name = "junobuild-storage" -version = "0.0.7-patch.1" +version = "0.0.10" dependencies = [ "base64 0.13.1", "candid", @@ -918,7 +918,7 @@ dependencies = [ [[package]] name = "junobuild-utils" -version = "0.0.3" +version = "0.0.4" dependencies = [ "candid", "serde", @@ -927,9 +927,9 @@ dependencies = [ [[package]] name = "junobuild-utils" -version = "0.0.3" +version = "0.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c090377970d0b3c7970a51723f01ad8a4d26c425b828684e6184047d0e27de5" +checksum = "526b6b74dc3a27a7c3c7da96abc1090b618efb2887d4d2c7893814a9790f19ab" dependencies = [ "candid", "serde", @@ -1005,7 +1005,7 @@ checksum = "d07cbe42e2a8dd41df582fb8e00fc24d920b5561cc301fcb6d14e2e0434b500f" [[package]] name = "mission_control" -version = "0.0.12" +version = "0.0.13" dependencies = [ "candid", "futures", @@ -1065,7 +1065,7 @@ dependencies = [ [[package]] name = "observatory" -version = "0.0.6" +version = "0.0.7" dependencies = [ "candid", "ic-cdk", diff --git a/Cargo.toml b/Cargo.toml index 66210441f..36e45c69d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,11 +21,11 @@ homepage = "https://juno.build" [workspace.dependencies] candid = "0.10.2" -ic-cdk = "0.15.1" -ic-cdk-macros = "0.15.0" -ic-ledger-types = "0.12.0" +ic-cdk = "0.16.0" +ic-cdk-macros = "0.16.0" +ic-ledger-types = "0.13.0" icrc-ledger-types = "0.1.6" -ic-cdk-timers = "0.9.0" +ic-cdk-timers = "0.10.0" ic-stable-structures = "0.6.4" serde = "1.0.190" serde_cbor = "0.11.2" diff --git a/package-lock.json b/package-lock.json index 795eefb01..1b4ad1081 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,17 +9,18 @@ "version": "0.0.34", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { - "@dfinity/agent": "^1.4.0", - "@dfinity/auth-client": "^1.4.0", - "@dfinity/cmc": "^3.1.0", - "@dfinity/identity": "^1.4.0", - "@dfinity/ledger-icp": "^2.4.0", - "@dfinity/ledger-icrc": "^2.4.0", - "@dfinity/principal": "^1.4.0", - "@dfinity/utils": "^2.4.0", - "@junobuild/admin": "^0.0.55", - "@junobuild/core-peer": "^0.0.25", - "@junobuild/utils": "^0.0.24", + "@dfinity/agent": "^2.0.0", + "@dfinity/auth-client": "^2.0.0", + "@dfinity/candid": "^2.0.0", + "@dfinity/cmc": "^3.2.2-next-2024-10-17", + "@dfinity/identity": "^2.0.0", + "@dfinity/ledger-icp": "^2.6.1", + "@dfinity/ledger-icrc": "^2.6.1", + "@dfinity/principal": "^2.0.0", + "@dfinity/utils": "^2.5.2", + "@junobuild/admin": "^0.0.56", + "@junobuild/core-peer": "^0.0.27", + "@junobuild/utils": "^0.0.25", "buffer": "^6.0.3", "date-fns": "^2.30.0", "idb-keyval": "^6.2.1", @@ -29,15 +30,15 @@ "svelte-confetti": "^2.0.1" }, "devDependencies": { - "@dfinity/ic-management": "^5.1.0", - "@dfinity/identity-secp256k1": "^1.4.0", + "@dfinity/ic-management": "^5.2.2", + "@dfinity/identity-secp256k1": "^2.0.0", "@esbuild-plugins/node-modules-polyfill": "^0.2.2", "@hadronous/pic": "^0.8.1", "@junobuild/cli-tools": "^0.0.14", "@junobuild/config": "^0.0.14", - "@junobuild/config-loader": "^0.0.5", - "@junobuild/console": "^0.0.8", - "@junobuild/storage": "^0.0.5", + "@junobuild/config-loader": "^0.0.6", + "@junobuild/console": "^0.0.9", + "@junobuild/storage": "^0.0.6", "@ltd/j-toml": "^1.38.0", "@rollup/plugin-inject": "^5.0.5", "@sveltejs/adapter-static": "^3.0.2", @@ -104,13 +105,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/highlight": "^7.25.7", "picocolors": "^1.0.0" }, "engines": { @@ -118,9 +119,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true, "license": "MIT", "engines": { @@ -128,22 +129,22 @@ } }, "node_modules/@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.8", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.8", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -169,44 +170,44 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.25.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -225,20 +226,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", - "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", + "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/traverse": "^7.25.7", "semver": "^6.3.1" }, "engines": { @@ -258,86 +257,45 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", - "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", + "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -347,22 +305,22 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", + "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", "dev": true, "license": "MIT", "engines": { @@ -370,15 +328,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", + "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -388,50 +346,37 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", + "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "dev": true, "license": "MIT", "engines": { @@ -439,9 +384,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "dev": true, "license": "MIT", "engines": { @@ -449,9 +394,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "dev": true, "license": "MIT", "engines": { @@ -459,27 +404,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -574,11 +519,14 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.8" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -587,13 +535,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", + "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -603,13 +551,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", + "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -619,15 +567,15 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", - "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", + "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -637,16 +585,17 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz", - "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz", + "integrity": "sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-typescript": "^7.24.7" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-syntax-typescript": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -656,17 +605,17 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", - "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz", + "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-typescript": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -687,35 +636,32 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -734,14 +680,14 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -749,9 +695,9 @@ } }, "node_modules/@dfinity/agent": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-1.4.0.tgz", - "integrity": "sha512-/zgGajZpxtbu+kLXtFx2e9V2+HbMUjrtGWx9ZEwtVwhVxKgVi/2kGQpFRPEDFJ461V7wdTwCig4OkMxVU4shTw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-2.0.0.tgz", + "integrity": "sha512-Cc2VDAMfxCNIQoaEeKPf0rbS/Y21HAF+eEFj6GfijNnUxS42i4zwUF2PUvEJZqaB2FQwA9SC7MDyuwL8BR2oJA==", "license": "Apache-2.0", "dependencies": { "@noble/curves": "^1.4.0", @@ -762,63 +708,62 @@ "simple-cbor": "^0.4.1" }, "peerDependencies": { - "@dfinity/candid": "^1.4.0", - "@dfinity/principal": "^1.4.0" + "@dfinity/candid": "^2.0.0", + "@dfinity/principal": "^2.0.0" } }, "node_modules/@dfinity/auth-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/auth-client/-/auth-client-1.4.0.tgz", - "integrity": "sha512-9ImeOAw61SQvHJ+w4RHIuKKUL2xAQDLoce+JhmH3DbJuVvNbZIM5xMW8gHTZVlXaMw3Vhip+a1DPJIGy95r9pA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/auth-client/-/auth-client-2.0.0.tgz", + "integrity": "sha512-mF1Dqc2k94FJhwKum/K6NPJZ5txuTTa9HP8OgOwaA/Zc8rKfzRtUz+ORTjLC4i/4bPyp5zGhrp/8mCihwvNBTg==", "license": "Apache-2.0", "dependencies": { "idb": "^7.0.2" }, "peerDependencies": { - "@dfinity/agent": "^1.4.0", - "@dfinity/identity": "^1.4.0", - "@dfinity/principal": "^1.4.0" + "@dfinity/agent": "^2.0.0", + "@dfinity/identity": "^2.0.0", + "@dfinity/principal": "^2.0.0" } }, "node_modules/@dfinity/candid": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-1.4.0.tgz", - "integrity": "sha512-PsTJVn63ZM4A/6Xs5coI0zMFevSwJ8hcyh38LdH/92n6wi9UOTis1yc4qL5MZvvRCUAD0c3rVjELL+49E9sPyA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-2.0.0.tgz", + "integrity": "sha512-poxIEnzErcKBM5yroabQ3VqQpiYZnqYZdLJWFuIQZzioGdP1mlnVLHx7IbgHN4HBlqVXYPFmEzMU02FnyYUA1Q==", "license": "Apache-2.0", - "peer": true, "peerDependencies": { - "@dfinity/principal": "^1.4.0" + "@dfinity/principal": "^2.0.0" } }, "node_modules/@dfinity/cmc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@dfinity/cmc/-/cmc-3.1.0.tgz", - "integrity": "sha512-WFnUihWExjIRi48SpxWKB0TAJ5PnICVl+/fIBdb1/31k6V62ni1HzkWFG/zLJapuXcsgzVR7ciC0QShU7U0Pmw==", + "version": "3.2.2-next-2024-10-17", + "resolved": "https://registry.npmjs.org/@dfinity/cmc/-/cmc-3.2.2-next-2024-10-17.tgz", + "integrity": "sha512-+IyUjcIPaRzeQbJGEzJwrmfULBAENp6UKgjmysYYGcJXWpK3C3/hYe+jMSxHatGVy2pbG05a2WMUuMVDgnLpkw==", "license": "Apache-2.0", "peerDependencies": { - "@dfinity/agent": "^1.4.0", - "@dfinity/candid": "^1.4.0", - "@dfinity/principal": "^1.4.0", - "@dfinity/utils": "^2.4.0" + "@dfinity/agent": "*", + "@dfinity/candid": "*", + "@dfinity/principal": "*", + "@dfinity/utils": "*" } }, "node_modules/@dfinity/ic-management": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@dfinity/ic-management/-/ic-management-5.1.0.tgz", - "integrity": "sha512-XrDWAxPWliKyOPJXltt/z2qaOoMD6rIsAjUmQrGeFJXbk3H7DEnbNAZXWT1FlUAb0MRP1zp5u8uCi4Xa9RZnAg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@dfinity/ic-management/-/ic-management-5.2.2.tgz", + "integrity": "sha512-wLFWwK/26fv7sTqUOlqKFZEJVxdG5OHhiGUutfrSFoaOqHqQYD2Tb6PXWshsM3/B+zSPEoJxkzMG9cR6Ec8pHw==", "dev": true, "license": "Apache-2.0", "peerDependencies": { - "@dfinity/agent": "^1.4.0", - "@dfinity/candid": "^1.4.0", - "@dfinity/principal": "^1.4.0", - "@dfinity/utils": "^2.4.0" + "@dfinity/agent": "^2.0.0", + "@dfinity/candid": "^2.0.0", + "@dfinity/principal": "^2.0.0", + "@dfinity/utils": "^2.5.2" } }, "node_modules/@dfinity/identity": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/identity/-/identity-1.4.0.tgz", - "integrity": "sha512-4WmMsQSuzfWXmm4s+0FYGbFiQcMGE88Ztg6yFq7aTMtRWuAjhz66Dy1+jRCrXxsoxvDdUvPzsyjkOSpr1AuUYQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/identity/-/identity-2.0.0.tgz", + "integrity": "sha512-6NBdqG/Z2H6zEwBlpwWcWKsffgisIVzy2AMY7fXu5Jq31niFAoxv//oRsejeW45ChahVJlhvP/UYrNMJur8GpQ==", "license": "Apache-2.0", "dependencies": { "@noble/curves": "^1.2.0", @@ -826,19 +771,19 @@ "borc": "^2.1.1" }, "peerDependencies": { - "@dfinity/agent": "^1.4.0", - "@dfinity/principal": "^1.4.0", + "@dfinity/agent": "^2.0.0", + "@dfinity/principal": "^2.0.0", "@peculiar/webcrypto": "^1.4.0" } }, "node_modules/@dfinity/identity-secp256k1": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/identity-secp256k1/-/identity-secp256k1-1.4.0.tgz", - "integrity": "sha512-cNJYPp3KaqeAnlw0R70a+f1tKOjwTvPCAvImQ1Nq3KuSDs9/5al0qUBGUx5zalxSIihGSr3/T9//X5L8pQlNMw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/identity-secp256k1/-/identity-secp256k1-2.0.0.tgz", + "integrity": "sha512-FyvevYIjaR4UBXwTiOqeHJVF9KhVUOiD+Oh2opw8MuCF6cpZVaC6lv/JtJvFMhCsgP8wS+HcrmawieEJMNgq+Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@dfinity/agent": "^1.4.0", + "@dfinity/agent": "^2.0.0", "@noble/curves": "^1.4.0", "@noble/hashes": "^1.3.1", "asn1js": "^3.0.5", @@ -848,47 +793,47 @@ } }, "node_modules/@dfinity/ledger-icp": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/ledger-icp/-/ledger-icp-2.4.0.tgz", - "integrity": "sha512-uWw9gsPwvrmviI6mp0wXUX59D3ytiwOsEgoXAWFOwybO9qVbwLb/ucZYcNYso7GpI91hXawT/jd2A/fcGTXebQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@dfinity/ledger-icp/-/ledger-icp-2.6.1.tgz", + "integrity": "sha512-GKfG/53C9IXkiPNbsWa9/r68wTCnW68GSm795SRDNa0YwLe0Y+FVEYDl6yz2tRFHwDWo+MTHhY07FfS4P4kJFw==", "license": "Apache-2.0", "peerDependencies": { - "@dfinity/agent": "^1.4.0", - "@dfinity/candid": "^1.4.0", - "@dfinity/principal": "^1.4.0", - "@dfinity/utils": "^2.4.0" + "@dfinity/agent": "^2.0.0", + "@dfinity/candid": "^2.0.0", + "@dfinity/principal": "^2.0.0", + "@dfinity/utils": "^2.5.2" } }, "node_modules/@dfinity/ledger-icrc": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/ledger-icrc/-/ledger-icrc-2.4.0.tgz", - "integrity": "sha512-7NMFU3uoQ0QOarIzGEjmXkVEJZYSp9L4dj5ZR+TM5S0Dvd1TMmMb8GOW8TCN9WGDQUfuhd2Pe3l6dRykRq23gQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@dfinity/ledger-icrc/-/ledger-icrc-2.6.1.tgz", + "integrity": "sha512-fsCC01JHDIA+2l7CRll44yB5/OF2qj3Gz7xE10SW7V80elYULfa98w9ks12dqxGh62+62btxujU7ylluTgugyg==", "license": "Apache-2.0", "peerDependencies": { - "@dfinity/agent": "^1.4.0", - "@dfinity/candid": "^1.4.0", - "@dfinity/principal": "^1.4.0", - "@dfinity/utils": "^2.4.0" + "@dfinity/agent": "^2.0.0", + "@dfinity/candid": "^2.0.0", + "@dfinity/principal": "^2.0.0", + "@dfinity/utils": "^2.5.2" } }, "node_modules/@dfinity/principal": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-1.4.0.tgz", - "integrity": "sha512-SuTBVlc71ub89ji0WN5/T100zUG2uIMn5x4+We4vS4nJ0R3/Xt89XJsHepjd5SQTSQPOvP7eQ+S8cQKWRz/RkA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-2.0.0.tgz", + "integrity": "sha512-cqJ5kOrPpxco+wvJC4TFBhdr4lkw9mnwKGAYunesyqdzSYi8lnFB4dShNqlHFWdwoxNAw6OZkt/B+0nLa+7Yqw==", "license": "Apache-2.0", "dependencies": { "@noble/hashes": "^1.3.1" } }, "node_modules/@dfinity/utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/utils/-/utils-2.4.0.tgz", - "integrity": "sha512-1Bc+IcZTPXtPvDlDQElTjLRdHcpNOnu1vQyhQpFSXdwsnaXpdJzEhswq4GyzNjxRzaFnR0yrGCmbMjkb6UIe2A==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@dfinity/utils/-/utils-2.5.2.tgz", + "integrity": "sha512-QSW7t8kcLj0s/gL4NbYqr+Pqr3e2QhFn2JriwcghuflhwrYet1y23ANyM4EwSUeDAUR/OQXR86e4MfWkGMttAg==", "license": "Apache-2.0", "peerDependencies": { - "@dfinity/agent": "^1.4.0", - "@dfinity/candid": "^1.4.0", - "@dfinity/principal": "^1.4.0" + "@dfinity/agent": "^2.0.0", + "@dfinity/candid": "^2.0.0", + "@dfinity/principal": "^2.0.0" } }, "node_modules/@esbuild-plugins/node-modules-polyfill": { @@ -1357,14 +1302,15 @@ "integrity": "sha512-f7udej5rsmiqQ4Yq8P8+mOqOQe5boVk8UhYAyZcRHvcxChC9x2jKeEYjdM3+w2vmbmCp9a/Ze/iHxFbIK8Jvrw==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "bip39": "^3.1.0" }, "peerDependencies": { - "@dfinity/agent": "^1.0.1", - "@dfinity/candid": "^1.0.1", - "@dfinity/identity": "^1.0.1", - "@dfinity/principal": "^1.0.1" + "@dfinity/agent": "*", + "@dfinity/candid": "*", + "@dfinity/identity": "*", + "@dfinity/principal": "*" } }, "node_modules/@humanwhocodes/config-array": { @@ -1460,14 +1406,14 @@ } }, "node_modules/@junobuild/admin": { - "version": "0.0.55", - "resolved": "https://registry.npmjs.org/@junobuild/admin/-/admin-0.0.55.tgz", - "integrity": "sha512-gRC0q8/TkNZE2oyRzemBMQHnnOlfG1odArM4rxGQcQgzewi76c0lG5eHiQjxm1nzWxvrQE9gQ8qVsRNY2nCBDg==", + "version": "0.0.56", + "resolved": "https://registry.npmjs.org/@junobuild/admin/-/admin-0.0.56.tgz", + "integrity": "sha512-G97a29CdH5MuELa/K4yg1KOGpGrO3HAfeYeL5V0eI7RuRqzLzqhgUXO3ZfLBJ7n7ynfqa++GU3d94DQAcjUGYQ==", "license": "MIT", "peerDependencies": { - "@dfinity/agent": "^1.4.0", - "@dfinity/identity": "^1.4.0", - "@dfinity/principal": "^1.4.0", + "@dfinity/agent": "^2.0.0", + "@dfinity/identity": "^2.0.0", + "@dfinity/principal": "^2.0.0", "@junobuild/config": "*", "@junobuild/utils": "*", "semver": "7.*" @@ -1523,15 +1469,15 @@ "license": "MIT" }, "node_modules/@junobuild/config-loader": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@junobuild/config-loader/-/config-loader-0.0.5.tgz", - "integrity": "sha512-983Kzl9KTaGD//bWml+RdyeG9kHQgXHyrtEg3Ps9sod0f93OYlZ8oFe8e7lrHuZcl6jhSRUfdoxukAyc3BFWrA==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@junobuild/config-loader/-/config-loader-0.0.6.tgz", + "integrity": "sha512-3EDk11NNCDOJD/odguR8pVvtybc0WlrZa0Z8YSGBVtd5WLcu3ZjKeBSPkjouXYEFLSTn7ykqkP772Etbwl+/DA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.24.6", - "@babel/plugin-transform-modules-commonjs": "^7.24.6", - "@babel/preset-typescript": "^7.24.6" + "@babel/core": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/preset-typescript": "^7.24.7" }, "peerDependencies": { "@junobuild/config": "*", @@ -1539,15 +1485,15 @@ } }, "node_modules/@junobuild/console": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@junobuild/console/-/console-0.0.8.tgz", - "integrity": "sha512-WxCS56E/YK+ddVPRY+0u0m5Sc0e1uNwRpigEfI2LZeRpL9W/RuBt5V38xQzfYKf7zG67L8bDNAYZctuRYb8bmg==", + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@junobuild/console/-/console-0.0.9.tgz", + "integrity": "sha512-WShN7bZXQs9QZDrejc2x9eHVkVfVJdtPo2e0X/i3vd6Bk0BrNVfIXPq63MBd2+R5OI9aoEVYePFnoysnbZyWLA==", "dev": true, "license": "MIT", "peerDependencies": { - "@dfinity/agent": "^1.4.0", - "@dfinity/identity": "^1.4.0", - "@dfinity/principal": "^1.4.0", + "@dfinity/agent": "^2.0.0", + "@dfinity/identity": "^2.0.0", + "@dfinity/principal": "^2.0.0", "@junobuild/config": "*", "@junobuild/storage": "*", "@junobuild/utils": "*", @@ -1555,39 +1501,39 @@ } }, "node_modules/@junobuild/core-peer": { - "version": "0.0.25", - "resolved": "https://registry.npmjs.org/@junobuild/core-peer/-/core-peer-0.0.25.tgz", - "integrity": "sha512-j9v0cIWCI4G7WNH5xmo8xJMGfKz0nT0zkSyY4HqEAcSA0xgACRXwdf/LyZcXCUXwgjessln80Gwjzh7oozcPRg==", + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@junobuild/core-peer/-/core-peer-0.0.27.tgz", + "integrity": "sha512-dgY4crYQ9mQKlERtULdrOCnFIBFfRlX1vvUBtgigT58gdphIQC88HKBfPeuzPjSGIf5uxOHgzDZ/wMAeb+2eAQ==", "license": "MIT", "dependencies": { "@junobuild/storage": "*", "@junobuild/utils": "*" }, "peerDependencies": { - "@dfinity/agent": "^1.4.0", - "@dfinity/auth-client": "^1.4.0", - "@dfinity/identity": "^1.4.0", - "@dfinity/principal": "^1.4.0" + "@dfinity/agent": "^2.0.0", + "@dfinity/auth-client": "^2.0.0", + "@dfinity/identity": "^2.0.0", + "@dfinity/principal": "^2.0.0" } }, "node_modules/@junobuild/storage": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@junobuild/storage/-/storage-0.0.5.tgz", - "integrity": "sha512-vEUsnO6mAUjXKqpz25Cvg3k6atEGL+PgFpl9AnH5FEQePj6owUQcLrg5mVDdA0PM7u8uG9Z0LzospnjUAHE1bQ==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@junobuild/storage/-/storage-0.0.6.tgz", + "integrity": "sha512-X5q92hOLodB/ADA2hvzF7gCmJ+x/BWh1dwySE+DfHJnEXuWRyEBRn8YM6pUTROSwPe9axAPtZ3zTzw61wo2T/w==", "license": "MIT", "peerDependencies": { - "@dfinity/agent": "^1.4.0", - "@dfinity/identity": "^1.4.0", - "@dfinity/principal": "^1.4.0" + "@dfinity/agent": "^2.0.0", + "@dfinity/identity": "^2.0.0", + "@dfinity/principal": "^2.0.0" } }, "node_modules/@junobuild/utils": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/@junobuild/utils/-/utils-0.0.24.tgz", - "integrity": "sha512-UF95ROr8Df8FpNYf3eqF/FUoIvSXsLfHk//oMiRmii6Bp0A6HgSVmlZOeBqjcdy3P+qQHbdktMk4Lg9tIDYygQ==", + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@junobuild/utils/-/utils-0.0.25.tgz", + "integrity": "sha512-hKvSeyREVy7YoJoXWSs4Q1xp8I4tlZ9c9KVVPNLdJ/vl8ad8/EEfcvuobNdNZ860h9DqG5LXhqam+Mf/blU33w==", "license": "MIT", "peerDependencies": { - "@dfinity/principal": "^1.4.0" + "@dfinity/principal": "^2.0.0" } }, "node_modules/@ltd/j-toml": { @@ -1597,22 +1543,27 @@ "dev": true }, "node_modules/@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", + "license": "MIT", "dependencies": { - "@noble/hashes": "1.4.0" + "@noble/hashes": "1.5.0" + }, + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", + "license": "MIT", "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -1654,9 +1605,10 @@ } }, "node_modules/@peculiar/asn1-schema": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz", - "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.13.tgz", + "integrity": "sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==", + "license": "MIT", "peer": true, "dependencies": { "asn1js": "^3.0.5", @@ -1668,6 +1620,7 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "license": "MIT", "peer": true, "dependencies": { "tslib": "^2.0.0" @@ -1677,16 +1630,17 @@ } }, "node_modules/@peculiar/webcrypto": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.5.tgz", - "integrity": "sha512-oDk93QCDGdxFRM8382Zdminzs44dg3M2+E5Np+JWkpqLDyJC9DviMh8F8mEJkYuUcUOGA5jHO5AJJ10MFWdbZw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz", + "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==", + "license": "MIT", "peer": true, "dependencies": { "@peculiar/asn1-schema": "^2.3.8", "@peculiar/json-schema": "^1.1.12", "pvtsutils": "^1.3.5", "tslib": "^2.6.2", - "webcrypto-core": "^1.7.8" + "webcrypto-core": "^1.8.0" }, "engines": { "node": ">=10.12.0" @@ -1932,6 +1886,13 @@ } } }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -2582,6 +2543,7 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.5.tgz", "integrity": "sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==", + "license": "BSD-3-Clause", "dependencies": { "pvtsutils": "^1.3.2", "pvutils": "^1.1.3", @@ -2666,7 +2628,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/base64-arraybuffer": { "version": "0.2.0", @@ -2699,6 +2662,7 @@ "version": "9.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "license": "MIT", "engines": { "node": "*" } @@ -2717,6 +2681,7 @@ "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", "dev": true, + "license": "ISC", "dependencies": { "@noble/hashes": "^1.2.0" } @@ -2725,12 +2690,14 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/borc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/borc/-/borc-2.1.2.tgz", "integrity": "sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w==", + "license": "MIT", "dependencies": { "bignumber.js": "^9.0.0", "buffer": "^5.5.0", @@ -2762,6 +2729,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -2793,12 +2761,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, "funding": [ { @@ -2814,11 +2783,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -2832,6 +2802,7 @@ "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", "dev": true, + "license": "MIT", "dependencies": { "base-x": "^4.0.0" } @@ -2841,6 +2812,7 @@ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", "dev": true, + "license": "MIT", "dependencies": { "@noble/hashes": "^1.2.0", "bs58": "^5.0.0" @@ -2899,9 +2871,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001600", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", - "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", "dev": true, "funding": [ { @@ -2916,7 +2888,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chai": { "version": "4.4.1", @@ -3010,6 +2983,7 @@ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -3098,7 +3072,8 @@ "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", @@ -3182,6 +3157,7 @@ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -3402,7 +3378,8 @@ "node_modules/delimit-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/delimit-stream/-/delimit-stream-0.1.0.tgz", - "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==" + "integrity": "sha512-a02fiQ7poS5CnjiJBAsjGLPp5EwVoGHNeu9sziBd9huppRfsAFIpv5zNLv0V1gbop53ilngAf5Kf331AwcoRBQ==", + "license": "BSD-2-Clause" }, "node_modules/dequal": { "version": "2.0.3", @@ -3492,10 +3469,11 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.717", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.717.tgz", - "integrity": "sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==", - "dev": true + "version": "1.5.41", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz", + "integrity": "sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==", + "dev": true, + "license": "ISC" }, "node_modules/elegant-spinner": { "version": "1.0.1", @@ -3508,10 +3486,11 @@ } }, "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -3582,10 +3561,11 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3940,15 +3920,16 @@ } }, "node_modules/file-type": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-19.0.0.tgz", - "integrity": "sha512-s7cxa7/leUWLiXO78DVVfBVse+milos9FitauDLG1pI7lNaJ2+5lzPnr2N24ym+84HVwJL6hVuGfgVE+ALvU8Q==", + "version": "19.6.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-19.6.0.tgz", + "integrity": "sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==", "dev": true, "license": "MIT", "dependencies": { - "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0", - "token-types": "^5.0.1" + "get-stream": "^9.0.1", + "strtok3": "^9.0.1", + "token-types": "^6.0.0", + "uint8array-extras": "^1.3.0" }, "engines": { "node": ">=18" @@ -3957,6 +3938,36 @@ "url": "https://github.com/sindresorhus/file-type?sponsor=1" } }, + "node_modules/file-type/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-type/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4199,6 +4210,7 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -4213,6 +4225,7 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -4223,6 +4236,7 @@ "resolved": "https://registry.npmjs.org/hdkey/-/hdkey-2.1.0.tgz", "integrity": "sha512-i9Wzi0Dy49bNS4tXXeGeu0vIcn86xXdPQUpEYg+SO1YiO8HtomjmmRMaRyqL0r59QfcD4PfVbSF3qmsWFwAemA==", "dev": true, + "license": "MIT", "dependencies": { "bs58check": "^2.1.2", "ripemd160": "^2.0.2", @@ -4231,10 +4245,11 @@ } }, "node_modules/hdkey/node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } @@ -4244,6 +4259,7 @@ "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dev": true, + "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -4253,6 +4269,7 @@ "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", "dev": true, + "license": "MIT", "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -4264,6 +4281,7 @@ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, + "license": "MIT", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -4283,7 +4301,8 @@ "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" }, "node_modules/idb-keyval": { "version": "6.2.1", @@ -4508,6 +4527,7 @@ "version": "0.4.7", "resolved": "https://registry.npmjs.org/iso-url/-/iso-url-0.4.7.tgz", "integrity": "sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==", + "license": "MIT", "engines": { "node": ">=10" } @@ -4532,16 +4552,16 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-schema-traverse": { @@ -4567,6 +4587,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/json-text-sequence/-/json-text-sequence-0.1.1.tgz", "integrity": "sha512-L3mEegEWHRekSHjc7+sc8eJhba9Clq1PZ8kMkzf8OxElhXc8O4TS5MwcVlj9aEbm5dr81N90WHC5nAz3UO971w==", + "license": "MIT", "dependencies": { "delimit-stream": "0.1.0" } @@ -5063,6 +5084,7 @@ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -5166,13 +5188,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/minimatch": { "version": "3.1.2", @@ -5270,16 +5294,18 @@ "dev": true }, "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "dev": true + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "dev": true, + "license": "MIT" }, "node_modules/node-gyp-build": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", - "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", "dev": true, + "license": "MIT", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -5287,10 +5313,11 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -5507,9 +5534,9 @@ } }, "node_modules/peek-readable": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.3.1.tgz", + "integrity": "sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==", "dev": true, "license": "MIT", "engines": { @@ -5545,9 +5572,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, @@ -5831,6 +5858,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.5.tgz", "integrity": "sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==", + "license": "MIT", "dependencies": { "tslib": "^2.6.1" } @@ -5839,6 +5867,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz", "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==", + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -5874,6 +5903,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5883,23 +5913,6 @@ "node": ">= 6" } }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -6010,6 +6023,7 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -6170,7 +6184,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/sander": { "version": "0.5.1", @@ -6218,18 +6233,19 @@ } }, "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz", + "integrity": "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", + "elliptic": "^6.5.7", + "node-addon-api": "^5.0.0", "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" } }, "node_modules/semver": { @@ -6255,6 +6271,7 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -6307,7 +6324,8 @@ "node_modules/simple-cbor": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/simple-cbor/-/simple-cbor-0.4.1.tgz", - "integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w==" + "integrity": "sha512-rijcxtwx2b4Bje3sqeIqw5EeW7UlOIC4YfOdwqIKacpvRQ/D78bWg/4/0m5e0U91oKvlGh7LlJuZCu07ISCC7w==", + "license": "ISC" }, "node_modules/sirv": { "version": "2.0.4", @@ -6398,6 +6416,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -6504,17 +6523,17 @@ } }, "node_modules/strtok3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-9.0.1.tgz", + "integrity": "sha512-ERPW+XkvX9W2A+ov07iy+ZFJpVdik04GhDA4eVogiG9hpC97Kem2iucyzhFxbFRvQ5o2UckFtKZdp1hkGvnrEw==", "dev": true, "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.0.0" + "peek-readable": "^5.3.1" }, "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "type": "github", @@ -6840,9 +6859,9 @@ } }, "node_modules/token-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.0.0.tgz", + "integrity": "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==", "dev": true, "license": "MIT", "dependencies": { @@ -6879,9 +6898,9 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", "license": "0BSD" }, "node_modules/type-check": { @@ -6938,9 +6957,9 @@ "license": "MIT" }, "node_modules/uint8array-extras": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.1.0.tgz", - "integrity": "sha512-CVaBSyOmGoFHu+zOVPbetXEXykOd8KHVBHLlqvmaMWpwcq3rewj18xVNbU5uzf48hclnNQhfNaNany2cMHFK/g==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz", + "integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==", "dev": true, "license": "MIT", "engines": { @@ -6951,9 +6970,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -6969,9 +6988,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -7154,16 +7174,17 @@ } }, "node_modules/webcrypto-core": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.8.tgz", - "integrity": "sha512-eBR98r9nQXTqXt/yDRtInszPMjTaSAMJAFDg2AHsgrnczawT1asx9YNBX6k5p+MekbPF4+s/UJJrr88zsTqkSg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.8.1.tgz", + "integrity": "sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==", + "license": "MIT", "peer": true, "dependencies": { - "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/asn1-schema": "^2.3.13", "@peculiar/json-schema": "^1.1.12", - "asn1js": "^3.0.1", + "asn1js": "^3.0.5", "pvtsutils": "^1.3.5", - "tslib": "^2.6.2" + "tslib": "^2.7.0" } }, "node_modules/when-exit": { @@ -7317,37 +7338,37 @@ } }, "@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", "dev": true, "requires": { - "@babel/highlight": "^7.24.7", + "@babel/highlight": "^7.25.7", "picocolors": "^1.0.0" } }, "@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true }, "@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.8", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.8", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -7364,35 +7385,35 @@ } }, "@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", "dev": true, "requires": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.25.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" } }, "@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz", + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==", "dev": true, "requires": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.7" } }, "@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", "dev": true, "requires": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -7406,19 +7427,17 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", - "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz", + "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/helper-replace-supers": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/traverse": "^7.25.7", "semver": "^6.3.1" }, "dependencies": { @@ -7430,157 +7449,119 @@ } } }, - "@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "requires": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, "@babel/helper-member-expression-to-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", - "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz", + "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==", "dev": true, "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", "dev": true, "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" } }, "@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz", + "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==", "dev": true, "requires": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.7" } }, "@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", "dev": true }, "@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz", + "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.25.7", + "@babel/helper-optimise-call-expression": "^7.25.7", + "@babel/traverse": "^7.25.7" } }, "@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", "dev": true, "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", - "dev": true, - "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz", + "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==", "dev": true, "requires": { - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", "dev": true }, "@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", "dev": true, "requires": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -7651,63 +7632,67 @@ } }, "@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "dev": true + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", + "dev": true, + "requires": { + "@babel/types": "^7.25.8" + } }, "@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", + "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", + "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", - "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz", + "integrity": "sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7" } }, "@babel/plugin-transform-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz", - "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz", + "integrity": "sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-typescript": "^7.24.7" + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-create-class-features-plugin": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7", + "@babel/plugin-syntax-typescript": "^7.25.7" } }, "@babel/preset-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", - "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz", + "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-typescript": "^7.25.7" } }, "@babel/runtime": { @@ -7719,30 +7704,27 @@ } }, "@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", "dev": true, "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" } }, "@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -7756,20 +7738,20 @@ } }, "@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", "to-fast-properties": "^2.0.0" } }, "@dfinity/agent": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-1.4.0.tgz", - "integrity": "sha512-/zgGajZpxtbu+kLXtFx2e9V2+HbMUjrtGWx9ZEwtVwhVxKgVi/2kGQpFRPEDFJ461V7wdTwCig4OkMxVU4shTw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/agent/-/agent-2.0.0.tgz", + "integrity": "sha512-Cc2VDAMfxCNIQoaEeKPf0rbS/Y21HAF+eEFj6GfijNnUxS42i4zwUF2PUvEJZqaB2FQwA9SC7MDyuwL8BR2oJA==", "requires": { "@noble/curves": "^1.4.0", "@noble/hashes": "^1.3.1", @@ -7780,37 +7762,36 @@ } }, "@dfinity/auth-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/auth-client/-/auth-client-1.4.0.tgz", - "integrity": "sha512-9ImeOAw61SQvHJ+w4RHIuKKUL2xAQDLoce+JhmH3DbJuVvNbZIM5xMW8gHTZVlXaMw3Vhip+a1DPJIGy95r9pA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/auth-client/-/auth-client-2.0.0.tgz", + "integrity": "sha512-mF1Dqc2k94FJhwKum/K6NPJZ5txuTTa9HP8OgOwaA/Zc8rKfzRtUz+ORTjLC4i/4bPyp5zGhrp/8mCihwvNBTg==", "requires": { "idb": "^7.0.2" } }, "@dfinity/candid": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-1.4.0.tgz", - "integrity": "sha512-PsTJVn63ZM4A/6Xs5coI0zMFevSwJ8hcyh38LdH/92n6wi9UOTis1yc4qL5MZvvRCUAD0c3rVjELL+49E9sPyA==", - "peer": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/candid/-/candid-2.0.0.tgz", + "integrity": "sha512-poxIEnzErcKBM5yroabQ3VqQpiYZnqYZdLJWFuIQZzioGdP1mlnVLHx7IbgHN4HBlqVXYPFmEzMU02FnyYUA1Q==", "requires": {} }, "@dfinity/cmc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@dfinity/cmc/-/cmc-3.1.0.tgz", - "integrity": "sha512-WFnUihWExjIRi48SpxWKB0TAJ5PnICVl+/fIBdb1/31k6V62ni1HzkWFG/zLJapuXcsgzVR7ciC0QShU7U0Pmw==", + "version": "3.2.2-next-2024-10-17", + "resolved": "https://registry.npmjs.org/@dfinity/cmc/-/cmc-3.2.2-next-2024-10-17.tgz", + "integrity": "sha512-+IyUjcIPaRzeQbJGEzJwrmfULBAENp6UKgjmysYYGcJXWpK3C3/hYe+jMSxHatGVy2pbG05a2WMUuMVDgnLpkw==", "requires": {} }, "@dfinity/ic-management": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@dfinity/ic-management/-/ic-management-5.1.0.tgz", - "integrity": "sha512-XrDWAxPWliKyOPJXltt/z2qaOoMD6rIsAjUmQrGeFJXbk3H7DEnbNAZXWT1FlUAb0MRP1zp5u8uCi4Xa9RZnAg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@dfinity/ic-management/-/ic-management-5.2.2.tgz", + "integrity": "sha512-wLFWwK/26fv7sTqUOlqKFZEJVxdG5OHhiGUutfrSFoaOqHqQYD2Tb6PXWshsM3/B+zSPEoJxkzMG9cR6Ec8pHw==", "dev": true, "requires": {} }, "@dfinity/identity": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/identity/-/identity-1.4.0.tgz", - "integrity": "sha512-4WmMsQSuzfWXmm4s+0FYGbFiQcMGE88Ztg6yFq7aTMtRWuAjhz66Dy1+jRCrXxsoxvDdUvPzsyjkOSpr1AuUYQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/identity/-/identity-2.0.0.tgz", + "integrity": "sha512-6NBdqG/Z2H6zEwBlpwWcWKsffgisIVzy2AMY7fXu5Jq31niFAoxv//oRsejeW45ChahVJlhvP/UYrNMJur8GpQ==", "requires": { "@noble/curves": "^1.2.0", "@noble/hashes": "^1.3.1", @@ -7818,12 +7799,12 @@ } }, "@dfinity/identity-secp256k1": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/identity-secp256k1/-/identity-secp256k1-1.4.0.tgz", - "integrity": "sha512-cNJYPp3KaqeAnlw0R70a+f1tKOjwTvPCAvImQ1Nq3KuSDs9/5al0qUBGUx5zalxSIihGSr3/T9//X5L8pQlNMw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/identity-secp256k1/-/identity-secp256k1-2.0.0.tgz", + "integrity": "sha512-FyvevYIjaR4UBXwTiOqeHJVF9KhVUOiD+Oh2opw8MuCF6cpZVaC6lv/JtJvFMhCsgP8wS+HcrmawieEJMNgq+Q==", "dev": true, "requires": { - "@dfinity/agent": "^1.4.0", + "@dfinity/agent": "^2.0.0", "@noble/curves": "^1.4.0", "@noble/hashes": "^1.3.1", "asn1js": "^3.0.5", @@ -7833,29 +7814,29 @@ } }, "@dfinity/ledger-icp": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/ledger-icp/-/ledger-icp-2.4.0.tgz", - "integrity": "sha512-uWw9gsPwvrmviI6mp0wXUX59D3ytiwOsEgoXAWFOwybO9qVbwLb/ucZYcNYso7GpI91hXawT/jd2A/fcGTXebQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@dfinity/ledger-icp/-/ledger-icp-2.6.1.tgz", + "integrity": "sha512-GKfG/53C9IXkiPNbsWa9/r68wTCnW68GSm795SRDNa0YwLe0Y+FVEYDl6yz2tRFHwDWo+MTHhY07FfS4P4kJFw==", "requires": {} }, "@dfinity/ledger-icrc": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/ledger-icrc/-/ledger-icrc-2.4.0.tgz", - "integrity": "sha512-7NMFU3uoQ0QOarIzGEjmXkVEJZYSp9L4dj5ZR+TM5S0Dvd1TMmMb8GOW8TCN9WGDQUfuhd2Pe3l6dRykRq23gQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@dfinity/ledger-icrc/-/ledger-icrc-2.6.1.tgz", + "integrity": "sha512-fsCC01JHDIA+2l7CRll44yB5/OF2qj3Gz7xE10SW7V80elYULfa98w9ks12dqxGh62+62btxujU7ylluTgugyg==", "requires": {} }, "@dfinity/principal": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-1.4.0.tgz", - "integrity": "sha512-SuTBVlc71ub89ji0WN5/T100zUG2uIMn5x4+We4vS4nJ0R3/Xt89XJsHepjd5SQTSQPOvP7eQ+S8cQKWRz/RkA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@dfinity/principal/-/principal-2.0.0.tgz", + "integrity": "sha512-cqJ5kOrPpxco+wvJC4TFBhdr4lkw9mnwKGAYunesyqdzSYi8lnFB4dShNqlHFWdwoxNAw6OZkt/B+0nLa+7Yqw==", "requires": { "@noble/hashes": "^1.3.1" } }, "@dfinity/utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@dfinity/utils/-/utils-2.4.0.tgz", - "integrity": "sha512-1Bc+IcZTPXtPvDlDQElTjLRdHcpNOnu1vQyhQpFSXdwsnaXpdJzEhswq4GyzNjxRzaFnR0yrGCmbMjkb6UIe2A==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@dfinity/utils/-/utils-2.5.2.tgz", + "integrity": "sha512-QSW7t8kcLj0s/gL4NbYqr+Pqr3e2QhFn2JriwcghuflhwrYet1y23ANyM4EwSUeDAUR/OQXR86e4MfWkGMttAg==", "requires": {} }, "@esbuild-plugins/node-modules-polyfill": { @@ -8143,9 +8124,9 @@ } }, "@junobuild/admin": { - "version": "0.0.55", - "resolved": "https://registry.npmjs.org/@junobuild/admin/-/admin-0.0.55.tgz", - "integrity": "sha512-gRC0q8/TkNZE2oyRzemBMQHnnOlfG1odArM4rxGQcQgzewi76c0lG5eHiQjxm1nzWxvrQE9gQ8qVsRNY2nCBDg==", + "version": "0.0.56", + "resolved": "https://registry.npmjs.org/@junobuild/admin/-/admin-0.0.56.tgz", + "integrity": "sha512-G97a29CdH5MuELa/K4yg1KOGpGrO3HAfeYeL5V0eI7RuRqzLzqhgUXO3ZfLBJ7n7ynfqa++GU3d94DQAcjUGYQ==", "requires": {} }, "@junobuild/cli-tools": { @@ -8186,42 +8167,42 @@ "integrity": "sha512-LMhPpXW3X1c+XyNREMrfhi4mEk/AkLX0RxEbi6uKuyXd0/IsTHSB/sfFEgsTAvt4W4KmjrELcNyI1SFbpQEDAA==" }, "@junobuild/config-loader": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@junobuild/config-loader/-/config-loader-0.0.5.tgz", - "integrity": "sha512-983Kzl9KTaGD//bWml+RdyeG9kHQgXHyrtEg3Ps9sod0f93OYlZ8oFe8e7lrHuZcl6jhSRUfdoxukAyc3BFWrA==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@junobuild/config-loader/-/config-loader-0.0.6.tgz", + "integrity": "sha512-3EDk11NNCDOJD/odguR8pVvtybc0WlrZa0Z8YSGBVtd5WLcu3ZjKeBSPkjouXYEFLSTn7ykqkP772Etbwl+/DA==", "dev": true, "requires": { - "@babel/core": "^7.24.6", - "@babel/plugin-transform-modules-commonjs": "^7.24.6", - "@babel/preset-typescript": "^7.24.6" + "@babel/core": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/preset-typescript": "^7.24.7" } }, "@junobuild/console": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@junobuild/console/-/console-0.0.8.tgz", - "integrity": "sha512-WxCS56E/YK+ddVPRY+0u0m5Sc0e1uNwRpigEfI2LZeRpL9W/RuBt5V38xQzfYKf7zG67L8bDNAYZctuRYb8bmg==", + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@junobuild/console/-/console-0.0.9.tgz", + "integrity": "sha512-WShN7bZXQs9QZDrejc2x9eHVkVfVJdtPo2e0X/i3vd6Bk0BrNVfIXPq63MBd2+R5OI9aoEVYePFnoysnbZyWLA==", "dev": true, "requires": {} }, "@junobuild/core-peer": { - "version": "0.0.25", - "resolved": "https://registry.npmjs.org/@junobuild/core-peer/-/core-peer-0.0.25.tgz", - "integrity": "sha512-j9v0cIWCI4G7WNH5xmo8xJMGfKz0nT0zkSyY4HqEAcSA0xgACRXwdf/LyZcXCUXwgjessln80Gwjzh7oozcPRg==", + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@junobuild/core-peer/-/core-peer-0.0.27.tgz", + "integrity": "sha512-dgY4crYQ9mQKlERtULdrOCnFIBFfRlX1vvUBtgigT58gdphIQC88HKBfPeuzPjSGIf5uxOHgzDZ/wMAeb+2eAQ==", "requires": { "@junobuild/storage": "*", "@junobuild/utils": "*" } }, "@junobuild/storage": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@junobuild/storage/-/storage-0.0.5.tgz", - "integrity": "sha512-vEUsnO6mAUjXKqpz25Cvg3k6atEGL+PgFpl9AnH5FEQePj6owUQcLrg5mVDdA0PM7u8uG9Z0LzospnjUAHE1bQ==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@junobuild/storage/-/storage-0.0.6.tgz", + "integrity": "sha512-X5q92hOLodB/ADA2hvzF7gCmJ+x/BWh1dwySE+DfHJnEXuWRyEBRn8YM6pUTROSwPe9axAPtZ3zTzw61wo2T/w==", "requires": {} }, "@junobuild/utils": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/@junobuild/utils/-/utils-0.0.24.tgz", - "integrity": "sha512-UF95ROr8Df8FpNYf3eqF/FUoIvSXsLfHk//oMiRmii6Bp0A6HgSVmlZOeBqjcdy3P+qQHbdktMk4Lg9tIDYygQ==", + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@junobuild/utils/-/utils-0.0.25.tgz", + "integrity": "sha512-hKvSeyREVy7YoJoXWSs4Q1xp8I4tlZ9c9KVVPNLdJ/vl8ad8/EEfcvuobNdNZ860h9DqG5LXhqam+Mf/blU33w==", "requires": {} }, "@ltd/j-toml": { @@ -8231,17 +8212,17 @@ "dev": true }, "@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", "requires": { - "@noble/hashes": "1.4.0" + "@noble/hashes": "1.5.0" } }, "@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -8270,9 +8251,9 @@ } }, "@peculiar/asn1-schema": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.8.tgz", - "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==", + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.13.tgz", + "integrity": "sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==", "peer": true, "requires": { "asn1js": "^3.0.5", @@ -8290,16 +8271,16 @@ } }, "@peculiar/webcrypto": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.4.5.tgz", - "integrity": "sha512-oDk93QCDGdxFRM8382Zdminzs44dg3M2+E5Np+JWkpqLDyJC9DviMh8F8mEJkYuUcUOGA5jHO5AJJ10MFWdbZw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz", + "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==", "peer": true, "requires": { "@peculiar/asn1-schema": "^2.3.8", "@peculiar/json-schema": "^1.1.12", "pvtsutils": "^1.3.5", "tslib": "^2.6.2", - "webcrypto-core": "^1.7.8" + "webcrypto-core": "^1.8.0" } }, "@polka/url": { @@ -8430,6 +8411,12 @@ "any-observable": "^0.3.0" } }, + "@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true + }, "@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -9011,15 +8998,15 @@ "dev": true }, "browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" } }, "bs58": { @@ -9069,9 +9056,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001600", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", - "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", "dev": true }, "chai": { @@ -9495,9 +9482,9 @@ } }, "electron-to-chromium": { - "version": "1.4.717", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.717.tgz", - "integrity": "sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==", + "version": "1.5.41", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz", + "integrity": "sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==", "dev": true }, "elegant-spinner": { @@ -9507,9 +9494,9 @@ "dev": true }, "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, "requires": { "bn.js": "^4.11.9", @@ -9565,9 +9552,9 @@ } }, "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-string-regexp": { @@ -9831,14 +9818,33 @@ } }, "file-type": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-19.0.0.tgz", - "integrity": "sha512-s7cxa7/leUWLiXO78DVVfBVse+milos9FitauDLG1pI7lNaJ2+5lzPnr2N24ym+84HVwJL6hVuGfgVE+ALvU8Q==", + "version": "19.6.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-19.6.0.tgz", + "integrity": "sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==", "dev": true, "requires": { - "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0", - "token-types": "^5.0.1" + "get-stream": "^9.0.1", + "strtok3": "^9.0.1", + "token-types": "^6.0.0", + "uint8array-extras": "^1.3.0" + }, + "dependencies": { + "get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "requires": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + } + }, + "is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true + } } }, "fill-range": { @@ -10040,9 +10046,9 @@ }, "dependencies": { "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", + "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -10263,9 +10269,9 @@ } }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true }, "json-schema-traverse": { @@ -10799,21 +10805,21 @@ "dev": true }, "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", "dev": true }, "node-gyp-build": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", - "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", "dev": true }, "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "normalize-path": { @@ -10959,9 +10965,9 @@ "dev": true }, "peek-readable": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.3.1.tgz", + "integrity": "sha512-GVlENSDW6KHaXcd9zkZltB7tCLosKB/4Hg0fqBJkAoBgYG2Tn1xtMgXtSUuMU9AK/gCm/tTdT8mgAeF4YNeeqw==", "dev": true }, "pem-file": { @@ -10991,9 +10997,9 @@ } }, "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -11176,15 +11182,6 @@ "util-deprecate": "^1.0.1" } }, - "readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dev": true, - "requires": { - "readable-stream": "^3.6.0" - } - }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -11421,13 +11418,13 @@ } }, "secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz", + "integrity": "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==", "dev": true, "requires": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", + "elliptic": "^6.5.7", + "node-addon-api": "^5.0.0", "node-gyp-build": "^4.2.0" } }, @@ -11624,13 +11621,13 @@ } }, "strtok3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-9.0.1.tgz", + "integrity": "sha512-ERPW+XkvX9W2A+ov07iy+ZFJpVdik04GhDA4eVogiG9hpC97Kem2iucyzhFxbFRvQ5o2UckFtKZdp1hkGvnrEw==", "dev": true, "requires": { "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.0.0" + "peek-readable": "^5.3.1" } }, "stubborn-fs": { @@ -11802,9 +11799,9 @@ } }, "token-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.0.0.tgz", + "integrity": "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==", "dev": true, "requires": { "@tokenizer/token": "^0.3.0", @@ -11825,9 +11822,9 @@ "requires": {} }, "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" }, "type-check": { "version": "0.4.0", @@ -11862,19 +11859,19 @@ "dev": true }, "uint8array-extras": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.1.0.tgz", - "integrity": "sha512-CVaBSyOmGoFHu+zOVPbetXEXykOd8KHVBHLlqvmaMWpwcq3rewj18xVNbU5uzf48hclnNQhfNaNany2cMHFK/g==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz", + "integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==", "dev": true }, "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "uri-js": { @@ -11952,16 +11949,16 @@ } }, "webcrypto-core": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.7.8.tgz", - "integrity": "sha512-eBR98r9nQXTqXt/yDRtInszPMjTaSAMJAFDg2AHsgrnczawT1asx9YNBX6k5p+MekbPF4+s/UJJrr88zsTqkSg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.8.1.tgz", + "integrity": "sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==", "peer": true, "requires": { - "@peculiar/asn1-schema": "^2.3.8", + "@peculiar/asn1-schema": "^2.3.13", "@peculiar/json-schema": "^1.1.12", - "asn1js": "^3.0.1", + "asn1js": "^3.0.5", "pvtsutils": "^1.3.5", - "tslib": "^2.6.2" + "tslib": "^2.7.0" } }, "when-exit": { diff --git a/package.json b/package.json index c18d6304e..3b3dd655f 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ }, "description": "An Open Source Blockchain-as-a-Service", "scripts": { + "build:subnets": "node scripts/cmc.subnets.mjs && npm run format", "build:csp": "node scripts/build.csp.mjs", "build:post-process": "npm run build:csp", "dev": "npm run i18n && vite dev", @@ -46,15 +47,15 @@ "emulator": "docker compose up" }, "devDependencies": { - "@dfinity/ic-management": "^5.1.0", - "@dfinity/identity-secp256k1": "^1.4.0", + "@dfinity/ic-management": "^5.2.2", + "@dfinity/identity-secp256k1": "^2.0.0", "@esbuild-plugins/node-modules-polyfill": "^0.2.2", "@hadronous/pic": "^0.8.1", "@junobuild/cli-tools": "^0.0.14", "@junobuild/config": "^0.0.14", - "@junobuild/config-loader": "^0.0.5", - "@junobuild/console": "^0.0.8", - "@junobuild/storage": "^0.0.5", + "@junobuild/config-loader": "^0.0.6", + "@junobuild/console": "^0.0.9", + "@junobuild/storage": "^0.0.6", "@ltd/j-toml": "^1.38.0", "@rollup/plugin-inject": "^5.0.5", "@sveltejs/adapter-static": "^3.0.2", @@ -83,17 +84,18 @@ "vitest": "^1.6.0" }, "dependencies": { - "@dfinity/agent": "^1.4.0", - "@dfinity/auth-client": "^1.4.0", - "@dfinity/cmc": "^3.1.0", - "@dfinity/identity": "^1.4.0", - "@dfinity/ledger-icp": "^2.4.0", - "@dfinity/ledger-icrc": "^2.4.0", - "@dfinity/principal": "^1.4.0", - "@dfinity/utils": "^2.4.0", - "@junobuild/admin": "^0.0.55", - "@junobuild/core-peer": "^0.0.25", - "@junobuild/utils": "^0.0.24", + "@dfinity/agent": "^2.0.0", + "@dfinity/auth-client": "^2.0.0", + "@dfinity/candid": "^2.0.0", + "@dfinity/cmc": "^3.2.2-next-2024-10-17", + "@dfinity/identity": "^2.0.0", + "@dfinity/ledger-icp": "^2.6.1", + "@dfinity/ledger-icrc": "^2.6.1", + "@dfinity/principal": "^2.0.0", + "@dfinity/utils": "^2.5.2", + "@junobuild/admin": "^0.0.56", + "@junobuild/core-peer": "^0.0.27", + "@junobuild/utils": "^0.0.25", "buffer": "^6.0.3", "date-fns": "^2.30.0", "idb-keyval": "^6.2.1", diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 81cb6d556..06f5df86b 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.80.0" +channel = "1.82.0" targets = ["wasm32-unknown-unknown"] diff --git a/scripts/actor.mjs b/scripts/actor.mjs index 4620fc835..d1140262c 100644 --- a/scripts/actor.mjs +++ b/scripts/actor.mjs @@ -16,11 +16,15 @@ export const icAgent = async () => { console.log('IC identity:', identity.getPrincipal().toText()); - return new HttpAgent({ identity, fetch, host: 'https://icp0.io' }); + return await HttpAgent.create({ identity, fetch, host: 'https://icp-api.io' }); }; export const icAnonymousAgent = async () => { - return new HttpAgent({ identity: new AnonymousIdentity(), fetch, host: 'https://icp0.io' }); + return await HttpAgent.create({ + identity: new AnonymousIdentity(), + fetch, + host: 'https://icp-api.io' + }); }; export const localAgent = async () => { @@ -28,7 +32,7 @@ export const localAgent = async () => { console.log('Local identity:', identity.getPrincipal().toText()); - const agent = new HttpAgent({ identity, fetch, host: 'http://127.0.0.1:5987/' }); + const agent = await HttpAgent.create({ identity, fetch, host: 'http://127.0.0.1:5987/' }); await agent.fetchRootKey(); diff --git a/scripts/cmc.subnets.mjs b/scripts/cmc.subnets.mjs new file mode 100755 index 000000000..5fc2381dd --- /dev/null +++ b/scripts/cmc.subnets.mjs @@ -0,0 +1,37 @@ +#!/usr/bin/env node + +import { CMCCanister } from '@dfinity/cmc'; +import { jsonReplacer } from '@dfinity/utils'; +import { existsSync, mkdirSync, writeFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { icAnonymousAgent } from './actor.mjs'; +import { CMC_ID } from './constants.mjs'; + +const DATA_FOLDER = join(process.cwd(), 'src', 'frontend', 'src', 'lib', 'env'); + +if (!existsSync(DATA_FOLDER)) { + mkdirSync(DATA_FOLDER, { recursive: true }); +} + +const listSubnets = async () => { + const agent = await icAnonymousAgent(); + + const { getDefaultSubnets } = CMCCanister.create({ + agent, + canisterId: CMC_ID + }); + + return await getDefaultSubnets({ certified: true }); +}; + +const writeSubnets = async (subnets) => { + const subnetsList = subnets.map((principal) => ({ + subnetId: principal.toText() + })); + + writeFileSync(join(DATA_FOLDER, 'subnets.json'), JSON.stringify(subnetsList, jsonReplacer, 8)); +}; + +const subnets = await listSubnets(); + +await writeSubnets(subnets); diff --git a/scripts/constants.mjs b/scripts/constants.mjs index 4d7848215..059ee6245 100644 --- a/scripts/constants.mjs +++ b/scripts/constants.mjs @@ -4,3 +4,4 @@ export const CONSOLE_ID = Principal.fromText('cokmz-oiaaa-aaaal-aby6q-cai'); export const OBSERVATORY_ID = Principal.fromText('klbfr-lqaaa-aaaak-qbwsa-cai'); export const LEDGER_ID = Principal.fromText('ryjl3-tyaaa-aaaaa-aaaba-cai'); +export const CMC_ID = Principal.fromText('rkp4c-7iaaa-aaaaa-aaaca-cai'); diff --git a/src/console/Cargo.toml b/src/console/Cargo.toml index 61654d402..03ee87659 100644 --- a/src/console/Cargo.toml +++ b/src/console/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "console" -version = "0.0.12" +version = "0.0.13" edition = "2021" publish = false diff --git a/src/console/console.did b/src/console/console.did index 06701e12c..7dfa6ee20 100644 --- a/src/console/console.did +++ b/src/console/console.did @@ -33,7 +33,11 @@ type CommitProposal = record { sha256 : blob; proposal_id : nat }; type Config = record { storage : StorageConfig }; type ConfigMaxMemorySize = record { stable : opt nat64; heap : opt nat64 }; type ControllerScope = variant { Write; Admin }; -type CreateCanisterArgs = record { block_index : opt nat64; user : principal }; +type CreateCanisterArgs = record { + block_index : opt nat64; + subnet_id : opt principal; + user : principal; +}; type CustomDomain = record { updated_at : nat64; created_at : nat64; diff --git a/src/console/src/controllers.rs b/src/console/src/controllers.rs index 384eccd82..929139fa3 100644 --- a/src/console/src/controllers.rs +++ b/src/console/src/controllers.rs @@ -1,6 +1,6 @@ use crate::wasm::user_mission_control_controllers; use candid::Principal; -use junobuild_shared::ic::update_canister_controllers; +use junobuild_shared::mgmt::ic::update_canister_controllers; use junobuild_shared::types::state::MissionControlId; use junobuild_shared::types::state::UserId; diff --git a/src/console/src/factory/canister.rs b/src/console/src/factory/canister.rs index 239a51c36..faca3a5ef 100644 --- a/src/console/src/factory/canister.rs +++ b/src/console/src/factory/canister.rs @@ -10,6 +10,7 @@ use junobuild_shared::constants::{IC_TRANSACTION_FEE_ICP, MEMO_SATELLITE_CREATE_ use junobuild_shared::ledger::icp::{ find_payment, principal_to_account_identifier, transfer_payment, SUB_ACCOUNT, }; +use junobuild_shared::mgmt::types::cmc::SubnetId; use junobuild_shared::types::interface::CreateCanisterArgs; use junobuild_shared::types::state::{MissionControlId, UserId}; use std::future::Future; @@ -20,10 +21,14 @@ pub async fn create_canister( get_fee: &dyn Fn() -> Tokens, console: Principal, caller: Principal, - CreateCanisterArgs { user, block_index }: CreateCanisterArgs, + CreateCanisterArgs { + user, + block_index, + subnet_id, + }: CreateCanisterArgs, ) -> Result where - F: FnOnce(Principal, MissionControlId, UserId) -> Fut, + F: FnOnce(Principal, MissionControlId, UserId, Option) -> Fut, Fut: Future>, { // User should have a mission control center @@ -38,8 +43,14 @@ where // Guard too many requests increment_rate()?; - return create_canister_with_credits(create, console, mission_control_id, user) - .await; + return create_canister_with_credits( + create, + console, + mission_control_id, + user, + subnet_id, + ) + .await; } create_canister_with_payment( @@ -47,7 +58,11 @@ where console, caller, mission_control_id, - CreateCanisterArgs { user, block_index }, + CreateCanisterArgs { + user, + block_index, + subnet_id, + }, fee, ) .await @@ -60,13 +75,14 @@ async fn create_canister_with_credits( console: Principal, mission_control_id: MissionControlId, user: UserId, + subnet_id: Option, ) -> Result where - F: FnOnce(Principal, MissionControlId, UserId) -> Fut, + F: FnOnce(Principal, MissionControlId, UserId, Option) -> Fut, Fut: Future>, { // Create the satellite - let create_canister_result = create(console, mission_control_id, user).await; + let create_canister_result = create(console, mission_control_id, user, subnet_id).await; match create_canister_result { Err(_) => Err("Segment creation with credits failed.".to_string()), @@ -87,11 +103,15 @@ async fn create_canister_with_payment( console: Principal, caller: Principal, mission_control_id: MissionControlId, - CreateCanisterArgs { user, block_index }: CreateCanisterArgs, + CreateCanisterArgs { + user, + block_index, + subnet_id, + }: CreateCanisterArgs, fee: Tokens, ) -> Result where - F: FnOnce(Principal, MissionControlId, UserId) -> Fut, + F: FnOnce(Principal, MissionControlId, UserId, Option) -> Fut, Fut: Future>, { let mission_control_account_identifier = principal_to_account_identifier(&caller, &SUB_ACCOUNT); @@ -129,7 +149,7 @@ where insert_new_payment(&user, &mission_control_payment_block_index)?; // Create the canister (satellite or orbiter) - let create_canister_result = create(console, mission_control_id, user).await; + let create_canister_result = create(console, mission_control_id, user, subnet_id).await; match create_canister_result { Err(error) => { diff --git a/src/console/src/factory/mission_control.rs b/src/console/src/factory/mission_control.rs index 3c206a8f9..bd332bac2 100644 --- a/src/console/src/factory/mission_control.rs +++ b/src/console/src/factory/mission_control.rs @@ -7,7 +7,7 @@ use crate::types::state::MissionControl; use crate::wasm::mission_control_wasm_arg; use candid::Principal; use junobuild_shared::constants::CREATE_MISSION_CONTROL_CYCLES; -use junobuild_shared::ic::create_canister_install_code; +use junobuild_shared::mgmt::ic::create_canister_install_code; use junobuild_shared::types::state::UserId; pub async fn init_user_mission_control( diff --git a/src/console/src/factory/orbiter.rs b/src/console/src/factory/orbiter.rs index 560069e4f..c9b32e6fa 100644 --- a/src/console/src/factory/orbiter.rs +++ b/src/console/src/factory/orbiter.rs @@ -4,7 +4,9 @@ use crate::store::heap::{get_orbiter_fee, increment_orbiters_rate}; use crate::wasm::orbiter_wasm_arg; use candid::Principal; use junobuild_shared::constants::CREATE_ORBITER_CYCLES; -use junobuild_shared::ic::create_canister_install_code; +use junobuild_shared::mgmt::cmc::cmc_create_canister_install_code; +use junobuild_shared::mgmt::ic::create_canister_install_code; +use junobuild_shared::mgmt::types::cmc::SubnetId; use junobuild_shared::types::interface::CreateCanisterArgs; use junobuild_shared::types::state::{MissionControlId, UserId}; @@ -28,14 +30,18 @@ async fn create_orbiter_wasm( console: Principal, mission_control_id: MissionControlId, user: UserId, + subnet_id: Option, ) -> Result { let wasm_arg = orbiter_wasm_arg(&user, &mission_control_id)?; - let result = create_canister_install_code( - Vec::from([console, mission_control_id, user]), - &wasm_arg, - CREATE_ORBITER_CYCLES, - ) - .await; + + let controller = Vec::from([console, mission_control_id, user]); + + let result = if let Some(subnet_id) = subnet_id { + cmc_create_canister_install_code(controller, &wasm_arg, CREATE_ORBITER_CYCLES, &subnet_id) + .await + } else { + create_canister_install_code(controller, &wasm_arg, CREATE_ORBITER_CYCLES).await + }; match result { Err(error) => Err(error), diff --git a/src/console/src/factory/satellite.rs b/src/console/src/factory/satellite.rs index 75b335290..25ce42c00 100644 --- a/src/console/src/factory/satellite.rs +++ b/src/console/src/factory/satellite.rs @@ -4,7 +4,9 @@ use crate::store::heap::{get_satellite_fee, increment_satellites_rate}; use crate::wasm::satellite_wasm_arg; use candid::Principal; use junobuild_shared::constants::CREATE_SATELLITE_CYCLES; -use junobuild_shared::ic::create_canister_install_code; +use junobuild_shared::mgmt::cmc::cmc_create_canister_install_code; +use junobuild_shared::mgmt::ic::create_canister_install_code; +use junobuild_shared::mgmt::types::cmc::SubnetId; use junobuild_shared::types::interface::CreateCanisterArgs; use junobuild_shared::types::state::{MissionControlId, UserId}; @@ -28,14 +30,18 @@ async fn create_satellite_wasm( console: Principal, mission_control_id: MissionControlId, user: UserId, + subnet_id: Option, ) -> Result { let wasm_arg = satellite_wasm_arg(&user, &mission_control_id)?; - let result = create_canister_install_code( - Vec::from([console, mission_control_id, user]), - &wasm_arg, - CREATE_SATELLITE_CYCLES, - ) - .await; + + let controller = Vec::from([console, mission_control_id, user]); + + let result = if let Some(subnet_id) = subnet_id { + cmc_create_canister_install_code(controller, &wasm_arg, CREATE_SATELLITE_CYCLES, &subnet_id) + .await + } else { + create_canister_install_code(controller, &wasm_arg, CREATE_SATELLITE_CYCLES).await + }; match result { Err(error) => Err(error), diff --git a/src/console/src/wasm.rs b/src/console/src/wasm.rs index e3e21285f..5f5c60b0e 100644 --- a/src/console/src/wasm.rs +++ b/src/console/src/wasm.rs @@ -3,8 +3,8 @@ use crate::store::heap::{ get_latest_mission_control_version, get_latest_orbiter_version, get_latest_satellite_version, }; use candid::{Encode, Principal}; +use junobuild_shared::mgmt::types::ic::WasmArg; use junobuild_shared::types::core::Blob; -use junobuild_shared::types::ic::WasmArg; use junobuild_shared::types::interface::{MissionControlArgs, SegmentArgs}; use junobuild_shared::types::state::{MissionControlId, UserId}; use junobuild_storage::constants::ASSET_ENCODING_NO_COMPRESSION; diff --git a/src/declarations/console/console.did.d.ts b/src/declarations/console/console.did.d.ts index 590bb632f..fa40fea24 100644 --- a/src/declarations/console/console.did.d.ts +++ b/src/declarations/console/console.did.d.ts @@ -49,6 +49,7 @@ export interface ConfigMaxMemorySize { export type ControllerScope = { Write: null } | { Admin: null }; export interface CreateCanisterArgs { block_index: [] | [bigint]; + subnet_id: [] | [Principal]; user: Principal; } export interface CustomDomain { diff --git a/src/declarations/console/console.factory.did.js b/src/declarations/console/console.factory.did.js index 2fa8fabb5..b0fbf9e5f 100644 --- a/src/declarations/console/console.factory.did.js +++ b/src/declarations/console/console.factory.did.js @@ -16,6 +16,7 @@ export const idlFactory = ({ IDL }) => { }); const CreateCanisterArgs = IDL.Record({ block_index: IDL.Opt(IDL.Nat64), + subnet_id: IDL.Opt(IDL.Principal), user: IDL.Principal }); const DeleteControllersArgs = IDL.Record({ diff --git a/src/declarations/console/console.factory.did.mjs b/src/declarations/console/console.factory.did.mjs index 2fa8fabb5..b0fbf9e5f 100644 --- a/src/declarations/console/console.factory.did.mjs +++ b/src/declarations/console/console.factory.did.mjs @@ -16,6 +16,7 @@ export const idlFactory = ({ IDL }) => { }); const CreateCanisterArgs = IDL.Record({ block_index: IDL.Opt(IDL.Nat64), + subnet_id: IDL.Opt(IDL.Principal), user: IDL.Principal }); const DeleteControllersArgs = IDL.Record({ diff --git a/src/declarations/mission_control/mission_control.did.d.ts b/src/declarations/mission_control/mission_control.did.d.ts index 8b0e34827..b821acafa 100644 --- a/src/declarations/mission_control/mission_control.did.d.ts +++ b/src/declarations/mission_control/mission_control.did.d.ts @@ -15,6 +15,10 @@ export interface Controller { expires_at: [] | [bigint]; } export type ControllerScope = { Write: null } | { Admin: null }; +export interface CreateCanisterConfig { + subnet_id: [] | [Principal]; + name: [] | [string]; +} export interface CronJobStatusesConfig { enabled: boolean; cycles_threshold: [] | [bigint]; @@ -119,7 +123,9 @@ export interface _SERVICE { add_mission_control_controllers: ActorMethod<[Array], undefined>; add_satellites_controllers: ActorMethod<[Array, Array], undefined>; create_orbiter: ActorMethod<[[] | [string]], Orbiter>; + create_orbiter_with_config: ActorMethod<[CreateCanisterConfig], Orbiter>; create_satellite: ActorMethod<[string], Satellite>; + create_satellite_with_config: ActorMethod<[CreateCanisterConfig], Satellite>; del_mission_control_controllers: ActorMethod<[Array], undefined>; del_orbiter: ActorMethod<[Principal, bigint], undefined>; del_orbiters_controllers: ActorMethod<[Array, Array], undefined>; diff --git a/src/declarations/mission_control/mission_control.factory.did.js b/src/declarations/mission_control/mission_control.factory.did.js index a6c166f4c..9fb5ed8fa 100644 --- a/src/declarations/mission_control/mission_control.factory.did.js +++ b/src/declarations/mission_control/mission_control.factory.did.js @@ -6,6 +6,10 @@ export const idlFactory = ({ IDL }) => { metadata: IDL.Vec(IDL.Tuple(IDL.Text, IDL.Text)), created_at: IDL.Nat64 }); + const CreateCanisterConfig = IDL.Record({ + subnet_id: IDL.Opt(IDL.Principal), + name: IDL.Opt(IDL.Text) + }); const Satellite = IDL.Record({ updated_at: IDL.Nat64, metadata: IDL.Vec(IDL.Tuple(IDL.Text, IDL.Text)), @@ -121,7 +125,9 @@ export const idlFactory = ({ IDL }) => { add_mission_control_controllers: IDL.Func([IDL.Vec(IDL.Principal)], [], []), add_satellites_controllers: IDL.Func([IDL.Vec(IDL.Principal), IDL.Vec(IDL.Principal)], [], []), create_orbiter: IDL.Func([IDL.Opt(IDL.Text)], [Orbiter], []), + create_orbiter_with_config: IDL.Func([CreateCanisterConfig], [Orbiter], []), create_satellite: IDL.Func([IDL.Text], [Satellite], []), + create_satellite_with_config: IDL.Func([CreateCanisterConfig], [Satellite], []), del_mission_control_controllers: IDL.Func([IDL.Vec(IDL.Principal)], [], []), del_orbiter: IDL.Func([IDL.Principal, IDL.Nat], [], []), del_orbiters_controllers: IDL.Func([IDL.Vec(IDL.Principal), IDL.Vec(IDL.Principal)], [], []), diff --git a/src/frontend/src/lib/api/cmc.api.ts b/src/frontend/src/lib/api/cmc.api.ts index 37799f570..9f312d1b5 100644 --- a/src/frontend/src/lib/api/cmc.api.ts +++ b/src/frontend/src/lib/api/cmc.api.ts @@ -2,6 +2,7 @@ import { CMC_CANISTER_ID } from '$lib/constants/constants'; import { getAgent } from '$lib/utils/agent.utils'; import { AnonymousIdentity } from '@dfinity/agent'; import { CMCCanister } from '@dfinity/cmc'; +import { Principal } from '@dfinity/principal'; const NUMBER_XDR_PER_ONE_ICP = 10_000; @@ -10,7 +11,7 @@ export const icpXdrConversionRate = async (): Promise => { const { getIcpToCyclesConversionRate } = CMCCanister.create({ agent, - canisterId: CMC_CANISTER_ID + canisterId: Principal.fromText(CMC_CANISTER_ID) }); const xdr_permyriad_per_icp = await getIcpToCyclesConversionRate(); @@ -20,3 +21,14 @@ export const icpXdrConversionRate = async (): Promise => { // trillionRatio return (xdr_permyriad_per_icp * CYCLES_PER_XDR) / BigInt(NUMBER_XDR_PER_ONE_ICP); }; + +export const getDefaultSubnets = async (): Promise => { + const agent = await getAgent({ identity: new AnonymousIdentity() }); + + const { getDefaultSubnets: getDefaultSubnetsApi } = CMCCanister.create({ + agent, + canisterId: Principal.fromText(CMC_CANISTER_ID) + }); + + return await getDefaultSubnetsApi({ certified: false }); +}; diff --git a/src/frontend/src/lib/api/ic.api.ts b/src/frontend/src/lib/api/ic.api.ts index 9cb624f61..3c9d70f70 100644 --- a/src/frontend/src/lib/api/ic.api.ts +++ b/src/frontend/src/lib/api/ic.api.ts @@ -5,8 +5,14 @@ import type { } from '$declarations/ic/ic.did'; import type { CanisterInfo, CanisterLogVisibility, CanisterStatus } from '$lib/types/canister'; import { getICActor } from '$lib/utils/actor.ic.utils'; -import type { Identity } from '@dfinity/agent'; +import { getAgent } from '$lib/utils/agent.utils'; +import { + CanisterStatus as AgentCanisterStatus, + AnonymousIdentity, + type Identity +} from '@dfinity/agent'; import { Principal } from '@dfinity/principal'; +import { nonNullish } from '@dfinity/utils'; const toStatus = ( status: { stopped: null } | { stopping: null } | { running: null } @@ -127,3 +133,28 @@ export const canisterUpdateSettings = async ({ const { update_settings } = await getICActor({ identity }); return update_settings({ canister_id: canisterId, sender_canister_version: [], settings }); }; + +export const getSubnetId = async ({ + canisterId +}: { + canisterId: string; +}): Promise => { + const agent = await getAgent({ identity: new AnonymousIdentity() }); + + const path = 'subnet' as const; + + const result = await AgentCanisterStatus.request({ + canisterId: Principal.from(canisterId), + agent, + paths: [path] + }); + + const subnet: AgentCanisterStatus.Status | undefined = result.get(path); + + const isSubnetStatus = ( + subnet: AgentCanisterStatus.Status | undefined + ): subnet is AgentCanisterStatus.SubnetStatus => + nonNullish(subnet) && typeof subnet === 'object' && 'subnetId' in subnet; + + return isSubnetStatus(subnet) ? subnet.subnetId : undefined; +}; diff --git a/src/frontend/src/lib/components/canister/CanisterAdvancedOptions.svelte b/src/frontend/src/lib/components/canister/CanisterAdvancedOptions.svelte new file mode 100644 index 000000000..bdc92da4b --- /dev/null +++ b/src/frontend/src/lib/components/canister/CanisterAdvancedOptions.svelte @@ -0,0 +1,14 @@ + + + + {$i18n.canisters.advanced_options} + + + diff --git a/src/frontend/src/lib/components/canister/CanisterSubnet.svelte b/src/frontend/src/lib/components/canister/CanisterSubnet.svelte new file mode 100644 index 000000000..6482e175a --- /dev/null +++ b/src/frontend/src/lib/components/canister/CanisterSubnet.svelte @@ -0,0 +1,38 @@ + + +
+ + {$i18n.canisters.subnet_id} + {#if nonNullish(subnetId)} + + {:else} + + {/if} + +
diff --git a/src/frontend/src/lib/components/canister/CanisterSubnets.svelte b/src/frontend/src/lib/components/canister/CanisterSubnets.svelte new file mode 100644 index 000000000..67204cd31 --- /dev/null +++ b/src/frontend/src/lib/components/canister/CanisterSubnets.svelte @@ -0,0 +1,48 @@ + + +
+ + {$i18n.canisters.subnet} + + +
diff --git a/src/frontend/src/lib/components/icons/IconQRCode.svelte b/src/frontend/src/lib/components/icons/IconQRCode.svelte new file mode 100644 index 000000000..3c736af59 --- /dev/null +++ b/src/frontend/src/lib/components/icons/IconQRCode.svelte @@ -0,0 +1,15 @@ + + + + diff --git a/src/frontend/src/lib/components/mission-control/MissionControl.svelte b/src/frontend/src/lib/components/mission-control/MissionControl.svelte index 8216aada7..9076b9bd3 100644 --- a/src/frontend/src/lib/components/mission-control/MissionControl.svelte +++ b/src/frontend/src/lib/components/mission-control/MissionControl.svelte @@ -10,6 +10,7 @@ import { versionStore } from '$lib/stores/version.store'; import { fade } from 'svelte/transition'; import MissionControlStatuses from '$lib/components/mission-control/MissionControlStatuses.svelte'; + import CanisterSubnet from '$lib/components/canister/CanisterSubnet.svelte'; {#if $authSignedInStore} @@ -20,8 +21,16 @@
{$i18n.mission_control.id} - + + + {#if nonNullish($missionControlStore)} + + {/if}
diff --git a/src/frontend/src/lib/components/mission-control/MissionControlWallet.svelte b/src/frontend/src/lib/components/mission-control/MissionControlWallet.svelte index c57fc8126..3e24485c8 100644 --- a/src/frontend/src/lib/components/mission-control/MissionControlWallet.svelte +++ b/src/frontend/src/lib/components/mission-control/MissionControlWallet.svelte @@ -7,7 +7,6 @@ import Value from '$lib/components/ui/Value.svelte'; import { i18n } from '$lib/stores/i18n.store'; import Identifier from '$lib/components/ui/Identifier.svelte'; - import QRCodeContainer from '$lib/components/ui/QRCodeContainer.svelte'; import { onMount } from 'svelte'; import { getAccountIdentifier, getTransactions } from '$lib/api/icp-index.api'; import { getCredits } from '$lib/api/console.api'; @@ -21,6 +20,8 @@ import { emit } from '$lib/utils/events.utils'; import { versionStore } from '$lib/stores/version.store'; import { compare } from 'semver'; + import SkeletonText from '$lib/components/ui/SkeletonText.svelte'; + import ReceiveTokens from '$lib/components/tokens/ReceiveTokens.svelte'; export let missionControlId: Principal; @@ -103,7 +104,11 @@ * Actions */ - const openModal = () => { + let receiveVisible = false; + + const openReceive = () => (receiveVisible = true); + + const openSend = () => { emit({ message: 'junoModal', detail: { @@ -127,53 +132,48 @@
{$i18n.wallet.overview} -
+
{$i18n.wallet.wallet_id} -

- -

+
{$i18n.wallet.account_identifier} -

- -

+
+
+
{$i18n.wallet.balance}

{#if nonNullish(balance)}{formatE8sICP(balance)} ICP{/if} -

-
- - - {$i18n.wallet.credits} -

- {#if nonNullish(credits)}{formatE8sCredits(credits)}{/if} + >{:else}{/if}

-
-
- {#if nonNullish(accountIdentifier)} - - {/if} +
+ + {$i18n.wallet.credits} +

+ {#if nonNullish(credits)}{formatE8sCredits(credits)}{/if} +

+
+
- {#if send} - - {/if} +
+ + + {#if send} + + {/if} +
{/if} + + diff --git a/src/frontend/src/lib/components/modals/CanisterUpgradeModal.svelte b/src/frontend/src/lib/components/modals/CanisterUpgradeModal.svelte index f7eb084ef..9a888f084 100644 --- a/src/frontend/src/lib/components/modals/CanisterUpgradeModal.svelte +++ b/src/frontend/src/lib/components/modals/CanisterUpgradeModal.svelte @@ -9,6 +9,7 @@ import { i18nFormat } from '$lib/utils/i18n.utils'; import type { BuildType } from '@junobuild/admin'; import ConfirmUpgradeVersion from '$lib/components/upgrade/ConfirmUpgradeVersion.svelte'; + import { nonNullish } from '@dfinity/utils'; export let currentVersion: string; export let newerReleases: string[]; @@ -17,7 +18,7 @@ export let upgrade: ({ wasm_module }: { wasm_module: Uint8Array }) => Promise; let buildExtended = false; - $: buildExtended = build === 'extended'; + $: buildExtended = nonNullish(build) && build === 'extended'; let steps: 'init' | 'confirm' | 'download' | 'review' | 'in_progress' | 'ready' | 'error'; $: steps = buildExtended ? 'confirm' : 'init'; diff --git a/src/frontend/src/lib/components/modals/OrbiterCreateModal.svelte b/src/frontend/src/lib/components/modals/OrbiterCreateModal.svelte index bbcbc5e8e..64afe89c9 100644 --- a/src/frontend/src/lib/components/modals/OrbiterCreateModal.svelte +++ b/src/frontend/src/lib/components/modals/OrbiterCreateModal.svelte @@ -4,14 +4,21 @@ import { missionControlStore } from '$lib/stores/mission-control.store'; import { authSignedInStore } from '$lib/stores/auth.store'; import { toasts } from '$lib/stores/toasts.store'; - import { isNullish } from '@dfinity/utils'; + import { isNullish, nonNullish } from '@dfinity/utils'; import SpinnerModal from '$lib/components/ui/SpinnerModal.svelte'; import { i18n } from '$lib/stores/i18n.store'; import type { JunoModalDetail } from '$lib/types/modal'; import { wizardBusy } from '$lib/stores/busy.store'; import CreditsGuard from '$lib/components/guards/CreditsGuard.svelte'; - import { createOrbiter, loadOrbiters } from '$lib/services/orbiters.services'; + import { + createOrbiter, + createOrbiterWithConfig, + loadOrbiters + } from '$lib/services/orbiters.services'; import Confetti from '$lib/components/ui/Confetti.svelte'; + import type { PrincipalText } from '$lib/types/itentity'; + import CanisterAdvancedOptions from '$lib/components/canister/CanisterAdvancedOptions.svelte'; + import { Principal } from '@dfinity/principal'; export let detail: JunoModalDetail; @@ -24,8 +31,13 @@ steps = 'in_progress'; try { - await createOrbiter({ - missionControl: $missionControlStore + const fn = nonNullish(subnetId) ? createOrbiterWithConfig : createOrbiter; + + await fn({ + missionControl: $missionControlStore, + config: { + ...(nonNullish(subnetId) && { subnetId: Principal.fromText(subnetId) }) + } }); // Reload list of orbiters before navigation @@ -46,6 +58,8 @@ const dispatch = createEventDispatcher(); const close = () => dispatch('junoClose'); + + let subnetId: PrincipalText | undefined; @@ -74,6 +88,8 @@ priceLabel={$i18n.analytics.create_orbiter_price} >
+ +
diff --git a/src/frontend/src/lib/components/satellites/SatelliteOverview.svelte b/src/frontend/src/lib/components/satellites/SatelliteOverview.svelte index 07a1e1dbe..26b91c19a 100644 --- a/src/frontend/src/lib/components/satellites/SatelliteOverview.svelte +++ b/src/frontend/src/lib/components/satellites/SatelliteOverview.svelte @@ -10,6 +10,7 @@ import SatelliteOverviewVersion from '$lib/components/satellites/SatelliteOverviewVersion.svelte'; import CanisterJunoStatuses from '$lib/components/canister/CanisterJunoStatuses.svelte'; import SatelliteOverviewCustomDomain from '$lib/components/satellites/SatelliteOverviewCustomDomain.svelte'; + import CanisterSubnet from '$lib/components/canister/CanisterSubnet.svelte'; export let satellite: Satellite; @@ -29,6 +30,8 @@ + +
diff --git a/src/frontend/src/lib/components/satellites/SatelliteOverviewVersion.svelte b/src/frontend/src/lib/components/satellites/SatelliteOverviewVersion.svelte index c43f9e71b..1067f71dc 100644 --- a/src/frontend/src/lib/components/satellites/SatelliteOverviewVersion.svelte +++ b/src/frontend/src/lib/components/satellites/SatelliteOverviewVersion.svelte @@ -21,33 +21,45 @@ {#if !extended} - - {$i18n.core.version} -

v{$versionStore?.satellites[satelliteId]?.current ?? '...'}

-
+
+ + {$i18n.core.version} +

v{$versionStore?.satellites[satelliteId]?.current ?? '...'}

+
+
{:else} - - {$i18n.satellites.stock_version} -

v{$versionStore?.satellites[satelliteId]?.current ?? '...'}

-
+
+ + {$i18n.satellites.stock_version} +

v{$versionStore?.satellites[satelliteId]?.current ?? '...'}

+
+
- - {$i18n.satellites.extended_version} -

v{$versionStore?.satellites[satelliteId]?.currentBuild ?? '...'}

-
+
+ + {$i18n.satellites.extended_version} +

v{$versionStore?.satellites[satelliteId]?.currentBuild ?? '...'}

+
+
{/if} - - {$i18n.satellites.build} -

- {#if nonNullish(build)} - {build} - {/if} -

-
+
+ + {$i18n.satellites.build} +

+ {#if nonNullish(build)} + {build} + {/if} +

+
+
diff --git a/src/frontend/src/lib/components/tokens/ReceiveTokens.svelte b/src/frontend/src/lib/components/tokens/ReceiveTokens.svelte new file mode 100644 index 000000000..739927838 --- /dev/null +++ b/src/frontend/src/lib/components/tokens/ReceiveTokens.svelte @@ -0,0 +1,80 @@ + + + +
+

{$i18n.wallet.receive}

+ + {#if steps === 'wallet_id'} +
+ (steps = 'options')} + value={missionControlId.toText()} + ariaLabel={$i18n.wallet.wallet_id} + /> +
+ {:else if steps === 'account_identifier'} +
+ (steps = 'options')} + value={accountIdentifier.toHex()} + ariaLabel={$i18n.wallet.account_identifier} + /> +
+ {:else} +
+ + + + + +
+ {/if} +
+
+ + diff --git a/src/frontend/src/lib/components/tokens/ReceiveTokensQRCode.svelte b/src/frontend/src/lib/components/tokens/ReceiveTokensQRCode.svelte new file mode 100644 index 000000000..455b9f4a5 --- /dev/null +++ b/src/frontend/src/lib/components/tokens/ReceiveTokensQRCode.svelte @@ -0,0 +1,38 @@ + + +
+ + +
+ + {ariaLabel} + + +
+ + +
+ + diff --git a/src/frontend/src/lib/components/ui/Collapsible.svelte b/src/frontend/src/lib/components/ui/Collapsible.svelte new file mode 100644 index 000000000..66a6730b0 --- /dev/null +++ b/src/frontend/src/lib/components/ui/Collapsible.svelte @@ -0,0 +1,169 @@ + + +
+
handleKeyPress({ $event, callback: toggle })} + tabindex="-1" + > + + +
+
+
+ +
+
+
+ + diff --git a/src/frontend/src/lib/components/ui/Modal.svelte b/src/frontend/src/lib/components/ui/Modal.svelte index 31287258f..5d6cf0635 100644 --- a/src/frontend/src/lib/components/ui/Modal.svelte +++ b/src/frontend/src/lib/components/ui/Modal.svelte @@ -133,7 +133,7 @@ .content { position: relative; - padding: var(--modal-content-padding, 0 2.45rem); + padding: var(--modal-content-padding, 0 var(--padding-2x)); overflow: auto; height: calc(100% - 60px); diff --git a/src/frontend/src/lib/components/ui/QRCodeContainer.svelte b/src/frontend/src/lib/components/ui/QRCodeContainer.svelte index 5a92c0e34..37d74ed8b 100644 --- a/src/frontend/src/lib/components/ui/QRCodeContainer.svelte +++ b/src/frontend/src/lib/components/ui/QRCodeContainer.svelte @@ -1,14 +1,18 @@ -
-
- -
+
+
diff --git a/src/frontend/src/lib/components/upgrade/ReviewUpgradeVersion.svelte b/src/frontend/src/lib/components/upgrade/ReviewUpgradeVersion.svelte index e8dd1b377..ef0e40cfa 100644 --- a/src/frontend/src/lib/components/upgrade/ReviewUpgradeVersion.svelte +++ b/src/frontend/src/lib/components/upgrade/ReviewUpgradeVersion.svelte @@ -36,7 +36,12 @@ emit({ message: 'junoReloadVersions' }); - dispatch('junoNext', 'ready'); + // Small delay to ensure junoReloadVersions is emitted + setTimeout(() => { + dispatch('junoNext', 'ready'); + + wizardBusy.stop(); + }, 500); } catch (err: unknown) { toasts.error({ text: $i18n.errors.upgrade_error, @@ -44,9 +49,9 @@ }); dispatch('junoNext', 'error'); - } - wizardBusy.stop(); + wizardBusy.stop(); + } }; diff --git a/src/frontend/src/lib/constants/constants.ts b/src/frontend/src/lib/constants/constants.ts index ddba449b9..fe7c72599 100644 --- a/src/frontend/src/lib/constants/constants.ts +++ b/src/frontend/src/lib/constants/constants.ts @@ -45,3 +45,5 @@ export const ICP_LEDGER_CANISTER_ID = 'ryjl3-tyaaa-aaaaa-aaaba-cai'; export const REVOKED_CONTROLLERS: string[] = [ '535yc-uxytb-gfk7h-tny7p-vjkoe-i4krp-3qmcl-uqfgr-cpgej-yqtjq-rqe' ]; + +export const JUNO_SUBNET_ID = '6pbhf-qzpdk-kuqbr-pklfa-5ehhf-jfjps-zsj6q-57nrl-kzhpd-mu7hc-vae'; diff --git a/src/frontend/src/lib/env/subnets.json b/src/frontend/src/lib/env/subnets.json new file mode 100644 index 000000000..fb2354697 --- /dev/null +++ b/src/frontend/src/lib/env/subnets.json @@ -0,0 +1,53 @@ +[ + { + "subnetId": "3hhby-wmtmw-umt4t-7ieyg-bbiig-xiylg-sblrt-voxgt-bqckd-a75bf-rqe" + }, + { + "subnetId": "4ecnw-byqwz-dtgss-ua2mh-pfvs7-c3lct-gtf4e-hnu75-j7eek-iifqm-sqe" + }, + { + "subnetId": "6pbhf-qzpdk-kuqbr-pklfa-5ehhf-jfjps-zsj6q-57nrl-kzhpd-mu7hc-vae" + }, + { + "subnetId": "brlsh-zidhj-3yy3e-6vqbz-7xnih-xeq2l-as5oc-g32c4-i5pdn-2wwof-oae" + }, + { + "subnetId": "cv73p-6v7zi-u67oy-7jc3h-qspsz-g5lrj-4fn7k-xrax3-thek2-sl46v-jae" + }, + { + "subnetId": "e66qm-3cydn-nkf4i-ml4rb-4ro6o-srm5s-x5hwq-hnprz-3meqp-s7vks-5qe" + }, + { + "subnetId": "fuqsr-in2lc-zbcjj-ydmcw-pzq7h-4xm2z-pto4i-dcyee-5z4rz-x63ji-nae" + }, + { + "subnetId": "gmq5v-hbozq-uui6y-o55wc-ihop3-562wb-3qspg-nnijg-npqp5-he3cj-3ae" + }, + { + "subnetId": "jtdsg-3h6gi-hs7o5-z2soi-43w3z-soyl3-ajnp3-ekni5-sw553-5kw67-nqe" + }, + { + "subnetId": "lspz2-jx4pu-k3e7p-znm7j-q4yum-ork6e-6w4q6-pijwq-znehu-4jabe-kqe" + }, + { + "subnetId": "mpubz-g52jc-grhjo-5oze5-qcj74-sex34-omprz-ivnsm-qvvhr-rfzpv-vae" + }, + { + "subnetId": "nl6hn-ja4yw-wvmpy-3z2jx-ymc34-pisx3-3cp5z-3oj4a-qzzny-jbsv3-4qe" + }, + { + "subnetId": "o3ow2-2ipam-6fcjo-3j5vt-fzbge-2g7my-5fz2m-p4o2t-dwlc4-gt2q7-5ae" + }, + { + "subnetId": "opn46-zyspe-hhmyp-4zu6u-7sbrh-dok77-m7dch-im62f-vyimr-a3n2c-4ae" + }, + { + "subnetId": "pjljw-kztyl-46ud4-ofrj6-nzkhm-3n4nt-wi3jt-ypmav-ijqkt-gjf66-uae" + }, + { + "subnetId": "qdvhd-os4o2-zzrdw-xrcv4-gljou-eztdp-bj326-e6jgr-tkhuc-ql6v2-yqe" + }, + { + "subnetId": "yinp6-35cfo-wgcd2-oc4ty-2kqpf-t4dul-rfk33-fsq3r-mfmua-m2ngh-jqe" + } +] diff --git a/src/frontend/src/lib/i18n/en.json b/src/frontend/src/lib/i18n/en.json index 5f012b874..727f8d240 100644 --- a/src/frontend/src/lib/i18n/en.json +++ b/src/frontend/src/lib/i18n/en.json @@ -45,7 +45,9 @@ "open_website": "Open Juno website and documentation", "file": "File", "review": "Review", - "confirm": "Confirm" + "confirm": "Confirm", + "collapse": "Collapse", + "expand": "Expand" }, "canisters": { "insight": "Insight", @@ -135,7 +137,11 @@ "in_t_cycles": "in T Cycles", "no_update_required": "No settings have been modified, so the settings do not need to be updated.", "controllers": "Controllers", - "public": "Public" + "public": "Public", + "advanced_options": "Advanced Options", + "subnet": "Subnet", + "default_subnet": "Default (same as Juno)", + "subnet_id": "Subnet ID" }, "sign_in": { "quote_1": "Stars can't shine without darkness.", @@ -161,8 +167,8 @@ "satellite": "Satellite", "ready": "Your satellite is ready!", "initializing": "Initializing your new satellite...", - "start": "Let's create a new satellite", - "description": "A satellite is a Web3 container that provides a simple database, file storage, hosting, and permission management system. Develop and run your app on the web, completely on the blockchain with a low carbon footprint.", + "start": "Create a satellite", + "description": "A satellite is a Web3 container for your project. It provides features like a simple key pair store, file storage, hosting, and authentication.", "name": "Name", "satellite_name": "Satellite name", "enter_name": "Enter a name for your satellite", @@ -205,6 +211,7 @@ "export_title": "Export to CSV", "export_info": "This process exports the displayed transactions to a CSV file. Shall we proceed?", "send": "Send", + "receive": "Receive", "send_information": "Send tokens securely to any address. Your wallet currently holds {0} ICP.", "destination": "Destination", "destination_placeholder": "Enter destination address", @@ -430,7 +437,8 @@ "empty_amount": "Please enter an amount for the transfer.", "invalid_amount": "The amount should be greater than zero and less than your balance minus the fee.", "empty_balance": "Your wallet does not have any available funds.", - "sending_error": "Unexpected error(s) while sending the tokens." + "sending_error": "Unexpected error(s) while sending the tokens.", + "subnet_loading_errors": "Error while loading the subnet ID of the module." }, "document": { "owner": "Owner", diff --git a/src/frontend/src/lib/i18n/zh-cn.json b/src/frontend/src/lib/i18n/zh-cn.json index c97371177..8ef796fd1 100644 --- a/src/frontend/src/lib/i18n/zh-cn.json +++ b/src/frontend/src/lib/i18n/zh-cn.json @@ -45,7 +45,9 @@ "open_website": "打开Juno网站以及文档", "file": "文件", "review": "Review", - "confirm": "Confirm" + "confirm": "Confirm", + "collapse": "Collapse", + "expand": "Expand" }, "canisters": { "insight": "分析", @@ -135,7 +137,11 @@ "in_t_cycles": "以 T Cycles 为单位", "no_update_required": "没有设置修改, 所以没有需要更新的.", "controllers": "控制者", - "public": "公开" + "public": "公开", + "advanced_options": "Advanced Options", + "subnet": "Subnet", + "default_subnet": "Default (same as Juno)", + "subnet_id": "Subnet ID" }, "sign_in": { "quote_1": "Stars can't shine without darkness.", @@ -161,8 +167,8 @@ "satellite": "Satellite", "ready": "你的 satellite 可以使用.", "initializing": "初始化你的新的 satellite...", - "start": "让我们来创建一个新的 satellite", - "description": "satellite是一个web3容器,它为开发者提供了简化数据管理,存储以及权限管理等系统解决方案,完全运行在低能耗的区块链上.", + "start": "Create a satellite", + "description": "A satellite is a Web3 container for your project. It provides features like a simple key pair store, file storage, hosting, and authentication.", "name": "名字", "satellite_name": "Satellite 名字", "enter_name": "输入你的 satellite 名字", @@ -205,6 +211,7 @@ "export_title": "导出为 CSV", "export_info": "这个过程将导出显示的事务为 CSV 文件. 确认处理?", "send": "Send", + "receive": "Receive", "send_information": "Send tokens securely to any address. Your wallet currently holds {0} ICP.", "destination": "Destination", "destination_placeholder": "Enter destination address", @@ -430,7 +437,8 @@ "empty_amount": "Please enter an amount for the transfer.", "invalid_amount": "The amount should be greater than zero and less than your balance minus the fee.", "empty_balance": "Your wallet does not have any available funds.", - "sending_error": "Unexpected error(s) while sending the tokens." + "sending_error": "Unexpected error(s) while sending the tokens.", + "subnet_loading_errors": "Error while loading the subnet ID of the module." }, "document": { "owner": "拥有者", diff --git a/src/frontend/src/lib/services/ic.services.ts b/src/frontend/src/lib/services/ic.services.ts new file mode 100644 index 000000000..90ed94231 --- /dev/null +++ b/src/frontend/src/lib/services/ic.services.ts @@ -0,0 +1,49 @@ +import { getSubnetId } from '$lib/api/ic.api'; +import { i18n } from '$lib/stores/i18n.store'; +import { subnetsStore } from '$lib/stores/subnets.store'; +import { toasts } from '$lib/stores/toasts.store'; +import type { Principal } from '@dfinity/principal'; +import { nonNullish } from '@dfinity/utils'; +import { get } from 'svelte/store'; + +export const loadSubnetId = async ({ + canisterId, + reload = false +}: { + canisterId: Principal; + reload?: boolean; +}): Promise<{ success: boolean }> => { + const canisterIdText = canisterId.toText(); + + try { + const store = get(subnetsStore); + if (nonNullish(store[canisterIdText]) && !reload) { + return { success: true }; + } + + const subnetId = await getSubnetId({ + canisterId: canisterId.toText() + }); + + subnetsStore.setSubnets({ + canisterId: canisterIdText, + subnet: nonNullish(subnetId) ? { subnetId } : undefined + }); + + return { success: true }; + } catch (err: unknown) { + const labels = get(i18n); + + toasts.error({ + text: labels.errors.hosting_loading_errors, + detail: err + }); + + subnetsStore.setSubnets({ + canisterId: canisterIdText, + subnet: null + }); + + return { success: false }; + } +}; diff --git a/src/frontend/src/lib/services/orbiters.services.ts b/src/frontend/src/lib/services/orbiters.services.ts index 92923a9cd..86ba2603e 100644 --- a/src/frontend/src/lib/services/orbiters.services.ts +++ b/src/frontend/src/lib/services/orbiters.services.ts @@ -39,19 +39,48 @@ import { assertNonNullish, isNullish, nonNullish, toNullable } from '@dfinity/ut import { compare } from 'semver'; import { get } from 'svelte/store'; +interface CreateOrbiterConfig { + name?: string; + subnetId?: Principal; +} + export const createOrbiter = async ({ missionControl, - orbiterName + config: { name } +}: { + missionControl: Principal | undefined | null; + config: CreateOrbiterConfig; +}): Promise => { + assertNonNullish(missionControl); + + const identity = get(authStore).identity; + + const { create_orbiter } = await getMissionControlActor({ + missionControlId: missionControl, + identity + }); + return create_orbiter(toNullable(name)); +}; + +export const createOrbiterWithConfig = async ({ + missionControl, + config: { name, subnetId } }: { missionControl: Principal | undefined | null; - orbiterName?: string; + config: CreateOrbiterConfig; }): Promise => { assertNonNullish(missionControl); const identity = get(authStore).identity; - const actor = await getMissionControlActor({ missionControlId: missionControl, identity }); - return actor.create_orbiter(toNullable(orbiterName)); + const { create_orbiter_with_config } = await getMissionControlActor({ + missionControlId: missionControl, + identity + }); + return create_orbiter_with_config({ + name: toNullable(name), + subnet_id: toNullable(subnetId) + }); }; export const loadOrbiters = async ({ diff --git a/src/frontend/src/lib/services/satellites.services.ts b/src/frontend/src/lib/services/satellites.services.ts index 815287da9..f65162fb5 100644 --- a/src/frontend/src/lib/services/satellites.services.ts +++ b/src/frontend/src/lib/services/satellites.services.ts @@ -5,22 +5,51 @@ import { satellitesStore } from '$lib/stores/satellite.store'; import { toasts } from '$lib/stores/toasts.store'; import { getMissionControlActor } from '$lib/utils/actor.juno.utils'; import type { Principal } from '@dfinity/principal'; -import { assertNonNullish, isNullish, nonNullish } from '@dfinity/utils'; +import { assertNonNullish, isNullish, nonNullish, toNullable } from '@dfinity/utils'; import { get } from 'svelte/store'; +interface CreateSatelliteConfig { + name: string; + subnetId?: Principal; +} + export const createSatellite = async ({ missionControl, - satelliteName + config: { name } +}: { + missionControl: Principal | undefined | null; + config: CreateSatelliteConfig; +}): Promise => { + assertNonNullish(missionControl); + + const identity = get(authStore).identity; + + const { create_satellite } = await getMissionControlActor({ + missionControlId: missionControl, + identity + }); + return create_satellite(name); +}; + +export const createSatelliteWithConfig = async ({ + missionControl, + config: { name, subnetId } }: { missionControl: Principal | undefined | null; - satelliteName: string; + config: CreateSatelliteConfig; }): Promise => { assertNonNullish(missionControl); const identity = get(authStore).identity; - const actor = await getMissionControlActor({ missionControlId: missionControl, identity }); - return actor.create_satellite(satelliteName); + const { create_satellite_with_config } = await getMissionControlActor({ + missionControlId: missionControl, + identity + }); + return create_satellite_with_config({ + name: toNullable(name), + subnet_id: toNullable(subnetId) + }); }; export const loadSatellites = async ({ diff --git a/src/frontend/src/lib/stores/subnets.store.ts b/src/frontend/src/lib/stores/subnets.store.ts new file mode 100644 index 000000000..3ec54f04e --- /dev/null +++ b/src/frontend/src/lib/stores/subnets.store.ts @@ -0,0 +1,31 @@ +import type { PrincipalText } from '$lib/types/itentity'; +import type { Subnet } from '$lib/types/subnet'; +import { writable, type Readable } from 'svelte/store'; + +export type SubnetsData = Record; + +export interface SubnetsStore extends Readable { + setSubnets: (params: { canisterId: PrincipalText; subnet: Subnet | undefined | null }) => void; + reset: () => void; +} + +const initSubnetsStore = (): SubnetsStore => { + const INITIAL: SubnetsData = {}; + + const { subscribe, update, set } = writable(INITIAL); + + return { + subscribe, + + setSubnets({ canisterId, subnet }) { + update((state) => ({ + ...state, + [canisterId]: subnet + })); + }, + + reset: () => set(INITIAL) + }; +}; + +export const subnetsStore = initSubnetsStore(); diff --git a/src/frontend/src/lib/styles/global/input.scss b/src/frontend/src/lib/styles/global/input.scss index a2051c5bc..c5eb62635 100644 --- a/src/frontend/src/lib/styles/global/input.scss +++ b/src/frontend/src/lib/styles/global/input.scss @@ -21,6 +21,15 @@ select { } } +input, +textarea, +select { + &::placeholder { + color: var(--placeholder-color); + opacity: 1; + } +} + input[type='checkbox'], input[type='radio'] { accent-color: var(--color-primary); diff --git a/src/frontend/src/lib/styles/global/text.scss b/src/frontend/src/lib/styles/global/text.scss index c51106c53..58d97adbe 100644 --- a/src/frontend/src/lib/styles/global/text.scss +++ b/src/frontend/src/lib/styles/global/text.scss @@ -5,6 +5,8 @@ --value-color: #606060; --label-color: #c4c4c4; + --placeholder-color: rgba(var(--text-color-rgb), 0.5); + &[theme='dark'] { --text-color: #ebedf0; --text-color-rgb: 235, 237, 240; diff --git a/src/frontend/src/lib/types/i18n.d.ts b/src/frontend/src/lib/types/i18n.d.ts index b63868300..f64f38e2c 100644 --- a/src/frontend/src/lib/types/i18n.d.ts +++ b/src/frontend/src/lib/types/i18n.d.ts @@ -49,6 +49,8 @@ interface I18nCore { file: string; review: string; confirm: string; + collapse: string; + expand: string; } interface I18nCanisters { @@ -140,6 +142,10 @@ interface I18nCanisters { no_update_required: string; controllers: string; public: string; + advanced_options: string; + subnet: string; + default_subnet: string; + subnet_id: string; } interface I18nSign_in { @@ -213,6 +219,7 @@ interface I18nWallet { export_title: string; export_info: string; send: string; + receive: string; send_information: string; destination: string; destination_placeholder: string; @@ -447,6 +454,7 @@ interface I18nErrors { invalid_amount: string; empty_balance: string; sending_error: string; + subnet_loading_errors: string; } interface I18nDocument { diff --git a/src/frontend/src/lib/types/itentity.ts b/src/frontend/src/lib/types/itentity.ts index d9072aae9..4d63aff65 100644 --- a/src/frontend/src/lib/types/itentity.ts +++ b/src/frontend/src/lib/types/itentity.ts @@ -1,3 +1,5 @@ import type { Identity } from '@dfinity/agent'; export type OptionIdentity = Identity | undefined | null; + +export type PrincipalText = string; diff --git a/src/frontend/src/lib/types/subnet.ts b/src/frontend/src/lib/types/subnet.ts new file mode 100644 index 000000000..9ac136284 --- /dev/null +++ b/src/frontend/src/lib/types/subnet.ts @@ -0,0 +1,5 @@ +import type { PrincipalText } from '$lib/types/itentity'; + +export interface Subnet { + subnetId: PrincipalText; +} diff --git a/src/frontend/src/lib/utils/agent.utils.ts b/src/frontend/src/lib/utils/agent.utils.ts index f3dd1a7ee..6a1072099 100644 --- a/src/frontend/src/lib/utils/agent.utils.ts +++ b/src/frontend/src/lib/utils/agent.utils.ts @@ -12,14 +12,14 @@ export const getAgent = async (params: GetAgentParams): Promise => { }; const getMainnetAgent = async (params: GetAgentParams) => { - const host = 'https://icp0.io'; - return new HttpAgent({ ...params, host }); + const host = 'https://icp-api.io'; + return await HttpAgent.create({ ...params, host }); }; const getLocalAgent = async (params: GetAgentParams) => { const host = 'http://localhost:5987/'; - const agent: HttpAgent = new HttpAgent({ ...params, host }); + const agent: HttpAgent = await HttpAgent.create({ ...params, host }); // Fetch root key for certificate validation during development await agent.fetchRootKey(); diff --git a/src/libs/collections/Cargo.toml b/src/libs/collections/Cargo.toml index 5729eb2ac..bfa2f0bb0 100644 --- a/src/libs/collections/Cargo.toml +++ b/src/libs/collections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "junobuild-collections" -version = "0.0.4" +version = "0.0.7" authors.workspace = true edition.workspace = true repository.workspace = true @@ -19,4 +19,4 @@ ic-cdk.workspace = true ic-cdk-macros.workspace = true ic-cdk-timers.workspace = true serde.workspace = true -junobuild-shared = "0.0.18" \ No newline at end of file +junobuild-shared = "0.0.20" \ No newline at end of file diff --git a/src/libs/collections/src/assert_rules.rs b/src/libs/collections/src/assert_rules.rs index a0782861f..b0a6c8375 100644 --- a/src/libs/collections/src/assert_rules.rs +++ b/src/libs/collections/src/assert_rules.rs @@ -87,7 +87,7 @@ pub fn assert_write_permission( }, } - if collection.starts_with(|c| c == SYS_COLLECTION_PREFIX) { + if collection.starts_with(SYS_COLLECTION_PREFIX) { return Err(format!( "Collection starts with {}, a reserved prefix", SYS_COLLECTION_PREFIX @@ -105,7 +105,7 @@ pub fn assert_storage_reserved_collection( rules: &Rules, ) -> Result<(), String> { // We do not have to check system collection. - if collection.starts_with(|c| c == SYS_COLLECTION_PREFIX) { + if collection.starts_with(SYS_COLLECTION_PREFIX) { return Ok(()); } diff --git a/src/libs/satellite/Cargo.toml b/src/libs/satellite/Cargo.toml index 40aed23d0..ab727c841 100644 --- a/src/libs/satellite/Cargo.toml +++ b/src/libs/satellite/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "junobuild-satellite" -version = "0.0.20-patch.1" +version = "0.0.20-patch.3" authors.workspace = true edition.workspace = true repository.workspace = true @@ -41,7 +41,7 @@ regex.workspace = true url = "2.4.0" getrandom = { version = "0.2", features = ["custom"] } rand = { version = "0.8.5", features = ["getrandom"]} -junobuild-shared = "0.0.18" -junobuild-utils = "0.0.3" -junobuild-collections = "0.0.4" -junobuild-storage = "= 0.0.7-patch.1" \ No newline at end of file +junobuild-shared = "0.0.20" +junobuild-utils = "0.0.4" +junobuild-collections = "0.0.7" +junobuild-storage = "0.0.10" \ No newline at end of file diff --git a/src/libs/satellite/src/lib.rs b/src/libs/satellite/src/lib.rs index 34dd5eac7..b2770efaa 100644 --- a/src/libs/satellite/src/lib.rs +++ b/src/libs/satellite/src/lib.rs @@ -371,7 +371,7 @@ pub fn get_many_assets( #[doc(hidden)] #[update(guard = "caller_is_admin_controller")] pub async fn deposit_cycles(args: DepositCyclesArgs) { - junobuild_shared::ic::deposit_cycles(args) + junobuild_shared::mgmt::ic::deposit_cycles(args) .await .unwrap_or_else(|e| trap(&e)) } diff --git a/src/libs/shared/Cargo.toml b/src/libs/shared/Cargo.toml index 921c101bd..bfd4064be 100644 --- a/src/libs/shared/Cargo.toml +++ b/src/libs/shared/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "junobuild-shared" -version = "0.0.18" +version = "0.0.20" authors.workspace = true edition.workspace = true repository.workspace = true diff --git a/src/libs/shared/src/assert.rs b/src/libs/shared/src/assert.rs index 430c68bb6..7c168672c 100644 --- a/src/libs/shared/src/assert.rs +++ b/src/libs/shared/src/assert.rs @@ -16,9 +16,9 @@ use crate::types::state::Version; /// /// # Parameters /// - `user_timestamp`: An `Option` representing the user-provided timestamp. This can be `None` -/// if the user did not provide a timestamp, or `Some(u64)` if a timestamp was provided. +/// if the user did not provide a timestamp, or `Some(u64)` if a timestamp was provided. /// - `current_timestamp`: A `u64` representing the current system timestamp. This should be -/// the accurate current time in a format consistent with `user_timestamp`. +/// the accurate current time in a format consistent with `user_timestamp`. /// /// # Returns /// - `Ok(())` if the `user_timestamp` matches the `current_timestamp`. diff --git a/src/libs/shared/src/lib.rs b/src/libs/shared/src/lib.rs index 282a7dc1e..3617c41c5 100644 --- a/src/libs/shared/src/lib.rs +++ b/src/libs/shared/src/lib.rs @@ -8,11 +8,11 @@ pub mod controllers; pub mod day; #[doc(hidden)] pub mod env; -pub mod ic; #[doc(hidden)] pub mod impls; pub mod ledger; pub mod list; +pub mod mgmt; #[doc(hidden)] pub mod msg; pub mod serializers; diff --git a/src/libs/shared/src/mgmt/cmc.rs b/src/libs/shared/src/mgmt/cmc.rs new file mode 100644 index 000000000..5b78b2d1d --- /dev/null +++ b/src/libs/shared/src/mgmt/cmc.rs @@ -0,0 +1,120 @@ +use crate::constants::{ + CREATE_CANISTER_CYCLES, IC_TRANSACTION_FEE_ICP, MEMO_CANISTER_TOP_UP, WASM_MEMORY_LIMIT, +}; +use crate::env::CMC; +use crate::ledger::icp::transfer_payment; +use crate::mgmt::ic::install_code; +use crate::mgmt::types::cmc::{ + CreateCanister, CreateCanisterResult, Cycles, NotifyError, SubnetId, SubnetSelection, + TopUpCanisterArgs, +}; +use crate::mgmt::types::ic::WasmArg; +use candid::{Nat, Principal}; +use ic_cdk::api::call::{call_with_payment128, CallResult}; +use ic_cdk::api::management_canister::main::{CanisterId, CanisterInstallMode, CanisterSettings}; +use ic_cdk::call; +use ic_ledger_types::{Subaccount, Tokens}; + +pub async fn top_up_canister(canister_id: &CanisterId, amount: &Tokens) -> Result<(), String> { + // We need to hold back 1 transaction fee for the 'send' and also 1 for the 'notify' + let send_amount = Tokens::from_e8s(amount.e8s() - (2 * IC_TRANSACTION_FEE_ICP.e8s())); + + let cmc = Principal::from_text(CMC).unwrap(); + + let to_sub_account: Subaccount = convert_principal_to_sub_account(canister_id.as_slice()); + + let block_index = transfer_payment( + &cmc, + &to_sub_account, + MEMO_CANISTER_TOP_UP, + send_amount, + IC_TRANSACTION_FEE_ICP, + ) + .await + .map_err(|e| format!("failed to call ledger: {:?}", e))? + .map_err(|e| format!("ledger transfer error {:?}", e))?; + + let args = TopUpCanisterArgs { + block_index, + canister_id: *canister_id, + }; + + let result: CallResult<(Result,)> = + call(cmc, "notify_top_up", (args,)).await; + + match result { + Err((_, message)) => { + // If the topup fails in the Cmc canister, it refunds the caller. + // let was_refunded = matches!(error, NotifyError::Refunded { .. }); + Err(["Top-up failed.", &message].join(" - ")) + } + Ok(_) => Ok(()), + } +} + +fn convert_principal_to_sub_account(principal_id: &[u8]) -> Subaccount { + let mut bytes = [0u8; 32]; + bytes[0] = principal_id.len().try_into().unwrap(); + bytes[1..1 + principal_id.len()].copy_from_slice(principal_id); + Subaccount(bytes) +} + +/// Asynchronously creates a new canister and installs the provided Wasm code with additional cycles. +/// +/// # Arguments +/// - `controllers`: A list of `Principal` IDs to set as controllers of the new canister. +/// - `wasm_arg`: Wasm binary and arguments to install in the new canister (`WasmArg` struct). +/// - `cycles`: Additional cycles to deposit during canister creation on top of `CREATE_CANISTER_CYCLES`. +/// - `subnet_id`: The `SubnetId` where the canister should be created. +/// +/// # Returns +/// - `Ok(Principal)`: On success, returns the `Principal` ID of the newly created canister. +/// - `Err(String)`: On failure, returns an error message. +pub async fn cmc_create_canister_install_code( + controllers: Vec, + wasm_arg: &WasmArg, + cycles: u128, + subnet_id: &SubnetId, +) -> Result { + let cmc = Principal::from_text(CMC).unwrap(); + + let create_canister_arg = CreateCanister { + subnet_type: None, + subnet_selection: Some(SubnetSelection::Subnet { subnet: *subnet_id }), + settings: Some(CanisterSettings { + controllers: Some(controllers.clone()), + compute_allocation: None, + memory_allocation: None, + freezing_threshold: None, + reserved_cycles_limit: None, + log_visibility: None, + wasm_memory_limit: Some(Nat::from(WASM_MEMORY_LIMIT)), + }), + }; + + let result: CallResult<(CreateCanisterResult,)> = call_with_payment128( + cmc, + "create_canister", + (create_canister_arg,), + CREATE_CANISTER_CYCLES + cycles, + ) + .await; + + match result { + Err((_, message)) => Err(["Failed to call CMC to create canister.", &message].join(" - ")), + Ok((result,)) => match result { + Err(err) => Err(format!("Failed to create canister with CMC - {}", err)), + Ok(canister_id) => { + let install = + install_code(canister_id, wasm_arg, CanisterInstallMode::Install).await; + + match install { + Err(_) => { + Err("Failed to install code in canister created with CMC.".to_string()) + } + Ok(_) => Ok(canister_id), + } + } + }, + } +} diff --git a/src/libs/shared/src/ic.rs b/src/libs/shared/src/mgmt/ic.rs similarity index 99% rename from src/libs/shared/src/ic.rs rename to src/libs/shared/src/mgmt/ic.rs index 8c7196f56..4c7e2d3f0 100644 --- a/src/libs/shared/src/ic.rs +++ b/src/libs/shared/src/mgmt/ic.rs @@ -1,5 +1,5 @@ use crate::constants::{CREATE_CANISTER_CYCLES, WASM_MEMORY_LIMIT}; -use crate::types::ic::WasmArg; +use crate::mgmt::types::ic::WasmArg; use crate::types::interface::DepositCyclesArgs; use crate::types::state::{ SegmentCanisterSettings, SegmentCanisterStatus, SegmentStatus, SegmentStatusResult, @@ -69,7 +69,7 @@ pub async fn create_canister_install_code( /// /// # Returns /// - A `CallResult<()>` indicating success or failure. -async fn install_code( +pub async fn install_code( canister_id: Principal, WasmArg { wasm, install_arg }: &WasmArg, mode: CanisterInstallMode, diff --git a/src/libs/shared/src/mgmt/impls.rs b/src/libs/shared/src/mgmt/impls.rs new file mode 100644 index 000000000..858a25512 --- /dev/null +++ b/src/libs/shared/src/mgmt/impls.rs @@ -0,0 +1,16 @@ +use crate::mgmt::types::cmc::CreateCanisterError; + +impl std::fmt::Display for CreateCanisterError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Refunded { + refund_amount, + create_error, + } => write!( + f, + "The payment for the canister creation was refunded {}: {}", + refund_amount, create_error + ), + } + } +} diff --git a/src/libs/shared/src/mgmt/mod.rs b/src/libs/shared/src/mgmt/mod.rs new file mode 100644 index 000000000..2955fc740 --- /dev/null +++ b/src/libs/shared/src/mgmt/mod.rs @@ -0,0 +1,4 @@ +pub mod cmc; +pub mod ic; +mod impls; +pub mod types; diff --git a/src/libs/shared/src/mgmt/types.rs b/src/libs/shared/src/mgmt/types.rs new file mode 100644 index 000000000..c4c9da634 --- /dev/null +++ b/src/libs/shared/src/mgmt/types.rs @@ -0,0 +1,71 @@ +pub mod cmc { + use candid::{CandidType, Principal}; + use ic_cdk::api::management_canister::main::{CanisterId, CanisterSettings}; + use ic_ledger_types::BlockIndex; + use serde::Deserialize; + + pub type Cycles = u128; + + #[derive(CandidType, Deserialize)] + pub enum NotifyError { + Refunded { + reason: String, + block_index: Option, + }, + InvalidTransaction(String), + TransactionTooOld(BlockIndex), + Processing, + Other { + error_code: u64, + error_message: String, + }, + } + + #[derive(CandidType, Deserialize)] + pub struct TopUpCanisterArgs { + pub block_index: BlockIndex, + pub canister_id: Principal, + } + + #[derive(CandidType, Deserialize)] + pub enum CreateCanisterError { + Refunded { + refund_amount: u128, + create_error: String, + }, + } + + pub type CreateCanisterResult = Result; + + #[derive(CandidType, Deserialize)] + pub struct SubnetFilter { + pub subnet_type: Option, + } + + pub type SubnetId = Principal; + + #[derive(CandidType, Deserialize)] + pub enum SubnetSelection { + /// Choose a random subnet that satisfies the specified properties + Filter(SubnetFilter), + /// Choose a specific subnet + Subnet { subnet: SubnetId }, + } + + #[derive(CandidType, Deserialize)] + pub struct CreateCanister { + #[deprecated(note = "use subnet_selection instead")] + pub subnet_type: Option, + pub subnet_selection: Option, + pub settings: Option, + } +} + +pub mod ic { + use crate::types::core::Blob; + + pub struct WasmArg { + pub wasm: Blob, + pub install_arg: Vec, + } +} diff --git a/src/libs/shared/src/types.rs b/src/libs/shared/src/types.rs index 0b5dcac65..b079b8f28 100644 --- a/src/libs/shared/src/types.rs +++ b/src/libs/shared/src/types.rs @@ -96,6 +96,7 @@ pub mod state { } pub mod interface { + use crate::mgmt::types::cmc::SubnetId; use crate::types::core::Bytes; use crate::types::cronjob::CronJobStatusesSegments; use crate::types::state::{ @@ -109,6 +110,7 @@ pub mod interface { pub struct CreateCanisterArgs { pub user: UserId, pub block_index: Option, + pub subnet_id: Option, } #[derive(CandidType, Deserialize)] @@ -171,44 +173,6 @@ pub mod interface { } } -pub mod ic { - use crate::types::core::Blob; - - pub struct WasmArg { - pub wasm: Blob, - pub install_arg: Vec, - } -} - -pub mod cmc { - use candid::{CandidType, Principal}; - use ic_ledger_types::BlockIndex; - use serde::Deserialize; - - pub type Cycles = u128; - - #[derive(CandidType, Deserialize)] - pub enum NotifyError { - Refunded { - reason: String, - block_index: Option, - }, - InvalidTransaction(String), - TransactionTooOld(BlockIndex), - Processing, - Other { - error_code: u64, - error_message: String, - }, - } - - #[derive(CandidType, Deserialize)] - pub struct TopUpCanisterArgs { - pub block_index: BlockIndex, - pub canister_id: Principal, - } -} - pub mod cronjob { use crate::types::state::Metadata; use candid::{CandidType, Principal}; diff --git a/src/libs/shared/src/upgrade.rs b/src/libs/shared/src/upgrade.rs index c17fb882c..7fbbb3669 100644 --- a/src/libs/shared/src/upgrade.rs +++ b/src/libs/shared/src/upgrade.rs @@ -4,7 +4,7 @@ use ic_stable_structures::writer::Writer; use ic_stable_structures::Memory as _; use std::mem; -pub fn write_pre_upgrade(state_bytes: &Vec, memory: &mut Memory) { +pub fn write_pre_upgrade(state_bytes: &[u8], memory: &mut Memory) { // Write the length of the serialized bytes to memory, followed by the bytes themselves. let len = state_bytes.len() as u32; let mut writer = Writer::new(memory, 0); diff --git a/src/libs/storage/Cargo.toml b/src/libs/storage/Cargo.toml index 6fe633678..ec0ff9b70 100644 --- a/src/libs/storage/Cargo.toml +++ b/src/libs/storage/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "junobuild-storage" -version = "0.0.7-patch.1" +version = "0.0.10" authors.workspace = true edition.workspace = true repository.workspace = true @@ -32,5 +32,5 @@ base64 = "0.13.1" url = "2.4.0" urlencoding = "2.1.3" globset = "0.4.13" -junobuild-shared = "0.0.18" -junobuild-collections = "0.0.4" +junobuild-shared = "0.0.20" +junobuild-collections = "0.0.7" diff --git a/src/libs/storage/src/runtime.rs b/src/libs/storage/src/runtime.rs index 496f4f208..a00fc4eb8 100644 --- a/src/libs/storage/src/runtime.rs +++ b/src/libs/storage/src/runtime.rs @@ -153,7 +153,7 @@ fn clear_expired_chunks_impl(state: &mut StorageRuntimeState) { let cloned_chunks = state.chunks.clone(); for (chunk_id, chunk) in cloned_chunks.iter() { - if state.batches.get(&chunk.batch_id).is_none() { + if !state.batches.contains_key(&chunk.batch_id) { state.chunks.remove(chunk_id); } } diff --git a/src/libs/storage/src/store.rs b/src/libs/storage/src/store.rs index d80403f54..756223d5f 100644 --- a/src/libs/storage/src/store.rs +++ b/src/libs/storage/src/store.rs @@ -204,8 +204,7 @@ fn assert_key( } // Only controllers can write in reserved collections starting with # - if collection.starts_with(|c| c == SYS_COLLECTION_PREFIX) && !is_controller(caller, controllers) - { + if collection.starts_with(SYS_COLLECTION_PREFIX) && !is_controller(caller, controllers) { return Err(UPLOAD_NOT_ALLOWED); } diff --git a/src/libs/storage/src/utils.rs b/src/libs/storage/src/utils.rs index f6ddf0ed5..a1f0fe521 100644 --- a/src/libs/storage/src/utils.rs +++ b/src/libs/storage/src/utils.rs @@ -117,7 +117,7 @@ pub fn get_token_protected_asset( } pub fn should_include_asset_for_deletion(collection: &CollectionKey, asset_path: &String) -> bool { - let excluded_paths = vec![ + let excluded_paths = [ WELL_KNOWN_CUSTOM_DOMAINS.to_string(), WELL_KNOWN_II_ALTERNATIVE_ORIGINS.to_string(), ]; diff --git a/src/libs/utils/Cargo.toml b/src/libs/utils/Cargo.toml index 00bcc149e..9e9fb7c4d 100644 --- a/src/libs/utils/Cargo.toml +++ b/src/libs/utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "junobuild-utils" -version = "0.0.3" +version = "0.0.4" authors.workspace = true edition.workspace = true repository.workspace = true diff --git a/src/mission_control/Cargo.toml b/src/mission_control/Cargo.toml index b2030ec76..547b52687 100644 --- a/src/mission_control/Cargo.toml +++ b/src/mission_control/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mission_control" -version = "0.0.12" +version = "0.0.13" edition = "2021" publish = false diff --git a/src/mission_control/mission_control.did b/src/mission_control/mission_control.did index 89aaf3a12..b9fae53e5 100644 --- a/src/mission_control/mission_control.did +++ b/src/mission_control/mission_control.did @@ -8,6 +8,10 @@ type Controller = record { expires_at : opt nat64; }; type ControllerScope = variant { Write; Admin }; +type CreateCanisterConfig = record { + subnet_id : opt principal; + name : opt text; +}; type CronJobStatusesConfig = record { enabled : bool; cycles_threshold : opt nat64; @@ -103,7 +107,9 @@ service : () -> { add_mission_control_controllers : (vec principal) -> (); add_satellites_controllers : (vec principal, vec principal) -> (); create_orbiter : (opt text) -> (Orbiter); + create_orbiter_with_config : (CreateCanisterConfig) -> (Orbiter); create_satellite : (text) -> (Satellite); + create_satellite_with_config : (CreateCanisterConfig) -> (Satellite); del_mission_control_controllers : (vec principal) -> (); del_orbiter : (principal, nat) -> (); del_orbiters_controllers : (vec principal, vec principal) -> (); diff --git a/src/mission_control/src/controllers/mission_control.rs b/src/mission_control/src/controllers/mission_control.rs index 6cf5a3766..e38b0c2e6 100644 --- a/src/mission_control/src/controllers/mission_control.rs +++ b/src/mission_control/src/controllers/mission_control.rs @@ -5,7 +5,7 @@ use junobuild_shared::constants::MAX_NUMBER_OF_MISSION_CONTROL_CONTROLLERS; use junobuild_shared::controllers::{ assert_controllers, assert_max_number_of_controllers, into_controller_ids, }; -use junobuild_shared::ic::update_canister_controllers; +use junobuild_shared::mgmt::ic::update_canister_controllers; use junobuild_shared::types::interface::SetController; use junobuild_shared::types::state::{ControllerId, ControllerScope, Controllers}; diff --git a/src/mission_control/src/controllers/segment.rs b/src/mission_control/src/controllers/segment.rs index 9de30751a..b045f2799 100644 --- a/src/mission_control/src/controllers/segment.rs +++ b/src/mission_control/src/controllers/segment.rs @@ -2,7 +2,7 @@ use candid::Principal; use ic_cdk::api::call::CallResult; use ic_cdk::call; use junobuild_shared::controllers::{filter_admin_controllers, into_controller_ids}; -use junobuild_shared::ic::update_canister_controllers; +use junobuild_shared::mgmt::ic::update_canister_controllers; use junobuild_shared::types::interface::{ DeleteControllersArgs, SetController, SetControllersArgs, }; diff --git a/src/mission_control/src/guards.rs b/src/mission_control/src/guards.rs index 1d3fb6b54..3214b683a 100644 --- a/src/mission_control/src/guards.rs +++ b/src/mission_control/src/guards.rs @@ -3,7 +3,7 @@ use crate::STATE; use ic_cdk::api::is_controller as ic_canister_controller; use ic_cdk::caller; use junobuild_shared::controllers::{ - caller_is_console, caller_is_observatory, is_admin_controller, is_controller, + caller_is_console, caller_is_observatory, is_admin_controller, }; use junobuild_shared::types::state::Controllers; use junobuild_shared::utils::principal_equal; diff --git a/src/mission_control/src/lib.rs b/src/mission_control/src/lib.rs index 3cd20619f..1e304d2a8 100644 --- a/src/mission_control/src/lib.rs +++ b/src/mission_control/src/lib.rs @@ -20,13 +20,15 @@ use crate::controllers::store::get_controllers; use crate::guards::{ caller_is_user_or_admin_controller, caller_is_user_or_admin_controller_or_juno, }; -use crate::mgmt::canister::top_up_canister; use crate::mgmt::status::collect_statuses; use crate::segments::orbiter::{ - attach_orbiter, create_orbiter as create_orbiter_console, delete_orbiter, detach_orbiter, + attach_orbiter, create_orbiter as create_orbiter_console, + create_orbiter_with_config as create_orbiter_with_config_console, delete_orbiter, + detach_orbiter, }; use crate::segments::satellite::{ - attach_satellite, create_satellite as create_satellite_console, delete_satellite, + attach_satellite, create_satellite as create_satellite_console, + create_satellite_with_config as create_satellite_with_config_console, delete_satellite, detach_satellite, }; use crate::segments::store::get_orbiters; @@ -36,6 +38,7 @@ use crate::store::{ list_orbiter_statuses as list_orbiter_statuses_store, list_satellite_statuses as list_satellite_statuses_store, set_metadata as set_metadata_store, }; +use crate::types::interface::CreateCanisterConfig; use crate::types::state::{ Archive, Orbiter, Orbiters, Satellite, Satellites, StableState, State, Statuses, User, }; @@ -45,10 +48,11 @@ use ic_cdk::{id, storage, trap}; use ic_cdk_macros::{export_candid, init, post_upgrade, pre_upgrade, query, update}; use ic_ledger_types::{Tokens, TransferArgs, TransferResult}; use icrc_ledger_types::icrc1::transfer::TransferArg; -use junobuild_shared::ic::deposit_cycles as deposit_cycles_shared; use junobuild_shared::ledger::icp::transfer_token; use junobuild_shared::ledger::icrc::icrc_transfer_token; use junobuild_shared::ledger::types::icrc::IcrcTransferResult; +use junobuild_shared::mgmt::cmc::top_up_canister; +use junobuild_shared::mgmt::ic::deposit_cycles as deposit_cycles_shared; use junobuild_shared::types::interface::{ DepositCyclesArgs, MissionControlArgs, SetController, StatusesArgs, }; @@ -111,6 +115,13 @@ async fn create_satellite(name: String) -> Satellite { .unwrap_or_else(|e| trap(&e)) } +#[update(guard = "caller_is_user_or_admin_controller")] +async fn create_satellite_with_config(config: CreateCanisterConfig) -> Satellite { + create_satellite_with_config_console(&config) + .await + .unwrap_or_else(|e| trap(&e)) +} + #[update(guard = "caller_is_user_or_admin_controller")] fn set_satellite_metadata(satellite_id: SatelliteId, metadata: Metadata) -> Satellite { set_satellite_metadata_store(&satellite_id, &metadata).unwrap_or_else(|e| trap(&e)) @@ -205,6 +216,13 @@ async fn create_orbiter(name: Option) -> Orbiter { .unwrap_or_else(|e| trap(&e)) } +#[update(guard = "caller_is_user_or_admin_controller")] +async fn create_orbiter_with_config(config: CreateCanisterConfig) -> Orbiter { + create_orbiter_with_config_console(&config) + .await + .unwrap_or_else(|e| trap(&e)) +} + #[update(guard = "caller_is_user_or_admin_controller")] async fn set_orbiter(orbiter_id: OrbiterId, name: Option) -> Orbiter { attach_orbiter(&orbiter_id, &name) diff --git a/src/mission_control/src/mgmt/canister.rs b/src/mission_control/src/mgmt/canister.rs deleted file mode 100644 index f5d20fbc3..000000000 --- a/src/mission_control/src/mgmt/canister.rs +++ /dev/null @@ -1,53 +0,0 @@ -use candid::Principal; -use ic_cdk::api::call::CallResult; -use ic_cdk::api::management_canister::main::CanisterId; -use ic_cdk::call; -use ic_ledger_types::{Subaccount, Tokens}; -use junobuild_shared::constants::{IC_TRANSACTION_FEE_ICP, MEMO_CANISTER_TOP_UP}; -use junobuild_shared::env::CMC; -use junobuild_shared::ledger::icp::transfer_payment; -use junobuild_shared::types::cmc::{Cycles, NotifyError, TopUpCanisterArgs}; - -pub async fn top_up_canister(canister_id: &CanisterId, amount: &Tokens) -> Result<(), String> { - // We need to hold back 1 transaction fee for the 'send' and also 1 for the 'notify' - let send_amount = Tokens::from_e8s(amount.e8s() - (2 * IC_TRANSACTION_FEE_ICP.e8s())); - - let cmc = Principal::from_text(CMC).unwrap(); - - let to_sub_account: Subaccount = convert_principal_to_sub_account(canister_id.as_slice()); - - let block_index = transfer_payment( - &cmc, - &to_sub_account, - MEMO_CANISTER_TOP_UP, - send_amount, - IC_TRANSACTION_FEE_ICP, - ) - .await - .map_err(|e| format!("failed to call ledger: {:?}", e))? - .map_err(|e| format!("ledger transfer error {:?}", e))?; - - let args = TopUpCanisterArgs { - block_index, - canister_id: *canister_id, - }; - - let result: CallResult<(Result,)> = - call(cmc, "notify_top_up", (args,)).await; - - match result { - Err((_, message)) => { - // If the topup fails in the Cmc canister, it refunds the caller. - // let was_refunded = matches!(error, NotifyError::Refunded { .. }); - Err(["Top-up failed.", &message].join(" - ")) - } - Ok(_) => Ok(()), - } -} - -fn convert_principal_to_sub_account(principal_id: &[u8]) -> Subaccount { - let mut bytes = [0u8; 32]; - bytes[0] = principal_id.len().try_into().unwrap(); - bytes[1..1 + principal_id.len()].copy_from_slice(principal_id); - Subaccount(bytes) -} diff --git a/src/mission_control/src/mgmt/mod.rs b/src/mission_control/src/mgmt/mod.rs index 84601c639..8f5d40149 100644 --- a/src/mission_control/src/mgmt/mod.rs +++ b/src/mission_control/src/mgmt/mod.rs @@ -1,3 +1,2 @@ -pub mod canister; pub mod constants; pub mod status; diff --git a/src/mission_control/src/mgmt/status.rs b/src/mission_control/src/mgmt/status.rs index b3eb33a77..7d2bfda0a 100644 --- a/src/mission_control/src/mgmt/status.rs +++ b/src/mission_control/src/mgmt/status.rs @@ -3,7 +3,7 @@ use crate::segments::store::{get_orbiters, get_satellites}; use crate::store::{set_mission_control_status, set_orbiter_status, set_satellite_status}; use candid::Principal; use futures::future::join_all; -use junobuild_shared::ic::segment_status as ic_segment_status; +use junobuild_shared::mgmt::ic::segment_status as ic_segment_status; use junobuild_shared::types::cronjob::CronJobStatusesSegments; use junobuild_shared::types::interface::StatusesArgs; use junobuild_shared::types::state::{ diff --git a/src/mission_control/src/segments/canister.rs b/src/mission_control/src/segments/canister.rs index 7e87f6bfb..7be7a0ad1 100644 --- a/src/mission_control/src/segments/canister.rs +++ b/src/mission_control/src/segments/canister.rs @@ -1,12 +1,13 @@ use crate::store::get_user; +use crate::types::interface::CreateCanisterConfig; use candid::Principal; use ic_cdk::api::call::CallResult; use ic_cdk::{call, id}; use ic_ledger_types::{BlockIndex, Tokens}; use junobuild_shared::constants::{IC_TRANSACTION_FEE_ICP, MEMO_CANISTER_CREATE}; use junobuild_shared::env::CONSOLE; -use junobuild_shared::ic::{delete_segment, stop_segment}; use junobuild_shared::ledger::icp::{transfer_payment, SUB_ACCOUNT}; +use junobuild_shared::mgmt::ic::{delete_segment, stop_segment}; use junobuild_shared::types::interface::{DepositCyclesArgs, GetCreateCanisterFeeArgs}; use junobuild_shared::types::state::UserId; use std::future::Future; @@ -14,10 +15,10 @@ use std::future::Future; pub async fn create_canister( fee_method: &str, create_and_save: F, - name: &Option, + config: &CreateCanisterConfig, ) -> Result where - F: FnOnce(UserId, Option, Option) -> Fut, + F: FnOnce(UserId, CreateCanisterConfig, Option) -> Fut, Fut: Future>, { let console = Principal::from_text(CONSOLE).unwrap(); @@ -32,7 +33,7 @@ where Ok((fee,)) => { match fee { // If no fee provided, the creation of the satellite is probably for free - None => create_and_save(user, name.clone(), None).await, + None => create_and_save(user, config.clone(), None).await, Some(fee) => { // If a free is set, transfer the requested fee to the console let block_index = transfer_payment( @@ -46,7 +47,7 @@ where .map_err(|e| format!("failed to call ledger: {:?}", e))? .map_err(|e| format!("ledger transfer error {:?}", e))?; - create_and_save(user, name.clone(), Some(block_index)).await + create_and_save(user, config.clone(), Some(block_index)).await } } } diff --git a/src/mission_control/src/segments/orbiter.rs b/src/mission_control/src/segments/orbiter.rs index 52e3889d2..bc82420b6 100644 --- a/src/mission_control/src/segments/orbiter.rs +++ b/src/mission_control/src/segments/orbiter.rs @@ -1,6 +1,7 @@ use crate::segments::canister::{create_canister, delete_canister}; use crate::segments::msg::ORBITER_NOT_FOUND; use crate::segments::store::{add_orbiter, delete_orbiter as delete_orbiter_store, get_orbiter}; +use crate::types::interface::CreateCanisterConfig; use crate::types::state::Orbiter; use candid::Principal; use ic_cdk::api::call::CallResult; @@ -12,7 +13,16 @@ use junobuild_shared::types::state::{OrbiterId, OrbiterSatelliteConfig, Satellit use std::collections::HashMap; pub async fn create_orbiter(name: &Option) -> Result { - create_canister("get_create_orbiter_fee", create_and_save_orbiter, name).await + let config: CreateCanisterConfig = CreateCanisterConfig { + name: name.clone(), + subnet_id: None, + }; + + create_canister("get_create_orbiter_fee", create_and_save_orbiter, &config).await +} + +pub async fn create_orbiter_with_config(config: &CreateCanisterConfig) -> Result { + create_canister("get_create_orbiter_fee", create_and_save_orbiter, config).await } pub async fn attach_orbiter( @@ -63,12 +73,16 @@ pub async fn delete_orbiter(orbiter_id: &OrbiterId, cycles_to_deposit: u128) -> async fn create_and_save_orbiter( user: UserId, - name: Option, + CreateCanisterConfig { name, subnet_id }: CreateCanisterConfig, block_index: Option, ) -> Result { let console = Principal::from_text(CONSOLE).unwrap(); - let args = CreateCanisterArgs { user, block_index }; + let args = CreateCanisterArgs { + user, + block_index, + subnet_id, + }; let result: CallResult<(OrbiterId,)> = call(console, "create_orbiter", (args,)).await; diff --git a/src/mission_control/src/segments/satellite.rs b/src/mission_control/src/segments/satellite.rs index 3d3814354..e37f0d9e7 100644 --- a/src/mission_control/src/segments/satellite.rs +++ b/src/mission_control/src/segments/satellite.rs @@ -3,6 +3,7 @@ use crate::segments::msg::SATELLITE_NOT_FOUND; use crate::segments::store::{ add_satellite, delete_satellite as delete_satellite_store, get_satellite, }; +use crate::types::interface::CreateCanisterConfig; use crate::types::state::Satellite; use candid::Principal; use ic_cdk::api::call::CallResult; @@ -14,10 +15,26 @@ use junobuild_shared::types::interface::CreateCanisterArgs; use junobuild_shared::types::state::{SatelliteId, UserId}; pub async fn create_satellite(name: &str) -> Result { + let config: CreateCanisterConfig = CreateCanisterConfig { + name: Some(name.to_string()), + subnet_id: None, + }; + + create_canister( + "get_create_satellite_fee", + create_and_save_satellite, + &config, + ) + .await +} + +pub async fn create_satellite_with_config( + config: &CreateCanisterConfig, +) -> Result { create_canister( "get_create_satellite_fee", create_and_save_satellite, - &Some(name.to_string().clone()), + config, ) .await } @@ -42,12 +59,16 @@ pub async fn delete_satellite( async fn create_and_save_satellite( user: UserId, - name: Option, + CreateCanisterConfig { name, subnet_id }: CreateCanisterConfig, block_index: Option, ) -> Result { let console = Principal::from_text(CONSOLE).unwrap(); - let args = CreateCanisterArgs { user, block_index }; + let args = CreateCanisterArgs { + user, + block_index, + subnet_id, + }; let result: CallResult<(SatelliteId,)> = call(console, "create_satellite", (args,)).await; diff --git a/src/mission_control/src/types.rs b/src/mission_control/src/types.rs index 4916c495c..eaf6b3fe0 100644 --- a/src/mission_control/src/types.rs +++ b/src/mission_control/src/types.rs @@ -71,3 +71,15 @@ pub mod core { fn set_metadata(&self, metadata: &Metadata) -> Self; } } + +pub mod interface { + use candid::{CandidType, Deserialize}; + use junobuild_shared::mgmt::types::cmc::SubnetId; + use serde::Serialize; + + #[derive(CandidType, Serialize, Deserialize, Clone)] + pub struct CreateCanisterConfig { + pub name: Option, + pub subnet_id: Option, + } +} diff --git a/src/observatory/Cargo.toml b/src/observatory/Cargo.toml index d8ed700da..888e15c99 100644 --- a/src/observatory/Cargo.toml +++ b/src/observatory/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "observatory" -version = "0.0.6" +version = "0.0.7" edition = "2021" publish = false diff --git a/src/orbiter/src/assert/constraints.rs b/src/orbiter/src/assert/constraints.rs index a2e2c5581..46dd5afa5 100644 --- a/src/orbiter/src/assert/constraints.rs +++ b/src/orbiter/src/assert/constraints.rs @@ -112,7 +112,7 @@ pub fn assert_page_view_length(page_view: &SetPageView) -> Result<(), String> { Ok(()) } -fn assert_session_id_length(session_id: &String) -> Result<(), String> { +fn assert_session_id_length(session_id: &str) -> Result<(), String> { if session_id.len() > KEY_MAX_LENGTH { return Err(format!( "An analytic session ID must not be longer than {}.", diff --git a/src/orbiter/src/lib.rs b/src/orbiter/src/lib.rs index 644ac76fa..41ab6bf21 100644 --- a/src/orbiter/src/lib.rs +++ b/src/orbiter/src/lib.rs @@ -52,7 +52,7 @@ use junobuild_shared::constants::MAX_NUMBER_OF_SATELLITE_CONTROLLERS; use junobuild_shared::controllers::{ assert_controllers, assert_max_number_of_controllers, init_controllers, }; -use junobuild_shared::ic::deposit_cycles as deposit_cycles_shared; +use junobuild_shared::mgmt::ic::deposit_cycles as deposit_cycles_shared; use junobuild_shared::types::interface::{ DeleteControllersArgs, DepositCyclesArgs, MemorySize, SegmentArgs, SetControllersArgs, };