diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 14c0c7162f5..3d896e9d3d3 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -44,16 +44,19 @@ go_deps.bzl @dfinity/idx /publish/ @dfinity/idx # [Packages] -/packages/icrc-cbor/ @dfinity/finint @dfinity/cross-chain-team -/packages/icrc-ledger-agent/ @dfinity/finint -/packages/icrc-ledger-types/ @dfinity/finint -/packages/ic-ledger-hash-of/ @dfinity/finint -/packages/pocket-ic/ @dfinity/pocket-ic -/packages/ic-ethereum-types/ @dfinity/cross-chain-team -/packages/ic-metrics-assert/ @dfinity/cross-chain-team -/packages/ic-sha3/ @dfinity/crypto-team -/packages/ic-signature-verification/ @dfinity/crypto-team -/packages/ic-vetkd-utils/ @dfinity/crypto-team +/packages/icrc-cbor/ @dfinity/finint @dfinity/cross-chain-team +/packages/icrc-ledger-agent/ @dfinity/finint +/packages/icrc-ledger-types/ @dfinity/finint +/packages/ic-ledger-hash-of/ @dfinity/finint +/packages/pocket-ic/ @dfinity/pocket-ic +/packages/ic-dummy-getrandom-for-wasm/ @dfinity/crypto-team +/packages/ic-ed25519/ @dfinity/crypto-team +/packages/ic-ethereum-types/ @dfinity/cross-chain-team +/packages/ic-metrics-assert/ @dfinity/cross-chain-team +/packages/ic-secp256k1/ @dfinity/crypto-team +/packages/ic-sha3/ @dfinity/crypto-team +/packages/ic-signature-verification/ @dfinity/crypto-team +/packages/ic-vetkd-utils/ @dfinity/crypto-team # [IC-OS] /ic-os/ @dfinity/node @@ -250,6 +253,7 @@ go_deps.bzl @dfinity/idx /rs/tests/execution/ @dfinity/execution /rs/tests/financial_integrations/ @dfinity/finint /rs/tests/message_routing/ @dfinity/ic-message-routing-owners +/rs/tests/nested/ @dfinity/node /rs/tests/networking/ @dfinity/consensus /rs/tests/nns/ @dfinity/nns-team /rs/tests/node/ @dfinity/node diff --git a/.github/actions/bazel-test-all/action.yaml b/.github/actions/bazel-test-all/action.yaml index 6949952b641..39053f8e34e 100644 --- a/.github/actions/bazel-test-all/action.yaml +++ b/.github/actions/bazel-test-all/action.yaml @@ -5,20 +5,12 @@ inputs: required: true default: 'test' BAZEL_TARGETS: - required: false - default: '//...' - BAZEL_CI_CONFIG: - required: false - default: '--config=ci' - BAZEL_EXTRA_ARGS: - required: false - default: '' - BAZEL_STARTUP_ARGS: - required: false - default: '--output_base=/var/tmp/bazel-output/' + required: true BUILDEVENT_APIKEY: required: false - SSH_PRIVATE_KEY: + SSH_PRIVATE_KEY_BACKUP_POD: + required: false + GPG_PASSPHRASE: required: false runs: @@ -30,25 +22,25 @@ runs: run: | set +e # manual error handling to ensure we can run some post-build commands - if [ -n "$SSH_PRIVATE_KEY" ]; then + # freshly deployed k8s machines require ownership correctly set + if [ -e /cache ]; then + sudo chown -RL 1001:1001 /cache + fi + + if [ -n "$SSH_PRIVATE_KEY_BACKUP_POD" ]; then # The following adds the SSH private key to the ssh-agent such that CI can SSH into the backup pod. - test -z "${SSH_AUTH_SOCK:-}" && { eval "$(ssh-agent -s)"; ssh-add - <<< "${SSH_PRIVATE_KEY}"; } + test -z "${SSH_AUTH_SOCK:-}" && { eval "$(ssh-agent -s)"; ssh-add - <<< "${SSH_PRIVATE_KEY_BACKUP_POD}"; } rm -rf ~/.ssh mkdir -p ~/.ssh chmod 0700 ~/.ssh echo -e "Host *\nUser github-runner\n" > ~/.ssh/config fi - # unset honeycomb api key but use it latter for exporter + # unset honeycomb api key but use it later for exporter # TODO: remove exporter when users can use superset - KEY=${BUILDEVENT_APIKEY:-""} - unset BUILDEVENT_APIKEY - - ${GITHUB_WORKSPACE}/ci/bazel-scripts/main.sh + env -u BUILDEVENT_APIKEY ${GITHUB_WORKSPACE}/ci/bazel-scripts/main.sh BAZEL_EXIT_CODE="$?" - export BUILDEVENT_APIKEY="$KEY" - if [ -n "$BUILDEVENT_APIKEY" ] && [ -f ./bazel-bep.pb ]; then # avoid output unless an error occurs during bes export. This ensures # only the (more relevant) output from the main bazel command is shown. @@ -60,6 +52,11 @@ runs: rm "$exportout" echo "BEP events exported to honeycomb!" fi + if [ -n "$GPG_PASSPHRASE" ] && [ -f ./bazel-bep.pb ]; then + gpg --symmetric --cipher-algo AES256 -o bazel-bep.pb.gpg \ + --passphrase "$GPG_PASSPHRASE" --batch --yes bazel-bep.pb + fi + rm -f bazel-bep.pb # output node name to gihub step summary [ -n "${NODE_NAME:-}" ] && echo "Run on node: $NODE_NAME" >>$GITHUB_STEP_SUMMARY @@ -68,13 +65,11 @@ runs: env: BAZEL_COMMAND: ${{ inputs.BAZEL_COMMAND }} BAZEL_TARGETS: ${{ inputs.BAZEL_TARGETS }} - BAZEL_CI_CONFIG: ${{ inputs.BAZEL_CI_CONFIG }} - BAZEL_EXTRA_ARGS: ${{ inputs.BAZEL_EXTRA_ARGS }} - BAZEL_STARTUP_ARGS: ${{ inputs.BAZEL_STARTUP_ARGS }} BRANCH_HEAD_SHA: ${{ github.event.pull_request.head.sha }} BUILDEVENT_APIKEY: ${{ inputs.BUILDEVENT_APIKEY }} CI_EVENT_NAME: ${{ github.event_name }} CI_JOB_URL: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" CI_PULL_REQUEST_TARGET_BRANCH_NAME: ${{ github.event.pull_request.base.ref }} MERGE_BASE_SHA: ${{ github.event.pull_request.base.sha }} - SSH_PRIVATE_KEY: ${{ inputs.SSH_PRIVATE_KEY }} + SSH_PRIVATE_KEY_BACKUP_POD: ${{ inputs.SSH_PRIVATE_KEY_BACKUP_POD }} + GPG_PASSPHRASE: ${{ inputs.GPG_PASSPHRASE }} diff --git a/.github/workflows-source/ci-main.yml b/.github/workflows-source/ci-main.yml index 606ecccb20d..3a01cc36d8b 100644 --- a/.github/workflows-source/ci-main.yml +++ b/.github/workflows-source/ci-main.yml @@ -27,7 +27,6 @@ env: CI_EVENT_NAME: ${{ github.event_name }} BRANCH_NAME: ${{ github.head_ref || github.ref_name }} CI_RUN_ID: ${{ github.run_id }} - RUSTFLAGS: "--remap-path-prefix=${{ github.workspace }}=/ic" BUILDEVENT_DATASET: "github-ci-dfinity" anchors: @@ -65,15 +64,6 @@ anchors: uses: actions/setup-python@v5 with: python-version: '3.12' - bazel-upload: &bazel-upload - name: Upload bazel-targets - uses: actions/upload-artifact@v4 - with: - name: bazel-targets - retention-days: 14 - if-no-files-found: error - path: | - bazel-targets bazel-bep: &bazel-bep name: Upload bazel-bep # runs only if previous step succeeded or failed; @@ -86,7 +76,7 @@ anchors: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json jobs: @@ -94,10 +84,10 @@ jobs: name: Bazel Test All <<: *dind-large-setup runs-on: - group: ln1 + group: zh1 labels: dind-large env: - AWS_SHARED_CREDENTIALS_CONTENT: ${{ secrets.AWS_SHARED_CREDENTIALS_FILE }} + CLOUD_CREDENTIALS_CONTENT: ${{ secrets.CLOUD_CREDENTIALS_CONTENT }} # Only run ci/bazel-scripts/diff.sh on PRs that are not labeled with "CI_ALL_BAZEL_TARGETS". OVERRIDE_DIDC_CHECK: ${{ contains(github.event.pull_request.labels.*.name, 'CI_OVERRIDE_DIDC_CHECK') }} CI_OVERRIDE_BUF_BREAKING: ${{ contains(github.event.pull_request.labels.*.name, 'CI_OVERRIDE_BUF_BREAKING') }} @@ -147,29 +137,10 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - # check if PR title contains release and set timeout filters accordingly - BAZEL_EXTRA_ARGS: ${{ env.BAZEL_EXTRA_ARGS }} - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} - - <<: *bazel-bep - - <<: *bazel-upload - - bazel-build-all-config-check: - <<: *dind-large-setup - name: Bazel Build All Config Check - if: ${{ contains(github.event.pull_request.labels.*.name, 'CI_BUILD_CHECK') }} - steps: - - <<: *checkout - - <<: *before-script - - name: Run bazel build --config=check //rs/... - id: bazel-build-config-check - uses: ./.github/actions/bazel-test-all/ - with: - BAZEL_COMMAND: "build" - BAZEL_TARGETS: "//rs/..." - BAZEL_CI_CONFIG: "--config=check --config=ci --keep_going" + BAZEL_COMMAND: test --config=ci ${{ env.BAZEL_EXTRA_ARGS }} + BAZEL_TARGETS: //... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - <<: *bazel-bep bazel-test-macos-intel: @@ -195,19 +166,20 @@ jobs: id: bazel-test-darwin-x86-64 uses: ./.github/actions/bazel-test-all/ env: - AWS_SHARED_CREDENTIALS_CONTENT: ${{ secrets.AWS_SHARED_CREDENTIALS_FILE }} + CLOUD_CREDENTIALS_CONTENT: ${{ secrets.CLOUD_CREDENTIALS_CONTENT }} with: - BAZEL_CI_CONFIG: "--config=ci --config macos_ci" - BAZEL_COMMAND: test - BAZEL_EXTRA_ARGS: '--test_tag_filters=test_macos' - BAZEL_STARTUP_ARGS: "--output_base /var/tmp/bazel-output/${{ github.run_id }}" - BAZEL_TARGETS: "//rs/... //publish/binaries/..." + BAZEL_COMMAND: >- + test --config=ci --config=macos_ci + --test_tag_filters=test_macos + BAZEL_TARGETS: //rs/... //publish/binaries/... + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - <<: *bazel-bep - name: Purge Bazel Output if: always() shell: bash run: | - sudo rm -rf /private/var/tmp/bazel-output + # Clean up the output base for the next run + sudo rm -rf /var/tmp/bazel-output bazel-build-fuzzers: name: Bazel Build Fuzzers @@ -218,9 +190,10 @@ jobs: id: bazel-build-fuzzers uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "build" - BAZEL_TARGETS: "//rs/..." - BAZEL_EXTRA_ARGS: "--keep_going --config=fuzzing --build_tag_filters=libfuzzer" + BAZEL_COMMAND: >- + build --config=ci --keep_going --config=fuzzing --build_tag_filters=libfuzzer + BAZEL_TARGETS: //rs/... + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - <<: *bazel-bep bazel-build-fuzzers-afl: @@ -232,9 +205,9 @@ jobs: id: bazel-build-fuzzers-afl uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "build" - BAZEL_TARGETS: "//rs/..." - BAZEL_EXTRA_ARGS: "--keep_going --config=afl" + BAZEL_COMMAND: build --config=ci --keep_going --config=afl + BAZEL_TARGETS: //rs/... + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - <<: *bazel-bep python-ci-tests: @@ -284,7 +257,8 @@ jobs: "$CI_PROJECT_DIR"/ci/scripts/run-build-ic.sh rm -rf "/cache/job/${CI_JOB_NAME}/${CI_RUN_ID}" env: - BAZEL_COMMAND: "build" + BAZEL_COMMAND: build --config=ci + BAZEL_TARGETS: //... MERGE_BASE_SHA: ${{ github.event.pull_request.base.sha }} BRANCH_HEAD_SHA: ${{ github.event.pull_request.head.sha }} RUN_ON_DIFF_ONLY: ${{ github.event_name == 'pull_request' && !contains(github.event.pull_request.labels.*.name, 'CI_ALL_BAZEL_TARGETS') }} @@ -301,6 +275,8 @@ jobs: name: Build Determinism runs-on: ubuntu-latest timeout-minutes: 30 + # NOTE: this expects "build-ic" to have built the same set of targets + # as "bazel-test-all" needs: [build-ic, bazel-test-all] strategy: matrix: @@ -327,20 +303,14 @@ jobs: SETUPOS_FLAG: "true" steps: - <<: *checkout - - name: Download bazel-targets [bazel-test-all] - uses: actions/download-artifact@v4 - with: - name: bazel-targets - name: Download build-ic.tar [build-ic] uses: actions/download-artifact@v4 with: name: build-ic - name: Build Determinism Test id: build-determinism - shell: bash run: | - set -eExuo pipefail - sudo apt update && sudo apt install -y curl + tar -xf build-ic.tar # build-determinism.sh expects ./build-ic/ "$CI_PROJECT_DIR"/ci/scripts/build-determinism.sh env: TARGET: ${{ matrix.TARGET }} diff --git a/.github/workflows-source/ci-pr-only.yml b/.github/workflows-source/ci-pr-only.yml index 10a556e4a67..2072e4571ea 100644 --- a/.github/workflows-source/ci-pr-only.yml +++ b/.github/workflows-source/ci-pr-only.yml @@ -64,17 +64,6 @@ jobs: set -euo pipefail cd "${GITHUB_WORKSPACE}"/bin ./build-all-fuzzers.sh --zip - - name: Upload bazel-bep - if: always() - uses: actions/upload-artifact@v4 - with: - name: ${{ github.job }}-bep - retention-days: 14 - if-no-files-found: ignore - compression-level: 9 - path: | - bazel-bep.pb - profile.json lock-generate: name: Lock Generate diff --git a/.github/workflows-source/release-testing.yml b/.github/workflows-source/release-testing.yml index a2a6c2d66ff..5321929e110 100644 --- a/.github/workflows-source/release-testing.yml +++ b/.github/workflows-source/release-testing.yml @@ -18,7 +18,6 @@ env: CI_PROJECT_DIR: ${{ github.workspace }} BRANCH_NAME: ${{ github.event.workflow_run.head_branch || github.ref_name }} CI_RUN_ID: ${{ github.run_id }} - RUSTFLAGS: "--remap-path-prefix=${CI_PROJECT_DIR}=/ic" BUILDEVENT_DATASET: "github-ci-dfinity" anchors: @@ -58,7 +57,7 @@ anchors: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json jobs: @@ -77,11 +76,11 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//rs/tests/..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_tag_filters=system_test_nightly" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} + BAZEL_COMMAND: >- + test --config=ci --keep_going --test_tag_filters=system_test_nightly + BAZEL_TARGETS: //rs/tests/... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - <<: *bazel-bep bazel-system-test-staging: @@ -94,11 +93,11 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//rs/tests/..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_tag_filters=system_test_staging" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} + BAZEL_COMMAND: >- + test --config=ci --keep_going --test_tag_filters=system_test_staging + BAZEL_TARGETS: //rs/tests/... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - <<: *bazel-bep bazel-system-test-hotfix: @@ -112,11 +111,11 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//rs/tests/..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_tag_filters=system_test_hotfix" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} + BAZEL_COMMAND: >- + test --config=ci --keep_going --test_tag_filters=system_test_hotfix + BAZEL_TARGETS: //rs/tests/... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - <<: *bazel-bep dependency-scan-release-cut: @@ -185,11 +184,11 @@ jobs: - name: Run qualification for version ${{ matrix.version }} from the tip of the branch uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" + BAZEL_COMMAND: | + test --config=ci --config=systest --keep_going --test_timeout=7200 --test_env=OLD_VERSION=${{ matrix.version }} BAZEL_TARGETS: "//rs/tests/dre:guest_os_qualification" - BAZEL_CI_CONFIG: "--config=systest --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_timeout=7200 --test_env=OLD_VERSION=${{ matrix.version }}" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - <<: *bazel-bep name: Upload bazel bep for version ${{ matrix.version }} with: diff --git a/.github/workflows-source/schedule-daily.yml b/.github/workflows-source/schedule-daily.yml index a5eb842d9e4..3ff947c469d 100644 --- a/.github/workflows-source/schedule-daily.yml +++ b/.github/workflows-source/schedule-daily.yml @@ -6,7 +6,6 @@ on: workflow_dispatch: env: - BAZEL_STARTUP_ARGS: "--output_base=/var/tmp/bazel-output/" BRANCH_NAME: ${{ github.head_ref || github.ref_name }} CI_COMMIT_SHA: ${{ github.sha }} CI_JOB_NAME: ${{ github.job }} @@ -49,7 +48,7 @@ anchors: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json jobs: @@ -73,7 +72,7 @@ jobs: # Run bare metal installation test # shellcheck disable=SC2046,SC2086 - bazel ${BAZEL_STARTUP_ARGS} run ${BAZEL_CI_CONFIG} \ + bazel --output_base=/var/tmp/bazel-output run ${BAZEL_CI_CONFIG} \ //ic-os/setupos/envs/dev:launch_bare_metal -- \ --config_path "$(realpath ./ic-os/dev-tools/bare_metal_deployment/zh2-dll01.yaml)" \ --csv_filename "$(realpath file1)" \ @@ -85,7 +84,7 @@ jobs: # Run bare metal node performance benchmarks # shellcheck disable=SC2046,SC2086 - bazel ${BAZEL_STARTUP_ARGS} run ${BAZEL_CI_CONFIG} \ + bazel --output_base=/var/tmp/bazel-output run ${BAZEL_CI_CONFIG} \ //ic-os/setupos/envs/dev:launch_bare_metal -- \ --config_path "$(realpath ./ic-os/dev-tools/bare_metal_deployment/zh2-dll01.yaml)" \ --csv_filename "$(realpath file1)" \ @@ -96,8 +95,7 @@ jobs: --benchmark bazel clean env: - BAZEL_STARTUP_ARGS: "--output_base=/var/tmp/bazel-output/" - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" + BAZEL_CI_CONFIG: "--config=ci" ZH2_DLL01_CSV_SECRETS: "${{ secrets.ZH2_DLL01_CSV_SECRETS }}" ZH2_FILE_SHARE_KEY: "${{ secrets.ZH2_FILE_SHARE_KEY }}" @@ -112,12 +110,14 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//rs/ledger_suite/..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_tag_filters=fi_tests_nightly --test_env=SSH_AUTH_SOCK --test_timeout=43200" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} - SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} + BAZEL_COMMAND: >- + test + --config=ci --keep_going + --test_tag_filters=fi_tests_nightly --test_env=SSH_AUTH_SOCK --test_timeout=43200 + BAZEL_TARGETS: //rs/ledger_suite/... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + SSH_PRIVATE_KEY_BACKUP_POD: ${{ secrets.SSH_PRIVATE_KEY_BACKUP_POD }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - <<: *bazel-bep nns-tests-nightly: @@ -131,12 +131,14 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//rs/nns/..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_tag_filters=nns_tests_nightly --test_env=SSH_AUTH_SOCK --test_env=NNS_CANISTER_UPGRADE_SEQUENCE=all" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} - SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} + BAZEL_COMMAND: >- + test + --config=ci --keep_going + --test_tag_filters=nns_tests_nightly --test_env=SSH_AUTH_SOCK --test_env=NNS_CANISTER_UPGRADE_SEQUENCE=all + BAZEL_TARGETS: //rs/nns/... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + SSH_PRIVATE_KEY_BACKUP_POD: ${{ secrets.SSH_PRIVATE_KEY_BACKUP_POD }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - <<: *bazel-bep system-tests-benchmarks-nightly: @@ -155,12 +157,14 @@ jobs: id: bazel-system-test-benchmarks uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: ${{ env.BENCHMARK_TARGETS }} - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" # note: there's just one performance cluster, so the job can't be parallelized - BAZEL_EXTRA_ARGS: "--test_tag_filters=system_test_benchmark --//bazel:enable_upload_perf_systest_results=True --keep_going --jobs 1" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} + BAZEL_COMMAND: >- + test + --config=ci + --test_tag_filters=system_test_benchmark --//bazel:enable_upload_perf_systest_results=True --keep_going --jobs 1 + BAZEL_TARGETS: ${{ env.BENCHMARK_TARGETS }} + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - <<: *bazel-bep - name: Post Slack Notification uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0 diff --git a/.github/workflows-source/schedule-hourly.yml b/.github/workflows-source/schedule-hourly.yml index 0ed1834aeb2..17a7388c614 100644 --- a/.github/workflows-source/schedule-hourly.yml +++ b/.github/workflows-source/schedule-hourly.yml @@ -11,7 +11,6 @@ env: CI_JOB_NAME: ${{ github.job }} CI_PROJECT_DIR: ${{ github.workspace }} CI_RUN_ID: ${{ github.run_id }} - RUSTFLAGS: "--remap-path-prefix=${CI_PROJECT_DIR}=/ic" BUILDEVENT_DATASET: "github-ci-dfinity" anchors: @@ -48,7 +47,7 @@ anchors: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json jobs: @@ -61,11 +60,15 @@ jobs: - name: Run Bazel Build All No Cache uses: ./.github/actions/bazel-test-all/ env: - AWS_SHARED_CREDENTIALS_CONTENT: ${{ secrets.AWS_SHARED_CREDENTIALS_FILE }} + CLOUD_CREDENTIALS_CONTENT: ${{ secrets.CLOUD_CREDENTIALS_CONTENT }} with: - BAZEL_CI_CONFIG: "--config=ci" - BAZEL_COMMAND: "build" - BAZEL_EXTRA_ARGS: "--repository_cache= --disk_cache= --noremote_accept_cached --remote_instance_name=${CI_COMMIT_SHA} --@rules_rust//rust/settings:pipelined_compilation=True" + BAZEL_CI_CONFIG: "" + BAZEL_COMMAND: >- + build + --config=ci + --repository_cache= --disk_cache= --noremote_accept_cached --remote_instance_name=${CI_COMMIT_SHA} --@rules_rust//rust/settings:pipelined_compilation=True + BAZEL_TARGETS: //... + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - <<: *bazel-bep bazel-system-test-hourly: @@ -81,11 +84,11 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//rs/..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_tag_filters=system_test_hourly" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} + BAZEL_COMMAND: >- + test --config=ci --keep_going --test_tag_filters=system_test_hourly + BAZEL_TARGETS: //rs/... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - <<: *bazel-bep bazel-run-fuzzers-hourly: diff --git a/.github/workflows/ci-generate-ci.yml b/.github/workflows/ci-generate-ci.yml index 1ecf196331e..0a8494de53e 100644 --- a/.github/workflows/ci-generate-ci.yml +++ b/.github/workflows/ci-generate-ci.yml @@ -47,7 +47,7 @@ jobs: if [ -n "$(git status --porcelain)" ]; then git config --global user.name "IDX GitHub Automation" - git config --global user.email "idx@dfinity.org" + git config --global user.email "<>" git add . git commit -m "IDX GitHub Automation" git push diff --git a/.github/workflows/ci-main.yml b/.github/workflows/ci-main.yml index 1571bc3a965..ff7dc3d6525 100644 --- a/.github/workflows/ci-main.yml +++ b/.github/workflows/ci-main.yml @@ -24,7 +24,6 @@ env: CI_EVENT_NAME: ${{ github.event_name }} BRANCH_NAME: ${{ github.head_ref || github.ref_name }} CI_RUN_ID: ${{ github.run_id }} - RUSTFLAGS: "--remap-path-prefix=${{ github.workspace }}=/ic" BUILDEVENT_DATASET: "github-ci-dfinity" jobs: bazel-test-all: @@ -35,10 +34,10 @@ jobs: -e NODE_NAME --privileged --cgroupns host -v /cache:/cache -v /var/sysimage:/var/sysimage -v /var/tmp:/var/tmp -v /ceph-s3-info:/ceph-s3-info timeout-minutes: 90 runs-on: - group: ln1 + group: zh1 labels: dind-large env: - AWS_SHARED_CREDENTIALS_CONTENT: ${{ secrets.AWS_SHARED_CREDENTIALS_FILE }} + CLOUD_CREDENTIALS_CONTENT: ${{ secrets.CLOUD_CREDENTIALS_CONTENT }} # Only run ci/bazel-scripts/diff.sh on PRs that are not labeled with "CI_ALL_BAZEL_TARGETS". OVERRIDE_DIDC_CHECK: ${{ contains(github.event.pull_request.labels.*.name, 'CI_OVERRIDE_DIDC_CHECK') }} CI_OVERRIDE_BUF_BREAKING: ${{ contains(github.event.pull_request.labels.*.name, 'CI_OVERRIDE_BUF_BREAKING') }} @@ -95,12 +94,10 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - # check if PR title contains release and set timeout filters accordingly - BAZEL_EXTRA_ARGS: ${{ env.BAZEL_EXTRA_ARGS }} - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} + BAZEL_COMMAND: test --config=ci ${{ env.BAZEL_EXTRA_ARGS }} + BAZEL_TARGETS: //... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep # runs only if previous step succeeded or failed; # we avoid collecting artifacts of jobs that were cancelled @@ -112,55 +109,7 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb - profile.json - - name: Upload bazel-targets - uses: actions/upload-artifact@v4 - with: - name: bazel-targets - retention-days: 14 - if-no-files-found: error - path: | - bazel-targets - bazel-build-all-config-check: - runs-on: - labels: dind-large - container: - image: ghcr.io/dfinity/ic-build@sha256:2e8185171700872d48fdfb4b08e175fca5be27b3fbbc4d7bed681ec8486f8b1d - options: >- - -e NODE_NAME --privileged --cgroupns host -v /cache:/cache -v /var/sysimage:/var/sysimage -v /var/tmp:/var/tmp -v /ceph-s3-info:/ceph-s3-info - timeout-minutes: 90 - name: Bazel Build All Config Check - if: ${{ contains(github.event.pull_request.labels.*.name, 'CI_BUILD_CHECK') }} - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: ${{ github.event_name == 'pull_request' && 256 || 0 }} - - name: Before script - id: before-script - shell: bash - run: | - [ -n "${NODE_NAME:-}" ] && echo "Node: $NODE_NAME" - - name: Run bazel build --config=check //rs/... - id: bazel-build-config-check - uses: ./.github/actions/bazel-test-all/ - with: - BAZEL_COMMAND: "build" - BAZEL_TARGETS: "//rs/..." - BAZEL_CI_CONFIG: "--config=check --config=ci --keep_going" - - name: Upload bazel-bep - # runs only if previous step succeeded or failed; - # we avoid collecting artifacts of jobs that were cancelled - if: success() || failure() - uses: actions/upload-artifact@v4 - with: - name: ${{ github.job }}-bep - retention-days: 14 - if-no-files-found: ignore - compression-level: 9 - path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json bazel-test-macos-intel: name: Bazel Test macOS Intel @@ -187,13 +136,12 @@ jobs: id: bazel-test-darwin-x86-64 uses: ./.github/actions/bazel-test-all/ env: - AWS_SHARED_CREDENTIALS_CONTENT: ${{ secrets.AWS_SHARED_CREDENTIALS_FILE }} + CLOUD_CREDENTIALS_CONTENT: ${{ secrets.CLOUD_CREDENTIALS_CONTENT }} with: - BAZEL_CI_CONFIG: "--config=ci --config macos_ci" - BAZEL_COMMAND: test - BAZEL_EXTRA_ARGS: '--test_tag_filters=test_macos' - BAZEL_STARTUP_ARGS: "--output_base /var/tmp/bazel-output/${{ github.run_id }}" - BAZEL_TARGETS: "//rs/... //publish/binaries/..." + BAZEL_COMMAND: >- + test --config=ci --config=macos_ci --test_tag_filters=test_macos + BAZEL_TARGETS: //rs/... //publish/binaries/... + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep # runs only if previous step succeeded or failed; # we avoid collecting artifacts of jobs that were cancelled @@ -205,13 +153,14 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json - name: Purge Bazel Output if: always() shell: bash run: | - sudo rm -rf /private/var/tmp/bazel-output + # Clean up the output base for the next run + sudo rm -rf /var/tmp/bazel-output bazel-build-fuzzers: name: Bazel Build Fuzzers runs-on: @@ -230,9 +179,10 @@ jobs: id: bazel-build-fuzzers uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "build" - BAZEL_TARGETS: "//rs/..." - BAZEL_EXTRA_ARGS: "--keep_going --config=fuzzing --build_tag_filters=libfuzzer" + BAZEL_COMMAND: >- + build --config=ci --keep_going --config=fuzzing --build_tag_filters=libfuzzer + BAZEL_TARGETS: //rs/... + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep # runs only if previous step succeeded or failed; # we avoid collecting artifacts of jobs that were cancelled @@ -244,7 +194,7 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json bazel-build-fuzzers-afl: name: Bazel Build Fuzzers AFL @@ -264,9 +214,9 @@ jobs: id: bazel-build-fuzzers-afl uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "build" - BAZEL_TARGETS: "//rs/..." - BAZEL_EXTRA_ARGS: "--keep_going --config=afl" + BAZEL_COMMAND: build --config=ci --keep_going --config=afl + BAZEL_TARGETS: //rs/... + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep # runs only if previous step succeeded or failed; # we avoid collecting artifacts of jobs that were cancelled @@ -278,7 +228,7 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json python-ci-tests: name: Python CI Tests @@ -347,7 +297,8 @@ jobs: "$CI_PROJECT_DIR"/ci/scripts/run-build-ic.sh rm -rf "/cache/job/${CI_JOB_NAME}/${CI_RUN_ID}" env: - BAZEL_COMMAND: "build" + BAZEL_COMMAND: build --config=ci + BAZEL_TARGETS: //... MERGE_BASE_SHA: ${{ github.event.pull_request.base.sha }} BRANCH_HEAD_SHA: ${{ github.event.pull_request.head.sha }} RUN_ON_DIFF_ONLY: ${{ github.event_name == 'pull_request' && !contains(github.event.pull_request.labels.*.name, 'CI_ALL_BAZEL_TARGETS') }} @@ -363,6 +314,8 @@ jobs: name: Build Determinism runs-on: ubuntu-latest timeout-minutes: 30 + # NOTE: this expects "build-ic" to have built the same set of targets + # as "bazel-test-all" needs: [build-ic, bazel-test-all] strategy: matrix: @@ -392,20 +345,14 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: ${{ github.event_name == 'pull_request' && 256 || 0 }} - - name: Download bazel-targets [bazel-test-all] - uses: actions/download-artifact@v4 - with: - name: bazel-targets - name: Download build-ic.tar [build-ic] uses: actions/download-artifact@v4 with: name: build-ic - name: Build Determinism Test id: build-determinism - shell: bash run: | - set -eExuo pipefail - sudo apt update && sudo apt install -y curl + tar -xf build-ic.tar # build-determinism.sh expects ./build-ic/ "$CI_PROJECT_DIR"/ci/scripts/build-determinism.sh env: TARGET: ${{ matrix.TARGET }} diff --git a/.github/workflows/ci-pr-only.yml b/.github/workflows/ci-pr-only.yml index 870eef04fd0..91a8301c95b 100644 --- a/.github/workflows/ci-pr-only.yml +++ b/.github/workflows/ci-pr-only.yml @@ -44,17 +44,6 @@ jobs: set -euo pipefail cd "${GITHUB_WORKSPACE}"/bin ./build-all-fuzzers.sh --zip - - name: Upload bazel-bep - if: always() - uses: actions/upload-artifact@v4 - with: - name: ${{ github.job }}-bep - retention-days: 14 - if-no-files-found: ignore - compression-level: 9 - path: | - bazel-bep.pb - profile.json lock-generate: name: Lock Generate timeout-minutes: 30 diff --git a/.github/workflows/container-autobuild.yml b/.github/workflows/container-autobuild.yml index 8aadeb05755..404e6847da6 100644 --- a/.github/workflows/container-autobuild.yml +++ b/.github/workflows/container-autobuild.yml @@ -117,7 +117,7 @@ jobs: popd git config --global user.name "IDX GitHub Automation" - git config --global user.email "idx@dfinity.org" + git config --global user.email "<>" git add . git commit -m "Updating container image to ${IMAGE_SHA}" -m "Image tag: ${IMAGE_TAG}" git push diff --git a/.github/workflows/release-testing.yml b/.github/workflows/release-testing.yml index f21715b6e63..1162ae57879 100644 --- a/.github/workflows/release-testing.yml +++ b/.github/workflows/release-testing.yml @@ -15,7 +15,6 @@ env: CI_PROJECT_DIR: ${{ github.workspace }} BRANCH_NAME: ${{ github.event.workflow_run.head_branch || github.ref_name }} CI_RUN_ID: ${{ github.run_id }} - RUSTFLAGS: "--remap-path-prefix=${CI_PROJECT_DIR}=/ic" BUILDEVENT_DATASET: "github-ci-dfinity" jobs: ci-main: @@ -46,11 +45,11 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//rs/tests/..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_tag_filters=system_test_nightly" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} + BAZEL_COMMAND: >- + test --config=ci --keep_going --test_tag_filters=system_test_nightly + BAZEL_TARGETS: //rs/tests/... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep # runs only if previous step succeeded or failed; # we avoid collecting artifacts of jobs that were cancelled @@ -62,7 +61,7 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json bazel-system-test-staging: name: Bazel System Test Staging @@ -88,11 +87,11 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//rs/tests/..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_tag_filters=system_test_staging" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} + BAZEL_COMMAND: >- + test --config=ci --keep_going --test_tag_filters=system_test_staging + BAZEL_TARGETS: //rs/tests/... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep # runs only if previous step succeeded or failed; # we avoid collecting artifacts of jobs that were cancelled @@ -104,7 +103,7 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json bazel-system-test-hotfix: name: Bazel System Test Hotfix @@ -130,11 +129,11 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//rs/tests/..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_tag_filters=system_test_hotfix" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} + BAZEL_COMMAND: >- + test --config=ci --keep_going --test_tag_filters=system_test_hotfix + BAZEL_TARGETS: //rs/tests/... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep # runs only if previous step succeeded or failed; # we avoid collecting artifacts of jobs that were cancelled @@ -146,7 +145,7 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json dependency-scan-release-cut: name: Dependency Scan for Release @@ -246,11 +245,11 @@ jobs: - name: Run qualification for version ${{ matrix.version }} from the tip of the branch uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" + BAZEL_COMMAND: | + test --config=ci --config=systest --keep_going --test_timeout=7200 --test_env=OLD_VERSION=${{ matrix.version }} BAZEL_TARGETS: "//rs/tests/dre:guest_os_qualification" - BAZEL_CI_CONFIG: "--config=systest --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_timeout=7200 --test_env=OLD_VERSION=${{ matrix.version }}" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - # runs only if previous step succeeded or failed; # we avoid collecting artifacts of jobs that were cancelled if: success() || failure() @@ -261,6 +260,6 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json name: ${{ github.job }}-${{ matrix.version }}-bep diff --git a/.github/workflows/rosetta-release.yml b/.github/workflows/rosetta-release.yml index cd99e734580..207cf6aa06d 100644 --- a/.github/workflows/rosetta-release.yml +++ b/.github/workflows/rosetta-release.yml @@ -37,7 +37,7 @@ jobs: - name: Configure Git run: | git config --global user.name "IDX GitHub Automation" - git config --global user.email "idx@dfinity.org" + git config --global user.email "<>" - name: Check rosetta release version if: ${{ github.event.inputs.rosetta_release_version }} diff --git a/.github/workflows/schedule-daily.yml b/.github/workflows/schedule-daily.yml index 771bc20432e..21065b8acf3 100644 --- a/.github/workflows/schedule-daily.yml +++ b/.github/workflows/schedule-daily.yml @@ -4,7 +4,6 @@ on: - cron: "0 1 * * *" workflow_dispatch: env: - BAZEL_STARTUP_ARGS: "--output_base=/var/tmp/bazel-output/" BRANCH_NAME: ${{ github.head_ref || github.ref_name }} CI_COMMIT_SHA: ${{ github.sha }} CI_JOB_NAME: ${{ github.job }} @@ -39,7 +38,7 @@ jobs: # Run bare metal installation test # shellcheck disable=SC2046,SC2086 - bazel ${BAZEL_STARTUP_ARGS} run ${BAZEL_CI_CONFIG} \ + bazel --output_base=/var/tmp/bazel-output run ${BAZEL_CI_CONFIG} \ //ic-os/setupos/envs/dev:launch_bare_metal -- \ --config_path "$(realpath ./ic-os/dev-tools/bare_metal_deployment/zh2-dll01.yaml)" \ --csv_filename "$(realpath file1)" \ @@ -51,7 +50,7 @@ jobs: # Run bare metal node performance benchmarks # shellcheck disable=SC2046,SC2086 - bazel ${BAZEL_STARTUP_ARGS} run ${BAZEL_CI_CONFIG} \ + bazel --output_base=/var/tmp/bazel-output run ${BAZEL_CI_CONFIG} \ //ic-os/setupos/envs/dev:launch_bare_metal -- \ --config_path "$(realpath ./ic-os/dev-tools/bare_metal_deployment/zh2-dll01.yaml)" \ --csv_filename "$(realpath file1)" \ @@ -62,8 +61,7 @@ jobs: --benchmark bazel clean env: - BAZEL_STARTUP_ARGS: "--output_base=/var/tmp/bazel-output/" - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" + BAZEL_CI_CONFIG: "--config=ci" ZH2_DLL01_CSV_SECRETS: "${{ secrets.ZH2_DLL01_CSV_SECRETS }}" ZH2_FILE_SHARE_KEY: "${{ secrets.ZH2_FILE_SHARE_KEY }}" fi-tests-nightly: @@ -88,12 +86,16 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//rs/ledger_suite/..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_tag_filters=fi_tests_nightly --test_env=SSH_AUTH_SOCK --test_timeout=43200" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} - SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} + BAZEL_COMMAND: >- + test + + + --config=ci --keep_going + --test_tag_filters=fi_tests_nightly --test_env=SSH_AUTH_SOCK --test_timeout=43200 + BAZEL_TARGETS: //rs/ledger_suite/... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + SSH_PRIVATE_KEY_BACKUP_POD: ${{ secrets.SSH_PRIVATE_KEY_BACKUP_POD }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep # runs only if previous step succeeded or failed; # we avoid collecting artifacts of jobs that were cancelled @@ -105,7 +107,7 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json nns-tests-nightly: name: Bazel Test NNS Nightly @@ -129,12 +131,16 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//rs/nns/..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_tag_filters=nns_tests_nightly --test_env=SSH_AUTH_SOCK --test_env=NNS_CANISTER_UPGRADE_SEQUENCE=all" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} - SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} + BAZEL_COMMAND: >- + test + + + --config=ci --keep_going + --test_tag_filters=nns_tests_nightly --test_env=SSH_AUTH_SOCK --test_env=NNS_CANISTER_UPGRADE_SEQUENCE=all + BAZEL_TARGETS: //rs/nns/... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + SSH_PRIVATE_KEY_BACKUP_POD: ${{ secrets.SSH_PRIVATE_KEY_BACKUP_POD }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep # runs only if previous step succeeded or failed; # we avoid collecting artifacts of jobs that were cancelled @@ -146,7 +152,7 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json system-tests-benchmarks-nightly: name: Bazel System Test Benchmarks @@ -175,12 +181,16 @@ jobs: id: bazel-system-test-benchmarks uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: ${{ env.BENCHMARK_TARGETS }} - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" # note: there's just one performance cluster, so the job can't be parallelized - BAZEL_EXTRA_ARGS: "--test_tag_filters=system_test_benchmark --//bazel:enable_upload_perf_systest_results=True --keep_going --jobs 1" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} + BAZEL_COMMAND: >- + test + + + --config=ci + --test_tag_filters=system_test_benchmark --//bazel:enable_upload_perf_systest_results=True --keep_going --jobs 1 + BAZEL_TARGETS: ${{ env.BENCHMARK_TARGETS }} + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep # runs only if previous step succeeded or failed; # we avoid collecting artifacts of jobs that were cancelled @@ -192,7 +202,7 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json - name: Post Slack Notification uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0 diff --git a/.github/workflows/schedule-hourly.yml b/.github/workflows/schedule-hourly.yml index 99c579508e3..edd483b7ba6 100644 --- a/.github/workflows/schedule-hourly.yml +++ b/.github/workflows/schedule-hourly.yml @@ -9,7 +9,6 @@ env: CI_JOB_NAME: ${{ github.job }} CI_PROJECT_DIR: ${{ github.workspace }} CI_RUN_ID: ${{ github.run_id }} - RUSTFLAGS: "--remap-path-prefix=${CI_PROJECT_DIR}=/ic" BUILDEVENT_DATASET: "github-ci-dfinity" jobs: bazel-build-all-no-cache: @@ -32,11 +31,17 @@ jobs: - name: Run Bazel Build All No Cache uses: ./.github/actions/bazel-test-all/ env: - AWS_SHARED_CREDENTIALS_CONTENT: ${{ secrets.AWS_SHARED_CREDENTIALS_FILE }} + CLOUD_CREDENTIALS_CONTENT: ${{ secrets.CLOUD_CREDENTIALS_CONTENT }} with: - BAZEL_CI_CONFIG: "--config=ci" - BAZEL_COMMAND: "build" - BAZEL_EXTRA_ARGS: "--repository_cache= --disk_cache= --noremote_accept_cached --remote_instance_name=${CI_COMMIT_SHA} --@rules_rust//rust/settings:pipelined_compilation=True" + BAZEL_CI_CONFIG: "" + BAZEL_COMMAND: >- + build + + + --config=ci + --repository_cache= --disk_cache= --noremote_accept_cached --remote_instance_name=${CI_COMMIT_SHA} --@rules_rust//rust/settings:pipelined_compilation=True + BAZEL_TARGETS: //... + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep # runs only if previous step succeeded or failed; # we avoid collecting artifacts of jobs that were cancelled @@ -48,7 +53,7 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json bazel-system-test-hourly: name: Bazel System Tests Hourly @@ -72,11 +77,11 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "//rs/..." - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--keep_going --test_tag_filters=system_test_hourly" - BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_API_TOKEN }} + BAZEL_COMMAND: >- + test --config=ci --keep_going --test_tag_filters=system_test_hourly + BAZEL_TARGETS: //rs/... + BUILDEVENT_APIKEY: ${{ secrets.HONEYCOMB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep # runs only if previous step succeeded or failed; # we avoid collecting artifacts of jobs that were cancelled @@ -88,7 +93,7 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json bazel-run-fuzzers-hourly: name: Bazel Run Fuzzers Hourly diff --git a/.github/workflows/schedule-rust-bench.yml b/.github/workflows/schedule-rust-bench.yml index eb8e515e004..81f106f7e8b 100644 --- a/.github/workflows/schedule-rust-bench.yml +++ b/.github/workflows/schedule-rust-bench.yml @@ -44,10 +44,8 @@ jobs: run: | ./ci/scripts/rust-benchmarks.sh env: - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" + BAZEL_CI_CONFIG: "--config=ci" BAZEL_COMMAND: "run" - BAZEL_STARTUP_ARGS: "--output_base=/var/tmp/bazel-output/" CI_JOB_URL: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" - RUSTFLAGS: "--remap-path-prefix=${CI_PROJECT_DIR}=/ic" RUST_BACKTRACE: "full" TARGETS: ${{ matrix.targets }} diff --git a/.github/workflows/sync-public-with-private.yml b/.github/workflows/sync-public-with-private.yml index 5bbb48c2bc8..99b5365bce1 100644 --- a/.github/workflows/sync-public-with-private.yml +++ b/.github/workflows/sync-public-with-private.yml @@ -30,7 +30,7 @@ jobs: - name: Sync changes from public ic run: | git config --global user.name "IDX GitHub Automation" - git config --global user.email "idx@dfinity.org" + git config --global user.email "<>" git remote add public https://github.com/dfinity/ic.git git fetch public master diff --git a/.github/workflows/system-tests-k8s.yml b/.github/workflows/system-tests-k8s.yml index 2ac58b5cd07..00d2be94eee 100644 --- a/.github/workflows/system-tests-k8s.yml +++ b/.github/workflows/system-tests-k8s.yml @@ -8,23 +8,20 @@ name: System Tests K8s on: schedule: - - cron: "0 1 * * *" # Run at 1 AM - - cron: "0 3 * * *" # Run at 3 AM - - cron: "0 5 * * *" # Run at 5 AM - - cron: "0 7 * * *" # Run at 7 AM + - cron: "0 * * * *" pull_request: paths: - - '.github/workflows/system-tests-k8s.yml' + - ".github/workflows/system-tests-k8s.yml" workflow_dispatch: inputs: targets: - description: 'System Tests / Bazel Targets' + description: "System Tests / Bazel Targets" required: false - default: '//rs/tests/nns:node_removal_from_registry_test' + default: "//rs/tests/nns:node_removal_from_registry_test" jobs: - description: 'Concurrent Bazel Test Jobs' + description: "Concurrent Bazel Test Jobs" required: false - default: '10' + default: "10" concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -81,12 +78,14 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ env: - AWS_SHARED_CREDENTIALS_CONTENT: ${{ secrets.AWS_SHARED_CREDENTIALS_FILE }} + CLOUD_CREDENTIALS_CONTENT: ${{ secrets.CLOUD_CREDENTIALS_CONTENT }} with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "${{ env.TARGETS }}" - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--local_test_jobs=${{ env.JOBS }} --test_tag_filters=k8s,-manual,-colocated,-long_test,-system_test_hourly,-system_test_nightly --k8s" + BAZEL_COMMAND: >- + test + --config=ci + --local_test_jobs=${{ env.JOBS }} --test_tag_filters=k8s,-manual,-colocated,-long_test,-system_test_hourly,-system_test_nightly --k8s + BAZEL_TARGETS: ${{ env.TARGETS }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep uses: actions/upload-artifact@v4 @@ -97,7 +96,7 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json system-tests-k8s-hourly: @@ -112,8 +111,9 @@ jobs: --privileged --cgroupns host -v /cache:/cache -v /var/sysimage:/var/sysimage -v /var/tmp:/var/tmp timeout-minutes: 150 - # always run after 'system-tests-k8s' job only on manual dispatch and schedule - if: ${{ always() && (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') }} + #if: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} + # Disabling until we have data confirming stability of non-hourly system tests + if: ${{ false }} needs: [system-tests-k8s] steps: - name: Checkout @@ -150,12 +150,14 @@ jobs: id: bazel-test-all uses: ./.github/actions/bazel-test-all/ env: - AWS_SHARED_CREDENTIALS_CONTENT: ${{ secrets.AWS_SHARED_CREDENTIALS_FILE }} + CLOUD_CREDENTIALS_CONTENT: ${{ secrets.CLOUD_CREDENTIALS_CONTENT }} with: - BAZEL_COMMAND: "test" - BAZEL_TARGETS: "${{ env.TARGETS }}" - BAZEL_CI_CONFIG: "--config=ci --repository_cache=/cache/bazel" - BAZEL_EXTRA_ARGS: "--local_test_jobs=${{ env.JOBS }} --test_tag_filters=k8s --k8s --flaky_test_attempts=3" + BAZEL_COMMAND: >- + test + --config=ci + --local_test_jobs=${{ env.JOBS }} --test_tag_filters=k8s --k8s --flaky_test_attempts=3 + BAZEL_TARGETS: ${{ env.TARGETS }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - name: Upload bazel-bep uses: actions/upload-artifact@v4 @@ -166,5 +168,5 @@ jobs: if-no-files-found: ignore compression-level: 9 path: | - bazel-bep.pb + bazel-bep.pb.gpg profile.json diff --git a/.github/workflows/team-channels.json b/.github/workflows/team-channels.json index 8bee5dea896..bc1d8517d1a 100644 --- a/.github/workflows/team-channels.json +++ b/.github/workflows/team-channels.json @@ -1,7 +1,7 @@ { "boundary-node": "eng-boundary-nodes", - "Consensus": "eng-consensus", - "cross-chain-team": "eng-cross-chain", + "Consensus": "eng-consensus-prs", + "cross-chain-team": "eng-cross-chain-prs", "crypto-team": "eng-crypto-mr", "DRE": "eng-release-bots", "execution": "eng-execution-mrs", @@ -22,4 +22,4 @@ "runtime": "runtime-code-reviews", "sdk": "sdk", "utopia": "eng-utopia" -} \ No newline at end of file +} diff --git a/Cargo.Bazel.Fuzzing.json.lock b/Cargo.Bazel.Fuzzing.json.lock index 69b1933e477..22f67cb6b37 100644 --- a/Cargo.Bazel.Fuzzing.json.lock +++ b/Cargo.Bazel.Fuzzing.json.lock @@ -1,5 +1,5 @@ { - "checksum": "12261e4e43785de1ae9b245dee18085d41c7b97556016ba5e1b71191acea6117", + "checksum": "3e90d81def4529a311fb798a2cfa0eacb6102bdb8733d9748fafd918e14cc92a", "crates": { "abnf 0.12.0": { "name": "abnf", @@ -1332,6 +1332,143 @@ ], "license_file": "LICENSE-APACHE" }, + "aes 0.8.4": { + "name": "aes", + "version": "0.8.4", + "package_url": "https://github.com/RustCrypto/block-ciphers", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/aes/0.8.4/download", + "sha256": "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" + } + }, + "targets": [ + { + "Library": { + "crate_name": "aes", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "aes", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "cipher 0.4.4", + "target": "cipher" + } + ], + "selects": { + "cfg(any(target_arch = \"aarch64\", target_arch = \"x86_64\", target_arch = \"x86\"))": [ + { + "id": "cpufeatures 0.2.9", + "target": "cpufeatures" + } + ] + } + }, + "edition": "2021", + "version": "0.8.4" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "aes-gcm 0.10.3": { + "name": "aes-gcm", + "version": "0.10.3", + "package_url": "https://github.com/RustCrypto/AEADs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/aes-gcm/0.10.3/download", + "sha256": "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "aes_gcm", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "aes_gcm", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "aes", + "alloc", + "default", + "getrandom", + "rand_core" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "aead 0.5.2", + "target": "aead" + }, + { + "id": "aes 0.8.4", + "target": "aes" + }, + { + "id": "cipher 0.4.4", + "target": "cipher" + }, + { + "id": "ctr 0.9.2", + "target": "ctr" + }, + { + "id": "ghash 0.5.1", + "target": "ghash" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.10.3" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "ahash 0.7.8": { "name": "ahash", "version": "0.7.8", @@ -1642,7 +1779,7 @@ "target": "indexmap" }, { - "id": "schemars 0.8.16", + "id": "schemars 0.8.21", "target": "schemars" }, { @@ -2374,14 +2511,14 @@ ], "license_file": "LICENSE-APACHE" }, - "arbitrary 1.3.2": { + "arbitrary 1.4.1": { "name": "arbitrary", - "version": "1.3.2", + "version": "1.4.1", "package_url": "https://github.com/rust-fuzz/arbitrary/", "repository": { "Http": { - "url": "https://static.crates.io/crates/arbitrary/1.3.2/download", - "sha256": "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + "url": "https://static.crates.io/crates/arbitrary/1.4.1/download", + "sha256": "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" } }, "targets": [ @@ -2414,13 +2551,13 @@ "proc_macro_deps": { "common": [ { - "id": "derive_arbitrary 1.3.2", + "id": "derive_arbitrary 1.4.1", "target": "derive_arbitrary" } ], "selects": {} }, - "version": "1.3.2" + "version": "1.4.1" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -2468,6 +2605,71 @@ ], "license_file": "LICENSE-APACHE" }, + "argon2 0.4.1": { + "name": "argon2", + "version": "0.4.1", + "package_url": "https://github.com/RustCrypto/password-hashes/tree/master/argon2", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/argon2/0.4.1/download", + "sha256": "db4ce4441f99dbd377ca8a8f57b698c44d0d6e712d8329b5040da5a64aa1ce73" + } + }, + "targets": [ + { + "Library": { + "crate_name": "argon2", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "argon2", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "default", + "password-hash", + "rand" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "base64ct 1.6.0", + "target": "base64ct" + }, + { + "id": "blake2 0.10.6", + "target": "blake2" + }, + { + "id": "password-hash 0.4.2", + "target": "password_hash" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "arrayvec 0.5.2": { "name": "arrayvec", "version": "0.5.2", @@ -5497,6 +5699,51 @@ ], "license_file": "LICENSE-CC0" }, + "base16ct 0.1.1": { + "name": "base16ct", + "version": "0.1.1", + "package_url": "https://github.com/RustCrypto/formats/tree/master/base16ct", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/base16ct/0.1.1/download", + "sha256": "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + } + }, + "targets": [ + { + "Library": { + "crate_name": "base16ct", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "base16ct", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc" + ], + "selects": {} + }, + "edition": "2021", + "version": "0.1.1" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "base16ct 0.2.0": { "name": "base16ct", "version": "0.2.0", @@ -6577,6 +6824,104 @@ ], "license_file": null }, + "bip32 0.4.0": { + "name": "bip32", + "version": "0.4.0", + "package_url": "https://github.com/iqlusioninc/crates/tree/main/bip32", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/bip32/0.4.0/download", + "sha256": "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "bip32", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "bip32", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "bip39", + "default", + "k256", + "mnemonic", + "once_cell", + "pbkdf2", + "secp256k1", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "bs58 0.4.0", + "target": "bs58" + }, + { + "id": "hmac 0.12.1", + "target": "hmac" + }, + { + "id": "k256 0.11.6", + "target": "k256" + }, + { + "id": "once_cell 1.19.0", + "target": "once_cell" + }, + { + "id": "pbkdf2 0.11.0", + "target": "pbkdf2" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + }, + { + "id": "ripemd 0.1.3", + "target": "ripemd" + }, + { + "id": "sha2 0.10.8", + "target": "sha2" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.0" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "bip32 0.5.1": { "name": "bip32", "version": "0.5.1", @@ -7957,6 +8302,54 @@ ], "license_file": "LICENSE.txt" }, + "blake2 0.10.6": { + "name": "blake2", + "version": "0.10.6", + "package_url": "https://github.com/RustCrypto/hashes", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/blake2/0.10.6/download", + "sha256": "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" + } + }, + "targets": [ + { + "Library": { + "crate_name": "blake2", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "blake2", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "digest 0.10.7", + "target": "digest" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.10.6" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "block-buffer 0.9.0": { "name": "block-buffer", "version": "0.9.0", @@ -8566,6 +8959,61 @@ ], "license_file": "LICENSE" }, + "bs58 0.4.0": { + "name": "bs58", + "version": "0.4.0", + "package_url": "https://github.com/mycorrhiza/bs58-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/bs58/0.4.0/download", + "sha256": "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "bs58", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "bs58", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "check", + "sha2" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "sha2 0.9.9", + "target": "sha2" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.4.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "bs58 0.5.0": { "name": "bs58", "version": "0.5.0", @@ -10119,14 +10567,14 @@ ], "license_file": "LICENSE-APACHE" }, - "canbench 0.1.8": { + "canbench 0.1.9": { "name": "canbench", - "version": "0.1.8", + "version": "0.1.9", "package_url": "https://github.com/dfinity/canbench", "repository": { "Http": { - "url": "https://static.crates.io/crates/canbench/0.1.8/download", - "sha256": "cb548f9e006ad29b160d37e07435c499af7d2741918e18d95ddc87dfe97a0b8d" + "url": "https://static.crates.io/crates/canbench/0.1.9/download", + "sha256": "c3eba78c84aa78e67f27c5c5a7d6c3d33cc301f95886171748e8f6ed8a31b258" } }, "targets": [ @@ -10163,7 +10611,7 @@ "deps": { "common": [ { - "id": "canbench-rs 0.1.8", + "id": "canbench-rs 0.1.9", "target": "canbench_rs" }, { @@ -10222,7 +10670,7 @@ "selects": {} }, "edition": "2021", - "version": "0.1.8" + "version": "0.1.9" }, "license": "Apache-2.0", "license_ids": [ @@ -10230,14 +10678,14 @@ ], "license_file": null }, - "canbench-rs 0.1.8": { + "canbench-rs 0.1.9": { "name": "canbench-rs", - "version": "0.1.8", + "version": "0.1.9", "package_url": "https://github.com/dfinity/canbench", "repository": { "Http": { - "url": "https://static.crates.io/crates/canbench-rs/0.1.8/download", - "sha256": "497d900e11ab1891dd9743dd45dbeaada540ce323aa1adc7fc0ce1da2c6e86ff" + "url": "https://static.crates.io/crates/canbench-rs/0.1.9/download", + "sha256": "588701e2d05679b79603acca6a6f8b78fe0d21f5f7a9c06fe689f769ae797008" } }, "targets": [ @@ -10280,13 +10728,13 @@ "proc_macro_deps": { "common": [ { - "id": "canbench-rs-macros 0.1.8", + "id": "canbench-rs-macros 0.1.9", "target": "canbench_rs_macros" } ], "selects": {} }, - "version": "0.1.8" + "version": "0.1.9" }, "license": "Apache-2.0", "license_ids": [ @@ -10294,14 +10742,14 @@ ], "license_file": null }, - "canbench-rs-macros 0.1.8": { + "canbench-rs-macros 0.1.9": { "name": "canbench-rs-macros", - "version": "0.1.8", + "version": "0.1.9", "package_url": "https://github.com/dfinity/canbench", "repository": { "Http": { - "url": "https://static.crates.io/crates/canbench-rs-macros/0.1.8/download", - "sha256": "5a5509bcfe6eeb86f057d46fbf20a2ba6b6bf9a1099b053a8f491cd7a909dfa6" + "url": "https://static.crates.io/crates/canbench-rs-macros/0.1.9/download", + "sha256": "e05fe21a7dfc85c3be8e40edbbcb3fe23b4c070fac4741eff18129f1d0f11aa9" } }, "targets": [ @@ -10341,7 +10789,7 @@ "selects": {} }, "edition": "2021", - "version": "0.1.8" + "version": "0.1.9" }, "license": "Apache-2.0", "license_ids": [ @@ -12967,7 +13415,7 @@ "Git": { "remote": "https://github.com/dfinity/cloudflare-rs.git", "commitish": { - "Rev": "a6538a036926bd756986c9c0a5de356daef48881" + "Rev": "8b011d170d9d61eaad77bb9645371f6219285104" }, "strip_prefix": "cloudflare" } @@ -13690,6 +14138,7 @@ "crate_features": { "common": [ "ansi-parsing", + "default", "unicode-width" ], "selects": {} @@ -14133,6 +14582,65 @@ ], "license_file": "LICENSE-APACHE" }, + "core-foundation 0.10.0": { + "name": "core-foundation", + "version": "0.10.0", + "package_url": "https://github.com/servo/core-foundation-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/core-foundation/0.10.0/download", + "sha256": "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" + } + }, + "targets": [ + { + "Library": { + "crate_name": "core_foundation", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "core_foundation", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "link" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "core-foundation-sys 0.8.7", + "target": "core_foundation_sys" + }, + { + "id": "libc 0.2.158", + "target": "libc" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.10.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "core-foundation-sys 0.8.7": { "name": "core-foundation-sys", "version": "0.8.7", @@ -14422,14 +14930,14 @@ ], "license_file": "LICENSE-APACHE" }, - "cranelift-bforest 0.115.0": { + "cranelift-bforest 0.116.1": { "name": "cranelift-bforest", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-bforest/0.115.0/download", - "sha256": "ac89549be94911dd0e839b4a7db99e9ed29c17517e1c026f61066884c168aa3c" + "url": "https://static.crates.io/crates/cranelift-bforest/0.116.1/download", + "sha256": "e15d04a0ce86cb36ead88ad68cf693ffd6cda47052b9e0ac114bc47fd9cd23c4" } }, "targets": [ @@ -14454,14 +14962,14 @@ "deps": { "common": [ { - "id": "cranelift-entity 0.115.0", + "id": "cranelift-entity 0.116.1", "target": "cranelift_entity" } ], "selects": {} }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14469,14 +14977,14 @@ ], "license_file": "LICENSE" }, - "cranelift-bitset 0.115.0": { + "cranelift-bitset 0.116.1": { "name": "cranelift-bitset", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-bitset/0.115.0/download", - "sha256": "b9bd49369f76c77e34e641af85d0956869237832c118964d08bf5f51f210875a" + "url": "https://static.crates.io/crates/cranelift-bitset/0.116.1/download", + "sha256": "7c6e3969a7ce267259ce244b7867c5d3bc9e65b0a87e81039588dfdeaede9f34" } }, "targets": [ @@ -14523,7 +15031,7 @@ ], "selects": {} }, - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14531,14 +15039,14 @@ ], "license_file": null }, - "cranelift-codegen 0.115.0": { + "cranelift-codegen 0.116.1": { "name": "cranelift-codegen", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-codegen/0.115.0/download", - "sha256": "fd96ce9cf8efebd7f5ab8ced5a0ce44250280bbae9f593d74a6d7effc3582a35" + "url": "https://static.crates.io/crates/cranelift-codegen/0.116.1/download", + "sha256": "2c22032c4cb42558371cf516bb47f26cdad1819d3475c133e93c49f50ebf304e" } }, "targets": [ @@ -14589,27 +15097,27 @@ "target": "bumpalo" }, { - "id": "cranelift-bforest 0.115.0", + "id": "cranelift-bforest 0.116.1", "target": "cranelift_bforest" }, { - "id": "cranelift-bitset 0.115.0", + "id": "cranelift-bitset 0.116.1", "target": "cranelift_bitset" }, { - "id": "cranelift-codegen 0.115.0", + "id": "cranelift-codegen 0.116.1", "target": "build_script_build" }, { - "id": "cranelift-codegen-shared 0.115.0", + "id": "cranelift-codegen-shared 0.116.1", "target": "cranelift_codegen_shared" }, { - "id": "cranelift-control 0.115.0", + "id": "cranelift-control 0.116.1", "target": "cranelift_control" }, { - "id": "cranelift-entity 0.115.0", + "id": "cranelift-entity 0.116.1", "target": "cranelift_entity" }, { @@ -14637,14 +15145,14 @@ "target": "smallvec" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" } ], "selects": {} }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -14656,11 +15164,11 @@ "deps": { "common": [ { - "id": "cranelift-codegen-meta 0.115.0", + "id": "cranelift-codegen-meta 0.116.1", "target": "cranelift_codegen_meta" }, { - "id": "cranelift-isle 0.115.0", + "id": "cranelift-isle 0.116.1", "target": "cranelift_isle" } ], @@ -14673,14 +15181,14 @@ ], "license_file": "LICENSE" }, - "cranelift-codegen-meta 0.115.0": { + "cranelift-codegen-meta 0.116.1": { "name": "cranelift-codegen-meta", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-codegen-meta/0.115.0/download", - "sha256": "5a68e358827afe4bfb6239fcbf6fbd5ac56206ece8a99c8f5f9bbd518773281a", + "url": "https://static.crates.io/crates/cranelift-codegen-meta/0.116.1/download", + "sha256": "c904bc71c61b27fc57827f4a1379f29de64fe95653b620a3db77d59655eee0b8", "patch_args": [ "-p4" ], @@ -14711,14 +15219,14 @@ "deps": { "common": [ { - "id": "cranelift-codegen-shared 0.115.0", + "id": "cranelift-codegen-shared 0.116.1", "target": "cranelift_codegen_shared" } ], "selects": {} }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14726,14 +15234,14 @@ ], "license_file": "LICENSE" }, - "cranelift-codegen-shared 0.115.0": { + "cranelift-codegen-shared 0.116.1": { "name": "cranelift-codegen-shared", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-codegen-shared/0.115.0/download", - "sha256": "e184c9767afbe73d50c55ec29abcf4c32f9baf0d9d22b86d58c4d55e06dee181" + "url": "https://static.crates.io/crates/cranelift-codegen-shared/0.116.1/download", + "sha256": "40180f5497572f644ce88c255480981ae2ec1d7bb4d8e0c0136a13b87a2f2ceb" } }, "targets": [ @@ -14756,7 +15264,7 @@ "**" ], "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14764,14 +15272,14 @@ ], "license_file": "LICENSE" }, - "cranelift-control 0.115.0": { + "cranelift-control 0.116.1": { "name": "cranelift-control", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-control/0.115.0/download", - "sha256": "5cc7664f2a66f053e33f149e952bb5971d138e3af637f5097727ed6dc0ed95dd" + "url": "https://static.crates.io/crates/cranelift-control/0.116.1/download", + "sha256": "26d132c6d0bd8a489563472afc171759da0707804a65ece7ceb15a8c6d7dd5ef" } }, "targets": [ @@ -14803,14 +15311,14 @@ "deps": { "common": [ { - "id": "arbitrary 1.3.2", + "id": "arbitrary 1.4.1", "target": "arbitrary" } ], "selects": {} }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14818,14 +15326,14 @@ ], "license_file": "LICENSE" }, - "cranelift-entity 0.115.0": { + "cranelift-entity 0.116.1": { "name": "cranelift-entity", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-entity/0.115.0/download", - "sha256": "118597e3a9cf86c3556fa579a7a23b955fa18231651a52a77a2475d305a9cf84" + "url": "https://static.crates.io/crates/cranelift-entity/0.116.1/download", + "sha256": "4b2d0d9618275474fbf679dd018ac6e009acbd6ae6850f6a67be33fb3b00b323" } }, "targets": [ @@ -14858,7 +15366,7 @@ "deps": { "common": [ { - "id": "cranelift-bitset 0.115.0", + "id": "cranelift-bitset 0.116.1", "target": "cranelift_bitset" }, { @@ -14878,7 +15386,7 @@ ], "selects": {} }, - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14886,14 +15394,14 @@ ], "license_file": "LICENSE" }, - "cranelift-frontend 0.115.0": { + "cranelift-frontend 0.116.1": { "name": "cranelift-frontend", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-frontend/0.115.0/download", - "sha256": "7638ea1efb069a0aa18d8ee67401b6b0d19f6bfe5de5e9ede348bfc80bb0d8c7" + "url": "https://static.crates.io/crates/cranelift-frontend/0.116.1/download", + "sha256": "4fac41e16729107393174b0c9e3730fb072866100e1e64e80a1a963b2e484d57" } }, "targets": [ @@ -14925,7 +15433,7 @@ "deps": { "common": [ { - "id": "cranelift-codegen 0.115.0", + "id": "cranelift-codegen 0.116.1", "target": "cranelift_codegen" }, { @@ -14937,14 +15445,14 @@ "target": "smallvec" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" } ], "selects": {} }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14952,14 +15460,14 @@ ], "license_file": "LICENSE" }, - "cranelift-isle 0.115.0": { + "cranelift-isle 0.116.1": { "name": "cranelift-isle", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime/tree/main/cranelift/isle", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-isle/0.115.0/download", - "sha256": "15c53e1152a0b01c4ed2b1e0535602b8e86458777dd9d18b28732b16325c7dc0", + "url": "https://static.crates.io/crates/cranelift-isle/0.116.1/download", + "sha256": "1ca20d576e5070044d0a72a9effc2deacf4d6aa650403189d8ea50126483944d", "patch_args": [ "-p4" ], @@ -15008,14 +15516,14 @@ "deps": { "common": [ { - "id": "cranelift-isle 0.115.0", + "id": "cranelift-isle 0.116.1", "target": "build_script_build" } ], "selects": {} }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -15031,14 +15539,14 @@ ], "license_file": null }, - "cranelift-native 0.115.0": { + "cranelift-native 0.116.1": { "name": "cranelift-native", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-native/0.115.0/download", - "sha256": "7b7d8f895444fa52dd7bdd0bed11bf007a7fb43af65a6deac8fcc4094c6372f7" + "url": "https://static.crates.io/crates/cranelift-native/0.116.1/download", + "sha256": "b8dee82f3f1f2c4cba9177f1cc5e350fe98764379bcd29340caa7b01f85076c7" } }, "targets": [ @@ -15070,11 +15578,11 @@ "deps": { "common": [ { - "id": "cranelift-codegen 0.115.0", + "id": "cranelift-codegen 0.116.1", "target": "cranelift_codegen" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" } ], @@ -15088,7 +15596,7 @@ } }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -16304,6 +16812,74 @@ ], "license_file": null }, + "crypto-bigint 0.4.9": { + "name": "crypto-bigint", + "version": "0.4.9", + "package_url": "https://github.com/RustCrypto/crypto-bigint", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/crypto-bigint/0.4.9/download", + "sha256": "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" + } + }, + "targets": [ + { + "Library": { + "crate_name": "crypto_bigint", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "crypto_bigint", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "generic-array", + "rand_core", + "zeroize" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "generic-array 0.14.7", + "target": "generic_array" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.9" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "crypto-bigint 0.5.3": { "name": "crypto-bigint", "version": "0.5.3", @@ -16669,6 +17245,54 @@ ], "license_file": "LICENSE-MIT" }, + "ctr 0.9.2": { + "name": "ctr", + "version": "0.9.2", + "package_url": "https://github.com/RustCrypto/block-modes", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/ctr/0.9.2/download", + "sha256": "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" + } + }, + "targets": [ + { + "Library": { + "crate_name": "ctr", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "ctr", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cipher 0.4.4", + "target": "cipher" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.9.2" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "ctrlc 3.4.5": { "name": "ctrlc", "version": "3.4.5", @@ -17647,6 +18271,141 @@ ], "license_file": "LICENSE" }, + "dbus 0.9.7": { + "name": "dbus", + "version": "0.9.7", + "package_url": "https://github.com/diwic/dbus-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/dbus/0.9.7/download", + "sha256": "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "dbus", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "dbus", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "vendored" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "libc 0.2.158", + "target": "libc" + }, + { + "id": "libdbus-sys 0.2.5", + "target": "libdbus_sys" + } + ], + "selects": { + "cfg(windows)": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } + }, + "edition": "2018", + "version": "0.9.7" + }, + "license": "Apache-2.0/MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "dbus-secret-service 4.0.3": { + "name": "dbus-secret-service", + "version": "4.0.3", + "package_url": "https://github.com/brotskydotcom/dbus-secret-service.git", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/dbus-secret-service/4.0.3/download", + "sha256": "b42a16374481d92aed73ae45b1f120207d8e71d24fb89f357fadbd8f946fd84b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "dbus_secret_service", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "dbus_secret_service", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "vendored" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "dbus 0.9.7", + "target": "dbus" + }, + { + "id": "futures-util 0.3.31", + "target": "futures_util" + }, + { + "id": "num 0.4.3", + "target": "num" + }, + { + "id": "once_cell 1.19.0", + "target": "once_cell" + }, + { + "id": "rand 0.8.5", + "target": "rand" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "4.0.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "debugid 0.8.0": { "name": "debugid", "version": "0.8.0", @@ -17694,6 +18453,74 @@ ], "license_file": "LICENSE" }, + "der 0.6.1": { + "name": "der", + "version": "0.6.1", + "package_url": "https://github.com/RustCrypto/formats/tree/master/der", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/der/0.6.1/download", + "sha256": "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" + } + }, + "targets": [ + { + "Library": { + "crate_name": "der", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "der", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "const-oid", + "oid", + "pem", + "pem-rfc7468", + "std", + "zeroize" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "const-oid 0.9.5", + "target": "const_oid" + }, + { + "id": "pem-rfc7468 0.6.0", + "target": "pem_rfc7468" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.6.1" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "der 0.7.8": { "name": "der", "version": "0.7.8", @@ -17946,6 +18773,7 @@ "common": [ "alloc", "powerfmt", + "serde", "std" ], "selects": {} @@ -17955,6 +18783,10 @@ { "id": "powerfmt 0.2.0", "target": "powerfmt" + }, + { + "id": "serde 1.0.217", + "target": "serde" } ], "selects": {} @@ -18031,14 +18863,14 @@ ], "license_file": "LICENSE" }, - "derive_arbitrary 1.3.2": { + "derive_arbitrary 1.4.1": { "name": "derive_arbitrary", - "version": "1.3.2", + "version": "1.4.1", "package_url": "https://github.com/rust-fuzz/arbitrary", "repository": { "Http": { - "url": "https://static.crates.io/crates/derive_arbitrary/1.3.2/download", - "sha256": "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" + "url": "https://static.crates.io/crates/derive_arbitrary/1.4.1/download", + "sha256": "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" } }, "targets": [ @@ -18078,7 +18910,7 @@ "selects": {} }, "edition": "2021", - "version": "1.3.2" + "version": "1.4.1" }, "license": "MIT/Apache-2.0", "license_ids": [ @@ -18177,6 +19009,270 @@ ], "license_file": "LICENSE" }, + "dfx-core 0.1.3": { + "name": "dfx-core", + "version": "0.1.3", + "package_url": "https://github.com/dfinity/sdk", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/dfx-core/0.1.3/download", + "sha256": "b4be4fc6929580b0ef8ac3678c03f31b59ffb1aa0d90ab754842d40cfc5b4552" + } + }, + "targets": [ + { + "Library": { + "crate_name": "dfx_core", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "dfx_core", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "aes-gcm 0.10.3", + "target": "aes_gcm" + }, + { + "id": "argon2 0.4.1", + "target": "argon2" + }, + { + "id": "backoff 0.4.0", + "target": "backoff" + }, + { + "id": "bip32 0.4.0", + "target": "bip32" + }, + { + "id": "byte-unit 4.0.19", + "target": "byte_unit" + }, + { + "id": "bytes 1.9.0", + "target": "bytes" + }, + { + "id": "candid 0.10.13", + "target": "candid" + }, + { + "id": "clap 4.5.20", + "target": "clap" + }, + { + "id": "dialoguer 0.11.0", + "target": "dialoguer" + }, + { + "id": "directories-next 2.0.0", + "target": "directories_next" + }, + { + "id": "dunce 1.0.5", + "target": "dunce" + }, + { + "id": "flate2 1.0.31", + "target": "flate2" + }, + { + "id": "handlebars 4.5.0", + "target": "handlebars" + }, + { + "id": "hex 0.4.3", + "target": "hex" + }, + { + "id": "humantime-serde 1.1.1", + "target": "humantime_serde" + }, + { + "id": "ic-agent 0.39.2", + "target": "ic_agent" + }, + { + "id": "ic-identity-hsm 0.39.2", + "target": "ic_identity_hsm" + }, + { + "id": "ic-utils 0.39.2", + "target": "ic_utils" + }, + { + "id": "itertools 0.10.5", + "target": "itertools" + }, + { + "id": "k256 0.11.6", + "target": "k256" + }, + { + "id": "keyring 3.4.0", + "target": "keyring" + }, + { + "id": "lazy_static 1.4.0", + "target": "lazy_static" + }, + { + "id": "reqwest 0.12.9", + "target": "reqwest" + }, + { + "id": "ring 0.16.20", + "target": "ring" + }, + { + "id": "schemars 0.8.21", + "target": "schemars" + }, + { + "id": "sec1 0.3.0", + "target": "sec1" + }, + { + "id": "semver 1.0.22", + "target": "semver" + }, + { + "id": "serde 1.0.217", + "target": "serde" + }, + { + "id": "serde_json 1.0.132", + "target": "serde_json" + }, + { + "id": "sha2 0.10.8", + "target": "sha2" + }, + { + "id": "slog 2.7.0", + "target": "slog" + }, + { + "id": "tar 0.4.39", + "target": "tar" + }, + { + "id": "tempfile 3.12.0", + "target": "tempfile" + }, + { + "id": "thiserror 1.0.68", + "target": "thiserror" + }, + { + "id": "time 0.3.36", + "target": "time" + }, + { + "id": "tiny-bip39 1.0.0", + "target": "bip39" + }, + { + "id": "url 2.5.3", + "target": "url" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.1.3" + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": null + }, + "dialoguer 0.11.0": { + "name": "dialoguer", + "version": "0.11.0", + "package_url": "https://github.com/console-rs/dialoguer", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/dialoguer/0.11.0/download", + "sha256": "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" + } + }, + "targets": [ + { + "Library": { + "crate_name": "dialoguer", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "dialoguer", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "editor", + "password", + "tempfile", + "zeroize" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "console 0.15.7", + "target": "console" + }, + { + "id": "shell-words 1.1.0", + "target": "shell_words" + }, + { + "id": "tempfile 3.12.0", + "target": "tempfile" + }, + { + "id": "thiserror 1.0.68", + "target": "thiserror" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.11.0" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": "LICENSE" + }, "diff 0.1.13": { "name": "diff", "version": "0.1.13", @@ -18430,7 +19526,7 @@ "target": "anyhow" }, { - "id": "arbitrary 1.3.2", + "id": "arbitrary 1.4.1", "target": "arbitrary" }, { @@ -18567,11 +19663,11 @@ "target": "cached" }, { - "id": "canbench 0.1.8", + "id": "canbench 0.1.9", "target": "canbench" }, { - "id": "canbench-rs 0.1.8", + "id": "canbench-rs 0.1.9", "target": "canbench_rs" }, { @@ -18674,6 +19770,10 @@ "id": "dashmap 5.5.3", "target": "dashmap" }, + { + "id": "dfx-core 0.1.3", + "target": "dfx_core" + }, { "id": "dyn-clone 1.0.14", "target": "dyn_clone" @@ -18703,7 +19803,7 @@ "target": "ethnum" }, { - "id": "evm_rpc_types 1.2.0", + "id": "evm_rpc_types 1.3.0", "target": "evm_rpc_types" }, { @@ -18835,7 +19935,7 @@ "target": "ic_cbor" }, { - "id": "ic-cdk 0.16.0", + "id": "ic-cdk 0.17.1", "target": "ic_cdk" }, { @@ -18867,6 +19967,10 @@ "id": "ic-http-gateway 0.1.0", "target": "ic_http_gateway" }, + { + "id": "ic-management-canister-types 0.1.0", + "target": "ic_management_canister_types" + }, { "id": "ic-metrics-encoder 1.1.1", "target": "ic_metrics_encoder" @@ -18984,7 +20088,7 @@ "target": "k8s_openapi" }, { - "id": "kube 0.93.1", + "id": "kube 0.94.2", "target": "kube" }, { @@ -19047,6 +20151,10 @@ "id": "maxminddb 0.24.0", "target": "maxminddb" }, + { + "id": "memmap2 0.9.5", + "target": "memmap2" + }, { "id": "metrics-proxy 0.1.0", "target": "metrics_proxy" @@ -19342,7 +20450,7 @@ "target": "rusty_fork" }, { - "id": "schemars 0.8.16", + "id": "schemars 0.8.21", "target": "schemars" }, { @@ -19498,7 +20606,7 @@ "target": "textplots" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" }, { @@ -19666,11 +20774,11 @@ "target": "wasmprinter" }, { - "id": "wasmtime 28.0.0", + "id": "wasmtime 29.0.1", "target": "wasmtime" }, { - "id": "wasmtime-environ 28.0.0", + "id": "wasmtime-environ 29.0.1", "target": "wasmtime_environ" }, { @@ -19736,7 +20844,7 @@ "target": "educe" }, { - "id": "ic-cdk-macros 0.9.0", + "id": "ic-cdk-macros 0.17.1", "target": "ic_cdk_macros" }, { @@ -19785,6 +20893,58 @@ "license_ids": [], "license_file": null }, + "directories-next 2.0.0": { + "name": "directories-next", + "version": "2.0.0", + "package_url": "https://github.com/xdg-rs/dirs/tree/master/directories", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/directories-next/2.0.0/download", + "sha256": "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" + } + }, + "targets": [ + { + "Library": { + "crate_name": "directories_next", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "directories_next", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "dirs-sys-next 0.1.2", + "target": "dirs_sys_next" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "2.0.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "dirs 2.0.2": { "name": "dirs", "version": "2.0.2", @@ -20326,6 +21486,46 @@ ], "license_file": "LICENSE" }, + "dunce 1.0.5": { + "name": "dunce", + "version": "1.0.5", + "package_url": "https://gitlab.com/kornelski/dunce", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/dunce/1.0.5/download", + "sha256": "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + } + }, + "targets": [ + { + "Library": { + "crate_name": "dunce", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "dunce", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2021", + "version": "1.0.5" + }, + "license": "CC0-1.0 OR MIT-0 OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "CC0-1.0", + "MIT-0" + ], + "license_file": "LICENSE" + }, "duration-string 0.3.0": { "name": "duration-string", "version": "0.3.0", @@ -20416,6 +21616,82 @@ ], "license_file": "LICENSE-APACHE" }, + "ecdsa 0.14.8": { + "name": "ecdsa", + "version": "0.14.8", + "package_url": "https://github.com/RustCrypto/signatures/tree/master/ecdsa", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/ecdsa/0.14.8/download", + "sha256": "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "ecdsa", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "ecdsa", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "arithmetic", + "der", + "digest", + "hazmat", + "pem", + "pkcs8", + "rfc6979", + "sign", + "std", + "verify" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "der 0.6.1", + "target": "der" + }, + { + "id": "elliptic-curve 0.12.3", + "target": "elliptic_curve" + }, + { + "id": "rfc6979 0.3.1", + "target": "rfc6979" + }, + { + "id": "signature 1.6.4", + "target": "signature" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.14.8" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "ecdsa 0.16.9": { "name": "ecdsa", "version": "0.16.9", @@ -20903,6 +22179,118 @@ ], "license_file": "LICENSE-APACHE" }, + "elliptic-curve 0.12.3": { + "name": "elliptic-curve", + "version": "0.12.3", + "package_url": "https://github.com/RustCrypto/traits/tree/master/elliptic-curve", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/elliptic-curve/0.12.3/download", + "sha256": "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "elliptic_curve", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "elliptic_curve", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "arithmetic", + "digest", + "ff", + "group", + "hazmat", + "pem", + "pem-rfc7468", + "pkcs8", + "sec1", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "base16ct 0.1.1", + "target": "base16ct" + }, + { + "id": "crypto-bigint 0.4.9", + "target": "crypto_bigint" + }, + { + "id": "der 0.6.1", + "target": "der" + }, + { + "id": "digest 0.10.7", + "target": "digest" + }, + { + "id": "ff 0.12.1", + "target": "ff" + }, + { + "id": "generic-array 0.14.7", + "target": "generic_array" + }, + { + "id": "group 0.12.1", + "target": "group" + }, + { + "id": "pem-rfc7468 0.6.0", + "target": "pem_rfc7468" + }, + { + "id": "pkcs8 0.9.0", + "target": "pkcs8" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + }, + { + "id": "sec1 0.3.0", + "target": "sec1" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.12.3" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "elliptic-curve 0.13.8": { "name": "elliptic-curve", "version": "0.13.8", @@ -23260,14 +24648,14 @@ ], "license_file": "LICENSE-APACHE" }, - "evm_rpc_types 1.2.0": { + "evm_rpc_types 1.3.0": { "name": "evm_rpc_types", - "version": "1.2.0", + "version": "1.3.0", "package_url": "https://github.com/internet-computer-protocol/evm-rpc-canister", "repository": { "Http": { - "url": "https://static.crates.io/crates/evm_rpc_types/1.2.0/download", - "sha256": "29ed9ee7b89726f4a343208e9a89e9ad22fe7b4518b0d722973cc83274e7bf7f" + "url": "https://static.crates.io/crates/evm_rpc_types/1.3.0/download", + "sha256": "fa134314bce7c35b9214710572fb7305edc7f4223c5bd03b5857ed08bbb05897" } }, "targets": [ @@ -23300,7 +24688,7 @@ "target": "hex" }, { - "id": "ic-cdk 0.16.0", + "id": "ic-cdk 0.17.1", "target": "ic_cdk" }, { @@ -23316,7 +24704,7 @@ "target": "strum" }, { - "id": "thiserror 1.0.68", + "id": "thiserror 2.0.11", "target": "thiserror" }, { @@ -23327,7 +24715,7 @@ "selects": {} }, "edition": "2021", - "version": "1.2.0" + "version": "1.3.0" }, "license": "Apache-2.0", "license_ids": [ @@ -24394,6 +25782,93 @@ ], "license_file": "LICENSE" }, + "foreign-types 0.3.2": { + "name": "foreign-types", + "version": "0.3.2", + "package_url": "https://github.com/sfackler/foreign-types", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/foreign-types/0.3.2/download", + "sha256": "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "foreign_types", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "foreign_types", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "foreign-types-shared 0.1.1", + "target": "foreign_types_shared" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.3.2" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "foreign-types-shared 0.1.1": { + "name": "foreign-types-shared", + "version": "0.1.1", + "package_url": "https://github.com/sfackler/foreign-types", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/foreign-types-shared/0.1.1/download", + "sha256": "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "foreign_types_shared", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "foreign_types_shared", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "0.1.1" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "form_urlencoded 1.2.1": { "name": "form_urlencoded", "version": "1.2.1", @@ -25981,6 +27456,58 @@ ], "license_file": "LICENSE-APACHE" }, + "ghash 0.5.1": { + "name": "ghash", + "version": "0.5.1", + "package_url": "https://github.com/RustCrypto/universal-hashes", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/ghash/0.5.1/download", + "sha256": "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "ghash", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "ghash", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "opaque-debug 0.3.0", + "target": "opaque_debug" + }, + { + "id": "polyval 0.6.2", + "target": "polyval" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.5.1" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "gimli 0.26.2": { "name": "gimli", "version": "0.26.2", @@ -26289,6 +27816,62 @@ ], "license_file": null }, + "group 0.12.1": { + "name": "group", + "version": "0.12.1", + "package_url": "https://github.com/zkcrypto/group", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/group/0.12.1/download", + "sha256": "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" + } + }, + "targets": [ + { + "Library": { + "crate_name": "group", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "group", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "ff 0.12.1", + "target": "ff" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.12.1" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "group 0.13.0": { "name": "group", "version": "0.13.0", @@ -26571,6 +28154,84 @@ ], "license_file": "LICENSE" }, + "handlebars 4.5.0": { + "name": "handlebars", + "version": "4.5.0", + "package_url": "https://github.com/sunng87/handlebars-rust", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/handlebars/4.5.0/download", + "sha256": "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225" + } + }, + "targets": [ + { + "Library": { + "crate_name": "handlebars", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "handlebars", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "log 0.4.20", + "target": "log" + }, + { + "id": "pest 2.7.4", + "target": "pest" + }, + { + "id": "serde 1.0.217", + "target": "serde" + }, + { + "id": "serde_json 1.0.132", + "target": "serde_json" + }, + { + "id": "thiserror 1.0.68", + "target": "thiserror" + } + ], + "selects": {} + }, + "edition": "2021", + "proc_macro_deps": { + "common": [ + { + "id": "pest_derive 2.7.4", + "target": "pest_derive" + } + ], + "selects": {} + }, + "version": "4.5.0" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": "LICENSE" + }, "hashbrown 0.12.3": { "name": "hashbrown", "version": "0.12.3", @@ -30152,7 +31813,7 @@ "target": "stop_token" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" }, { @@ -30393,7 +32054,7 @@ "target": "systemstat" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" }, { @@ -30623,7 +32284,7 @@ "target": "hex" }, { - "id": "ic-cdk 0.17.0", + "id": "ic-cdk 0.17.1", "target": "ic_cdk" }, { @@ -30655,7 +32316,7 @@ "target": "sha2" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" } ], @@ -30801,82 +32462,14 @@ ], "license_file": "LICENSE" }, - "ic-cdk 0.16.0": { + "ic-cdk 0.17.1": { "name": "ic-cdk", - "version": "0.16.0", - "package_url": "https://github.com/dfinity/cdk-rs", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/ic-cdk/0.16.0/download", - "sha256": "dd8ecacd682fa05a985253592963306cb9799622d7b1cce4b1edb89c6ec85be1" - } - }, - "targets": [ - { - "Library": { - "crate_name": "ic_cdk", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "ic_cdk", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "candid 0.10.13", - "target": "candid" - }, - { - "id": "ic0 0.23.0", - "target": "ic0" - }, - { - "id": "serde 1.0.217", - "target": "serde" - }, - { - "id": "serde_bytes 0.11.15", - "target": "serde_bytes" - } - ], - "selects": {} - }, - "edition": "2021", - "proc_macro_deps": { - "common": [ - { - "id": "ic-cdk-macros 0.16.0", - "target": "ic_cdk_macros" - } - ], - "selects": {} - }, - "version": "0.16.0" - }, - "license": "Apache-2.0", - "license_ids": [ - "Apache-2.0" - ], - "license_file": "LICENSE" - }, - "ic-cdk 0.17.0": { - "name": "ic-cdk", - "version": "0.17.0", + "version": "0.17.1", "package_url": "https://github.com/dfinity/cdk-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/ic-cdk/0.17.0/download", - "sha256": "b2abdf9341da9f9f6b451a40609cb69645a05a8e9eb7784c16209f16f2c0f76f" + "url": "https://static.crates.io/crates/ic-cdk/0.17.1/download", + "sha256": "122efbcb0af5280d408a75a57b7dc6e9d92893bf6ed9cc98fe4dcff51f18b67c" } }, "targets": [ @@ -30923,13 +32516,13 @@ "proc_macro_deps": { "common": [ { - "id": "ic-cdk-macros 0.17.0", + "id": "ic-cdk-macros 0.17.1", "target": "ic_cdk_macros" } ], "selects": {} }, - "version": "0.17.0" + "version": "0.17.1" }, "license": "Apache-2.0", "license_ids": [ @@ -30988,7 +32581,7 @@ "target": "serde_bytes" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" } ], @@ -31079,148 +32672,14 @@ ], "license_file": "LICENSE" }, - "ic-cdk-macros 0.9.0": { - "name": "ic-cdk-macros", - "version": "0.9.0", - "package_url": "https://github.com/dfinity/cdk-rs", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/ic-cdk-macros/0.9.0/download", - "sha256": "2fde5ca6ef1e69825c68916ff1bf7256b8f7ed69ac5ea3f1756f6e57f1503e27" - } - }, - "targets": [ - { - "ProcMacro": { - "crate_name": "ic_cdk_macros", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "ic_cdk_macros", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "candid 0.10.13", - "target": "candid" - }, - { - "id": "proc-macro2 1.0.89", - "target": "proc_macro2" - }, - { - "id": "quote 1.0.37", - "target": "quote" - }, - { - "id": "serde 1.0.217", - "target": "serde" - }, - { - "id": "serde_tokenstream 0.1.7", - "target": "serde_tokenstream" - }, - { - "id": "syn 1.0.109", - "target": "syn" - } - ], - "selects": {} - }, - "edition": "2021", - "version": "0.9.0" - }, - "license": "Apache-2.0", - "license_ids": [ - "Apache-2.0" - ], - "license_file": "LICENSE" - }, - "ic-cdk-macros 0.16.0": { - "name": "ic-cdk-macros", - "version": "0.16.0", - "package_url": "https://github.com/dfinity/cdk-rs", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/ic-cdk-macros/0.16.0/download", - "sha256": "0d4d857135deef20cc7ea8f3869a30cd9cfeb1392b3a81043790b2cd82adc3e0" - } - }, - "targets": [ - { - "ProcMacro": { - "crate_name": "ic_cdk_macros", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "ic_cdk_macros", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "candid 0.10.13", - "target": "candid" - }, - { - "id": "proc-macro2 1.0.89", - "target": "proc_macro2" - }, - { - "id": "quote 1.0.37", - "target": "quote" - }, - { - "id": "serde 1.0.217", - "target": "serde" - }, - { - "id": "serde_tokenstream 0.2.1", - "target": "serde_tokenstream" - }, - { - "id": "syn 2.0.87", - "target": "syn" - } - ], - "selects": {} - }, - "edition": "2021", - "version": "0.16.0" - }, - "license": "Apache-2.0", - "license_ids": [ - "Apache-2.0" - ], - "license_file": "LICENSE" - }, - "ic-cdk-macros 0.17.0": { + "ic-cdk-macros 0.17.1": { "name": "ic-cdk-macros", - "version": "0.17.0", + "version": "0.17.1", "package_url": "https://github.com/dfinity/cdk-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/ic-cdk-macros/0.17.0/download", - "sha256": "b8df41980e95dead28735ab0f748c75477b0c5eab37a09a5641c78ec406a1db0" + "url": "https://static.crates.io/crates/ic-cdk-macros/0.17.1/download", + "sha256": "c792bf0d1621c893ccf2bcdeac4ee70121103a03030a1827031a6b3c60488944" } }, "targets": [ @@ -31272,7 +32731,7 @@ "selects": {} }, "edition": "2021", - "version": "0.17.0" + "version": "0.17.1" }, "license": "Apache-2.0", "license_ids": [ @@ -31386,7 +32845,7 @@ "target": "futures" }, { - "id": "ic-cdk 0.17.0", + "id": "ic-cdk 0.17.1", "target": "ic_cdk" }, { @@ -31858,6 +33317,128 @@ ], "license_file": "LICENSE" }, + "ic-identity-hsm 0.39.2": { + "name": "ic-identity-hsm", + "version": "0.39.2", + "package_url": "https://github.com/dfinity/agent-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/ic-identity-hsm/0.39.2/download", + "sha256": "0ebb94d7cb5be09bed47655008f0c2968a3a3253dcf680297f3e8475e4b317c4" + } + }, + "targets": [ + { + "Library": { + "crate_name": "ic_identity_hsm", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "ic_identity_hsm", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "hex 0.4.3", + "target": "hex" + }, + { + "id": "ic-agent 0.39.2", + "target": "ic_agent" + }, + { + "id": "pkcs11 0.5.0", + "target": "pkcs11" + }, + { + "id": "sha2 0.10.8", + "target": "sha2" + }, + { + "id": "simple_asn1 0.6.2", + "target": "simple_asn1" + }, + { + "id": "thiserror 2.0.11", + "target": "thiserror" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.39.2" + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": null + }, + "ic-management-canister-types 0.1.0": { + "name": "ic-management-canister-types", + "version": "0.1.0", + "package_url": "https://github.com/dfinity/cdk-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/ic-management-canister-types/0.1.0/download", + "sha256": "eadff40906491c8c61a3c886cce4ee02f48a4798684d8a10e4a14891a217a284" + } + }, + "targets": [ + { + "Library": { + "crate_name": "ic_management_canister_types", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "ic_management_canister_types", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "candid 0.10.13", + "target": "candid" + }, + { + "id": "serde 1.0.217", + "target": "serde" + }, + { + "id": "serde_bytes 0.11.15", + "target": "serde_bytes" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.1.0" + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": "LICENSE" + }, "ic-metrics-encoder 1.1.1": { "name": "ic-metrics-encoder", "version": "1.1.1", @@ -32376,7 +33957,7 @@ "target": "sha2" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" } ], @@ -32474,7 +34055,7 @@ "target": "strum" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" }, { @@ -33099,7 +34680,7 @@ "deps": { "common": [ { - "id": "arbitrary 1.3.2", + "id": "arbitrary 1.4.1", "target": "arbitrary" }, { @@ -36520,6 +38101,96 @@ ], "license_file": "LICENSE" }, + "k256 0.11.6": { + "name": "k256", + "version": "0.11.6", + "package_url": "https://github.com/RustCrypto/elliptic-curves/tree/master/k256", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/k256/0.11.6/download", + "sha256": "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "k256", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "k256", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "arithmetic", + "default", + "digest", + "ecdsa", + "ecdsa-core", + "keccak256", + "pem", + "pkcs8", + "schnorr", + "sha2", + "sha256", + "sha3", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "ecdsa 0.14.8", + "target": "ecdsa", + "alias": "ecdsa_core" + }, + { + "id": "elliptic-curve 0.12.3", + "target": "elliptic_curve" + }, + { + "id": "sha2 0.10.8", + "target": "sha2" + }, + { + "id": "sha3 0.10.8", + "target": "sha3" + } + ], + "selects": {} + }, + "edition": "2021", + "rustc_flags": { + "common": [ + "-C", + "opt-level=3" + ], + "selects": {} + }, + "version": "0.11.6" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "k256 0.13.4": { "name": "k256", "version": "0.13.4", @@ -36659,7 +38330,8 @@ ], "crate_features": { "common": [ - "v1_24" + "schemars", + "v1_28" ], "selects": {} }, @@ -36677,6 +38349,10 @@ "id": "k8s-openapi 0.22.0", "target": "build_script_build" }, + { + "id": "schemars 0.8.21", + "target": "schemars" + }, { "id": "serde 1.0.217", "target": "serde" @@ -36760,14 +38436,236 @@ ], "license_file": "LICENSE-APACHE" }, - "kube 0.93.1": { + "keyring 3.4.0": { + "name": "keyring", + "version": "3.4.0", + "package_url": "https://github.com/hwchen/keyring-rs.git", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/keyring/3.4.0/download", + "sha256": "bd3d701d3de5b9c4b0d9d077f8c2c66f0388d75e96932ebbb7cdff8713d7f7c6" + } + }, + "targets": [ + { + "Library": { + "crate_name": "keyring", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "keyring", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "apple-native", + "linux-native", + "sync-secret-service", + "vendored", + "windows-native" + ], + "selects": {} + }, + "deps": { + "common": [], + "selects": { + "aarch64-apple-darwin": [ + { + "id": "security-framework 3.0.1", + "target": "security_framework" + } + ], + "aarch64-apple-ios": [ + { + "id": "security-framework 3.0.1", + "target": "security_framework" + } + ], + "aarch64-apple-ios-sim": [ + { + "id": "security-framework 3.0.1", + "target": "security_framework" + } + ], + "aarch64-pc-windows-msvc": [ + { + "id": "byteorder 1.5.0", + "target": "byteorder" + }, + { + "id": "windows-sys 0.59.0", + "target": "windows_sys" + } + ], + "aarch64-unknown-linux-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "aarch64-unknown-nixos-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "arm-unknown-linux-gnueabi": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "armv7-unknown-linux-gnueabi": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "i686-apple-darwin": [ + { + "id": "security-framework 3.0.1", + "target": "security_framework" + } + ], + "i686-pc-windows-msvc": [ + { + "id": "byteorder 1.5.0", + "target": "byteorder" + }, + { + "id": "windows-sys 0.59.0", + "target": "windows_sys" + } + ], + "i686-unknown-freebsd": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + } + ], + "i686-unknown-linux-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "powerpc-unknown-linux-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "s390x-unknown-linux-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "x86_64-apple-darwin": [ + { + "id": "security-framework 3.0.1", + "target": "security_framework" + } + ], + "x86_64-apple-ios": [ + { + "id": "security-framework 3.0.1", + "target": "security_framework" + } + ], + "x86_64-pc-windows-msvc": [ + { + "id": "byteorder 1.5.0", + "target": "byteorder" + }, + { + "id": "windows-sys 0.59.0", + "target": "windows_sys" + } + ], + "x86_64-unknown-freebsd": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + } + ], + "x86_64-unknown-linux-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "x86_64-unknown-nixos-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ] + } + }, + "edition": "2021", + "version": "3.4.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "kube 0.94.2": { "name": "kube", - "version": "0.93.1", + "version": "0.94.2", "package_url": "https://github.com/kube-rs/kube", "repository": { "Http": { - "url": "https://static.crates.io/crates/kube/0.93.1/download", - "sha256": "0365920075af1a2d23619c1ca801c492f2400157de42627f041a061716e76416" + "url": "https://static.crates.io/crates/kube/0.94.2/download", + "sha256": "52ace78a62b361077505f2950bd48aa3e46596fb15350c9c993de15ddfa3cac5" } }, "targets": [ @@ -36794,7 +38692,9 @@ "client", "config", "default", + "derive", "kube-client", + "kube-derive", "rustls-tls" ], "selects": {} @@ -36806,18 +38706,27 @@ "target": "k8s_openapi" }, { - "id": "kube-client 0.93.1", + "id": "kube-client 0.94.2", "target": "kube_client" }, { - "id": "kube-core 0.93.1", + "id": "kube-core 0.94.2", "target": "kube_core" } ], "selects": {} }, "edition": "2021", - "version": "0.93.1" + "proc_macro_deps": { + "common": [ + { + "id": "kube-derive 0.94.2", + "target": "kube_derive" + } + ], + "selects": {} + }, + "version": "0.94.2" }, "license": "Apache-2.0", "license_ids": [ @@ -36825,14 +38734,14 @@ ], "license_file": null }, - "kube-client 0.93.1": { + "kube-client 0.94.2": { "name": "kube-client", - "version": "0.93.1", + "version": "0.94.2", "package_url": "https://github.com/kube-rs/kube", "repository": { "Http": { - "url": "https://static.crates.io/crates/kube-client/0.93.1/download", - "sha256": "d81336eb3a5b10a40c97a5a97ad66622e92bad942ce05ee789edd730aa4f8603" + "url": "https://static.crates.io/crates/kube-client/0.94.2/download", + "sha256": "18ec0fcafd3add30b413b096a61d69b0a37f94d3f95b6f505a57ea3d27cec2a7" } }, "targets": [ @@ -36948,7 +38857,7 @@ "target": "k8s_openapi" }, { - "id": "kube-core 0.93.1", + "id": "kube-core 0.94.2", "target": "kube_core" }, { @@ -37007,7 +38916,7 @@ "selects": {} }, "edition": "2021", - "version": "0.93.1" + "version": "0.94.2" }, "license": "Apache-2.0", "license_ids": [ @@ -37015,14 +38924,14 @@ ], "license_file": null }, - "kube-core 0.93.1": { + "kube-core 0.94.2": { "name": "kube-core", - "version": "0.93.1", + "version": "0.94.2", "package_url": "https://github.com/kube-rs/kube", "repository": { "Http": { - "url": "https://static.crates.io/crates/kube-core/0.93.1/download", - "sha256": "cce373a74d787d439063cdefab0f3672860bd7bac01a38e39019177e764a0fe6" + "url": "https://static.crates.io/crates/kube-core/0.94.2/download", + "sha256": "a50c095f051dada37740d883b6d47ad0430e95082140718073b773c8a70f231c" } }, "targets": [ @@ -37044,6 +38953,13 @@ "compile_data_glob": [ "**" ], + "crate_features": { + "common": [ + "schema", + "schemars" + ], + "selects": {} + }, "deps": { "common": [ { @@ -37062,10 +38978,18 @@ "id": "k8s-openapi 0.22.0", "target": "k8s_openapi" }, + { + "id": "schemars 0.8.21", + "target": "schemars" + }, { "id": "serde 1.0.217", "target": "serde" }, + { + "id": "serde-value 0.7.0", + "target": "serde_value" + }, { "id": "serde_json 1.0.132", "target": "serde_json" @@ -37078,7 +39002,70 @@ "selects": {} }, "edition": "2021", - "version": "0.93.1" + "version": "0.94.2" + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": null + }, + "kube-derive 0.94.2": { + "name": "kube-derive", + "version": "0.94.2", + "package_url": "https://github.com/kube-rs/kube", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/kube-derive/0.94.2/download", + "sha256": "7871f02c3c848b63fee3d2f2645bb4a3c0b68ee147badcddf1b0cf8fb5db87ad" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "kube_derive", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "kube_derive", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "darling 0.20.10", + "target": "darling" + }, + { + "id": "proc-macro2 1.0.89", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.37", + "target": "quote" + }, + { + "id": "serde_json 1.0.132", + "target": "serde_json" + }, + { + "id": "syn 2.0.87", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.94.2" }, "license": "Apache-2.0", "license_ids": [ @@ -38323,6 +40310,97 @@ ], "license_file": "LICENSE-APACHE" }, + "libdbus-sys 0.2.5": { + "name": "libdbus-sys", + "version": "0.2.5", + "package_url": "https://github.com/diwic/dbus-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/libdbus-sys/0.2.5/download", + "sha256": "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" + } + }, + "targets": [ + { + "Library": { + "crate_name": "libdbus_sys", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "libdbus_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "cc", + "default", + "pkg-config", + "vendored" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "libdbus-sys 0.2.5", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.2.5" + }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.1.37", + "target": "cc" + }, + { + "id": "pkg-config 0.3.27", + "target": "pkg_config" + } + ], + "selects": {} + }, + "links": "dbus" + }, + "license": "Apache-2.0/MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "libflate 2.1.0": { "name": "libflate", "version": "2.1.0", @@ -38498,7 +40576,7 @@ "deps": { "common": [ { - "id": "arbitrary 1.3.2", + "id": "arbitrary 1.4.1", "target": "arbitrary" }, { @@ -38540,6 +40618,89 @@ ], "license_file": "LICENSE-APACHE" }, + "libloading 0.5.2": { + "name": "libloading", + "version": "0.5.2", + "package_url": "https://github.com/nagisa/rust_libloading/", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/libloading/0.5.2/download", + "sha256": "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" + } + }, + "targets": [ + { + "Library": { + "crate_name": "libloading", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "libloading", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "libloading 0.5.2", + "target": "build_script_build" + } + ], + "selects": { + "cfg(windows)": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } + }, + "edition": "2015", + "version": "0.5.2" + }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.1.37", + "target": "cc" + } + ], + "selects": {} + } + }, + "license": "ISC", + "license_ids": [ + "ISC" + ], + "license_file": "LICENSE" + }, "libloading 0.7.4": { "name": "libloading", "version": "0.7.4", @@ -38995,7 +41156,7 @@ "selects": { "cfg(unix)": [ { - "id": "openssl-sys 0.9.102", + "id": "openssl-sys 0.9.105", "target": "openssl_sys" } ] @@ -39041,7 +41202,7 @@ "selects": { "cfg(unix)": [ { - "id": "openssl-sys 0.9.102", + "id": "openssl-sys 0.9.105", "target": "openssl_sys" } ] @@ -39283,6 +41444,65 @@ ], "license_file": "LICENSE-APACHE" }, + "linux-keyutils 0.2.4": { + "name": "linux-keyutils", + "version": "0.2.4", + "package_url": "https://github.com/landhb/linux-keyutils", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/linux-keyutils/0.2.4/download", + "sha256": "761e49ec5fd8a5a463f9b84e877c373d888935b71c6be78f3767fe2ae6bed18e" + } + }, + "targets": [ + { + "Library": { + "crate_name": "linux_keyutils", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "linux_keyutils", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "bitflags 2.6.0", + "target": "bitflags" + }, + { + "id": "libc 0.2.158", + "target": "libc" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.2.4" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, "linux-raw-sys 0.4.13": { "name": "linux-raw-sys", "version": "0.4.13", @@ -41145,6 +43365,56 @@ ], "license_file": "LICENSE-APACHE" }, + "memmap2 0.9.5": { + "name": "memmap2", + "version": "0.9.5", + "package_url": "https://github.com/RazrFalcon/memmap2-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/memmap2/0.9.5/download", + "sha256": "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "memmap2", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "memmap2", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(unix)": [ + { + "id": "libc 0.2.158", + "target": "libc" + } + ] + } + }, + "edition": "2018", + "version": "0.9.5" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "memoffset 0.6.5": { "name": "memoffset", "version": "0.6.5", @@ -43907,6 +46177,82 @@ ], "license_file": null }, + "num 0.4.3": { + "name": "num", + "version": "0.4.3", + "package_url": "https://github.com/rust-num/num", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/num/0.4.3/download", + "sha256": "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" + } + }, + "targets": [ + { + "Library": { + "crate_name": "num", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "num", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "num-bigint", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "num-bigint 0.4.6", + "target": "num_bigint" + }, + { + "id": "num-complex 0.4.6", + "target": "num_complex" + }, + { + "id": "num-integer 0.1.46", + "target": "num_integer" + }, + { + "id": "num-iter 0.1.45", + "target": "num_iter" + }, + { + "id": "num-rational 0.4.2", + "target": "num_rational" + }, + { + "id": "num-traits 0.2.19", + "target": "num_traits" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "num-bigint 0.2.6": { "name": "num-bigint", "version": "0.2.6", @@ -43950,6 +46296,7 @@ ], "crate_features": { "common": [ + "default", "std" ], "selects": {} @@ -44139,7 +46486,7 @@ "target": "num_integer" }, { - "id": "num-iter 0.1.43", + "id": "num-iter 0.1.45", "target": "num_iter" }, { @@ -44183,6 +46530,60 @@ ], "license_file": "LICENSE-APACHE" }, + "num-complex 0.4.6": { + "name": "num-complex", + "version": "0.4.6", + "package_url": "https://github.com/rust-num/num-complex", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/num-complex/0.4.6/download", + "sha256": "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" + } + }, + "targets": [ + { + "Library": { + "crate_name": "num_complex", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "num_complex", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "num-traits 0.2.19", + "target": "num_traits" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.6" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "num-conv 0.1.0": { "name": "num-conv", "version": "0.1.0", @@ -44329,14 +46730,14 @@ ], "license_file": "LICENSE-APACHE" }, - "num-iter 0.1.43": { + "num-iter 0.1.45": { "name": "num-iter", - "version": "0.1.43", + "version": "0.1.45", "package_url": "https://github.com/rust-num/num-iter", "repository": { "Http": { - "url": "https://static.crates.io/crates/num-iter/0.1.43/download", - "sha256": "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" + "url": "https://static.crates.io/crates/num-iter/0.1.45/download", + "sha256": "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" } }, "targets": [ @@ -44351,18 +46752,6 @@ ] } } - }, - { - "BuildScript": { - "crate_name": "build_script_build", - "crate_root": "build.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } } ], "library_target_name": "num_iter", @@ -44370,16 +46759,61 @@ "compile_data_glob": [ "**" ], + "crate_features": { + "common": [], + "selects": { + "aarch64-unknown-linux-gnu": [ + "i128", + "std" + ], + "aarch64-unknown-nixos-gnu": [ + "i128", + "std" + ], + "arm-unknown-linux-gnueabi": [ + "i128", + "std" + ], + "armv7-unknown-linux-gnueabi": [ + "i128", + "std" + ], + "i686-unknown-freebsd": [ + "i128", + "std" + ], + "i686-unknown-linux-gnu": [ + "i128", + "std" + ], + "powerpc-unknown-linux-gnu": [ + "i128", + "std" + ], + "s390x-unknown-linux-gnu": [ + "i128", + "std" + ], + "x86_64-unknown-freebsd": [ + "i128", + "std" + ], + "x86_64-unknown-linux-gnu": [ + "i128", + "std" + ], + "x86_64-unknown-nixos-gnu": [ + "i128", + "std" + ] + } + }, "deps": { "common": [ { "id": "num-integer 0.1.46", "target": "num_integer" }, - { - "id": "num-iter 0.1.43", - "target": "build_script_build" - }, { "id": "num-traits 0.2.19", "target": "num_traits" @@ -44387,25 +46821,8 @@ ], "selects": {} }, - "edition": "2015", - "version": "0.1.43" - }, - "build_script_attrs": { - "compile_data_glob": [ - "**" - ], - "data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "autocfg 1.1.0", - "target": "autocfg" - } - ], - "selects": {} - } + "edition": "2018", + "version": "0.1.45" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -44513,6 +46930,70 @@ ], "license_file": "LICENSE-APACHE" }, + "num-rational 0.4.2": { + "name": "num-rational", + "version": "0.4.2", + "package_url": "https://github.com/rust-num/num-rational", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/num-rational/0.4.2/download", + "sha256": "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" + } + }, + "targets": [ + { + "Library": { + "crate_name": "num_rational", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "num_rational", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "num-bigint", + "num-bigint-std", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "num-bigint 0.4.6", + "target": "num_bigint" + }, + { + "id": "num-integer 0.1.46", + "target": "num_integer" + }, + { + "id": "num-traits 0.2.19", + "target": "num_traits" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.2" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "num-traits 0.2.19": { "name": "num-traits", "version": "0.2.19", @@ -45452,6 +47933,173 @@ ], "license_file": "LICENSE-APACHE" }, + "openssl 0.10.70": { + "name": "openssl", + "version": "0.10.70", + "package_url": "https://github.com/sfackler/rust-openssl", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/openssl/0.10.70/download", + "sha256": "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" + } + }, + "targets": [ + { + "Library": { + "crate_name": "openssl", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "openssl", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "bitflags 2.6.0", + "target": "bitflags" + }, + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "foreign-types 0.3.2", + "target": "foreign_types" + }, + { + "id": "libc 0.2.158", + "target": "libc" + }, + { + "id": "once_cell 1.19.0", + "target": "once_cell" + }, + { + "id": "openssl 0.10.70", + "target": "build_script_build" + }, + { + "id": "openssl-sys 0.9.105", + "target": "openssl_sys", + "alias": "ffi" + } + ], + "selects": {} + }, + "edition": "2021", + "proc_macro_deps": { + "common": [ + { + "id": "openssl-macros 0.1.1", + "target": "openssl_macros" + } + ], + "selects": {} + }, + "version": "0.10.70" + }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ], + "link_deps": { + "common": [ + { + "id": "openssl-sys 0.9.105", + "target": "openssl_sys", + "alias": "ffi" + } + ], + "selects": {} + } + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": "LICENSE" + }, + "openssl-macros 0.1.1": { + "name": "openssl-macros", + "version": "0.1.1", + "package_url": null, + "repository": { + "Http": { + "url": "https://static.crates.io/crates/openssl-macros/0.1.1/download", + "sha256": "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "openssl_macros", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "openssl_macros", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.89", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.37", + "target": "quote" + }, + { + "id": "syn 2.0.87", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.1" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "openssl-probe 0.1.5": { "name": "openssl-probe", "version": "0.1.5", @@ -45491,14 +48139,62 @@ ], "license_file": "LICENSE-APACHE" }, - "openssl-sys 0.9.102": { + "openssl-src 300.4.1+3.4.0": { + "name": "openssl-src", + "version": "300.4.1+3.4.0", + "package_url": "https://github.com/alexcrichton/openssl-src-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/openssl-src/300.4.1+3.4.0/download", + "sha256": "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "openssl_src", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "openssl_src", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.1.37", + "target": "cc" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "300.4.1+3.4.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "openssl-sys 0.9.105": { "name": "openssl-sys", - "version": "0.9.102", + "version": "0.9.105", "package_url": "https://github.com/sfackler/rust-openssl", "repository": { "Http": { - "url": "https://static.crates.io/crates/openssl-sys/0.9.102/download", - "sha256": "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" + "url": "https://static.crates.io/crates/openssl-sys/0.9.105/download", + "sha256": "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" } }, "targets": [ @@ -45539,14 +48235,14 @@ "target": "libc" }, { - "id": "openssl-sys 0.9.102", + "id": "openssl-sys 0.9.105", "target": "build_script_main" } ], "selects": {} }, - "edition": "2018", - "version": "0.9.102" + "edition": "2021", + "version": "0.9.105" }, "build_script_attrs": { "compile_data_glob": [ @@ -47652,7 +50348,209 @@ } } ], - "library_target_name": "parking_lot_core", + "library_target_name": "parking_lot_core", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "parking_lot_core 0.9.8", + "target": "build_script_build" + }, + { + "id": "smallvec 1.13.2", + "target": "smallvec" + } + ], + "selects": { + "cfg(target_os = \"redox\")": [ + { + "id": "redox_syscall 0.3.5", + "target": "syscall" + } + ], + "cfg(unix)": [ + { + "id": "libc 0.2.158", + "target": "libc" + } + ], + "cfg(windows)": [ + { + "id": "windows-targets 0.48.5", + "target": "windows_targets" + } + ] + } + }, + "edition": "2018", + "version": "0.9.8" + }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "parse-size 1.1.0": { + "name": "parse-size", + "version": "1.1.0", + "package_url": "https://github.com/kennytm/parse-size", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/parse-size/1.1.0/download", + "sha256": "487f2ccd1e17ce8c1bfab3a65c89525af41cfad4c8659021a1e9a2aacd73b89b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "parse_size", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "parse_size", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "std" + ], + "selects": {} + }, + "edition": "2021", + "version": "1.1.0" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": "LICENSE.txt" + }, + "password-hash 0.4.2": { + "name": "password-hash", + "version": "0.4.2", + "package_url": "https://github.com/RustCrypto/traits/tree/master/password-hash", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/password-hash/0.4.2/download", + "sha256": "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" + } + }, + "targets": [ + { + "Library": { + "crate_name": "password_hash", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "password_hash", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "rand_core" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "base64ct 1.6.0", + "target": "base64ct" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.2" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "paste 1.0.15": { + "name": "paste", + "version": "1.0.15", + "package_url": "https://github.com/dtolnay/paste", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/paste/1.0.15/download", + "sha256": "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "paste", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "paste", "common_attrs": { "compile_data_glob": [ "**" @@ -47660,41 +50558,14 @@ "deps": { "common": [ { - "id": "cfg-if 1.0.0", - "target": "cfg_if" - }, - { - "id": "parking_lot_core 0.9.8", + "id": "paste 1.0.15", "target": "build_script_build" - }, - { - "id": "smallvec 1.13.2", - "target": "smallvec" } ], - "selects": { - "cfg(target_os = \"redox\")": [ - { - "id": "redox_syscall 0.3.5", - "target": "syscall" - } - ], - "cfg(unix)": [ - { - "id": "libc 0.2.158", - "target": "libc" - } - ], - "cfg(windows)": [ - { - "id": "windows-targets 0.48.5", - "target": "windows_targets" - } - ] - } + "selects": {} }, "edition": "2018", - "version": "0.9.8" + "version": "1.0.15" }, "build_script_attrs": { "compile_data_glob": [ @@ -47711,64 +50582,20 @@ ], "license_file": "LICENSE-APACHE" }, - "parse-size 1.1.0": { - "name": "parse-size", - "version": "1.1.0", - "package_url": "https://github.com/kennytm/parse-size", + "pbkdf2 0.11.0": { + "name": "pbkdf2", + "version": "0.11.0", + "package_url": "https://github.com/RustCrypto/password-hashes/tree/master/pbkdf2", "repository": { "Http": { - "url": "https://static.crates.io/crates/parse-size/1.1.0/download", - "sha256": "487f2ccd1e17ce8c1bfab3a65c89525af41cfad4c8659021a1e9a2aacd73b89b" + "url": "https://static.crates.io/crates/pbkdf2/0.11.0/download", + "sha256": "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" } }, "targets": [ { "Library": { - "crate_name": "parse_size", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "parse_size", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "crate_features": { - "common": [ - "std" - ], - "selects": {} - }, - "edition": "2021", - "version": "1.1.0" - }, - "license": "MIT", - "license_ids": [ - "MIT" - ], - "license_file": "LICENSE.txt" - }, - "paste 1.0.15": { - "name": "paste", - "version": "1.0.15", - "package_url": "https://github.com/dtolnay/paste", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/paste/1.0.15/download", - "sha256": "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - } - }, - "targets": [ - { - "ProcMacro": { - "crate_name": "paste", + "crate_name": "pbkdf2", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -47777,21 +50604,9 @@ ] } } - }, - { - "BuildScript": { - "crate_name": "build_script_build", - "crate_root": "build.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } } ], - "library_target_name": "paste", + "library_target_name": "pbkdf2", "common_attrs": { "compile_data_glob": [ "**" @@ -47799,22 +50614,14 @@ "deps": { "common": [ { - "id": "paste 1.0.15", - "target": "build_script_build" + "id": "digest 0.10.7", + "target": "digest" } ], "selects": {} }, - "edition": "2018", - "version": "1.0.15" - }, - "build_script_attrs": { - "compile_data_glob": [ - "**" - ], - "data_glob": [ - "**" - ] + "edition": "2021", + "version": "0.11.0" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -48162,6 +50969,60 @@ ], "license_file": "LICENSE.md" }, + "pem-rfc7468 0.6.0": { + "name": "pem-rfc7468", + "version": "0.6.0", + "package_url": "https://github.com/RustCrypto/formats/tree/master/pem-rfc7468", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/pem-rfc7468/0.6.0/download", + "sha256": "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" + } + }, + "targets": [ + { + "Library": { + "crate_name": "pem_rfc7468", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "pem_rfc7468", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "base64ct 1.6.0", + "target": "base64ct" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.6.0" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "pem-rfc7468 0.7.0": { "name": "pem-rfc7468", "version": "0.7.0", @@ -49465,6 +52326,116 @@ ], "license_file": "LICENSE-APACHE" }, + "pkcs11 0.5.0": { + "name": "pkcs11", + "version": "0.5.0", + "package_url": "https://github.com/mheese/rust-pkcs11", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/pkcs11/0.5.0/download", + "sha256": "3aca6d67e4c8613bfe455599d0233d00735f85df2001f6bfd9bb7ac0496b10af" + } + }, + "targets": [ + { + "Library": { + "crate_name": "pkcs11", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "pkcs11", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "libloading 0.5.2", + "target": "libloading" + }, + { + "id": "num-bigint 0.2.6", + "target": "num_bigint" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.5.0" + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": "LICENSE" + }, + "pkcs8 0.9.0": { + "name": "pkcs8", + "version": "0.9.0", + "package_url": "https://github.com/RustCrypto/formats/tree/master/pkcs8", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/pkcs8/0.9.0/download", + "sha256": "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" + } + }, + "targets": [ + { + "Library": { + "crate_name": "pkcs8", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "pkcs8", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "pem" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "der 0.6.1", + "target": "der" + }, + { + "id": "spki 0.6.0", + "target": "spki" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.9.0" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "pkcs8 0.10.2": { "name": "pkcs8", "version": "0.10.2", @@ -49780,7 +52751,7 @@ "target": "reqwest" }, { - "id": "schemars 0.8.16", + "id": "schemars 0.8.21", "target": "schemars" }, { @@ -49997,6 +52968,69 @@ ], "license_file": "LICENSE-APACHE" }, + "polyval 0.6.2": { + "name": "polyval", + "version": "0.6.2", + "package_url": "https://github.com/RustCrypto/universal-hashes", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/polyval/0.6.2/download", + "sha256": "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" + } + }, + "targets": [ + { + "Library": { + "crate_name": "polyval", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "polyval", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "opaque-debug 0.3.0", + "target": "opaque_debug" + }, + { + "id": "universal-hash 0.5.1", + "target": "universal_hash" + } + ], + "selects": { + "cfg(any(target_arch = \"aarch64\", target_arch = \"x86_64\", target_arch = \"x86\"))": [ + { + "id": "cpufeatures 0.2.9", + "target": "cpufeatures" + } + ] + } + }, + "edition": "2021", + "version": "0.6.2" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "portable-atomic 1.4.3": { "name": "portable-atomic", "version": "1.4.3", @@ -53075,14 +56109,14 @@ ], "license_file": "LICENSE" }, - "pulley-interpreter 28.0.0": { + "pulley-interpreter 29.0.1": { "name": "pulley-interpreter", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime/tree/main/pulley", "repository": { "Http": { - "url": "https://static.crates.io/crates/pulley-interpreter/28.0.0/download", - "sha256": "403a1a95f4c18a45c86c7bff13df00347afd0abcbf2e54af273c837339ffcf77" + "url": "https://static.crates.io/crates/pulley-interpreter/29.0.1/download", + "sha256": "62d95f8575df49a2708398182f49a888cf9dc30210fb1fd2df87c889edcee75d" } }, "targets": [ @@ -53107,7 +56141,7 @@ "deps": { "common": [ { - "id": "cranelift-bitset 0.115.0", + "id": "cranelift-bitset 0.116.1", "target": "cranelift_bitset" }, { @@ -53122,7 +56156,7 @@ "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -59279,6 +62313,62 @@ ], "license_file": "LICENSE-APACHE" }, + "rfc6979 0.3.1": { + "name": "rfc6979", + "version": "0.3.1", + "package_url": "https://github.com/RustCrypto/signatures/tree/master/rfc6979", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/rfc6979/0.3.1/download", + "sha256": "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" + } + }, + "targets": [ + { + "Library": { + "crate_name": "rfc6979", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "rfc6979", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "crypto-bigint 0.4.9", + "target": "crypto_bigint" + }, + { + "id": "hmac 0.12.1", + "target": "hmac" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.3.1" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "rfc6979 0.4.0": { "name": "rfc6979", "version": "0.4.0", @@ -62183,7 +65273,7 @@ "target": "serde_json" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" }, { @@ -63263,14 +66353,14 @@ ], "license_file": "LICENSE.md" }, - "schemars 0.8.16": { + "schemars 0.8.21": { "name": "schemars", - "version": "0.8.16", + "version": "0.8.21", "package_url": "https://github.com/GREsau/schemars", "repository": { "Http": { - "url": "https://static.crates.io/crates/schemars/0.8.16/download", - "sha256": "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" + "url": "https://static.crates.io/crates/schemars/0.8.21/download", + "sha256": "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" } }, "targets": [ @@ -63326,7 +66416,7 @@ "alias": "indexmap2" }, { - "id": "schemars 0.8.16", + "id": "schemars 0.8.21", "target": "build_script_build" }, { @@ -63344,13 +66434,13 @@ "proc_macro_deps": { "common": [ { - "id": "schemars_derive 0.8.16", + "id": "schemars_derive 0.8.21", "target": "schemars_derive" } ], "selects": {} }, - "version": "0.8.16" + "version": "0.8.21" }, "build_script_attrs": { "compile_data_glob": [ @@ -63366,14 +66456,14 @@ ], "license_file": "LICENSE" }, - "schemars_derive 0.8.16": { + "schemars_derive 0.8.21": { "name": "schemars_derive", - "version": "0.8.16", + "version": "0.8.21", "package_url": "https://github.com/GREsau/schemars", "repository": { "Http": { - "url": "https://static.crates.io/crates/schemars_derive/0.8.16/download", - "sha256": "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" + "url": "https://static.crates.io/crates/schemars_derive/0.8.21/download", + "sha256": "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" } }, "targets": [ @@ -63406,18 +66496,18 @@ "target": "quote" }, { - "id": "serde_derive_internals 0.26.0", + "id": "serde_derive_internals 0.29.1", "target": "serde_derive_internals" }, { - "id": "syn 1.0.109", + "id": "syn 2.0.87", "target": "syn" } ], "selects": {} }, "edition": "2021", - "version": "0.8.16" + "version": "0.8.21" }, "license": "MIT", "license_ids": [ @@ -63727,6 +66817,90 @@ ], "license_file": null }, + "sec1 0.3.0": { + "name": "sec1", + "version": "0.3.0", + "package_url": "https://github.com/RustCrypto/formats/tree/master/sec1", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/sec1/0.3.0/download", + "sha256": "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" + } + }, + "targets": [ + { + "Library": { + "crate_name": "sec1", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "sec1", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "base16ct", + "default", + "der", + "generic-array", + "pem", + "pkcs8", + "point", + "std", + "subtle", + "zeroize" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "base16ct 0.1.1", + "target": "base16ct" + }, + { + "id": "der 0.6.1", + "target": "der" + }, + { + "id": "generic-array 0.14.7", + "target": "generic_array" + }, + { + "id": "pkcs8 0.9.0", + "target": "pkcs8" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.3.0" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "sec1 0.7.3": { "name": "sec1", "version": "0.7.3", @@ -64422,6 +67596,77 @@ ], "license_file": "LICENSE-APACHE" }, + "security-framework 3.0.1": { + "name": "security-framework", + "version": "3.0.1", + "package_url": "https://github.com/kornelski/rust-security-framework", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/security-framework/3.0.1/download", + "sha256": "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" + } + }, + "targets": [ + { + "Library": { + "crate_name": "security_framework", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "security_framework", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "OSX_10_12", + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "bitflags 2.6.0", + "target": "bitflags" + }, + { + "id": "core-foundation 0.10.0", + "target": "core_foundation" + }, + { + "id": "core-foundation-sys 0.8.7", + "target": "core_foundation_sys" + }, + { + "id": "libc 0.2.158", + "target": "libc" + }, + { + "id": "security-framework-sys 2.12.0", + "target": "security_framework_sys" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "3.0.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "security-framework-sys 2.12.0": { "name": "security-framework-sys", "version": "2.12.0", @@ -65112,14 +68357,14 @@ ], "license_file": "LICENSE-APACHE" }, - "serde_derive_internals 0.26.0": { + "serde_derive_internals 0.29.1": { "name": "serde_derive_internals", - "version": "0.26.0", + "version": "0.29.1", "package_url": "https://github.com/serde-rs/serde", "repository": { "Http": { - "url": "https://static.crates.io/crates/serde_derive_internals/0.26.0/download", - "sha256": "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" + "url": "https://static.crates.io/crates/serde_derive_internals/0.29.1/download", + "sha256": "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" } }, "targets": [ @@ -65152,14 +68397,14 @@ "target": "quote" }, { - "id": "syn 1.0.109", + "id": "syn 2.0.87", "target": "syn" } ], "selects": {} }, "edition": "2015", - "version": "0.26.0" + "version": "0.29.1" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -66485,6 +69730,52 @@ ], "license_file": "LICENSE" }, + "shell-words 1.1.0": { + "name": "shell-words", + "version": "1.1.0", + "package_url": "https://github.com/tmiasko/shell-words", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/shell-words/1.1.0/download", + "sha256": "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + } + }, + "targets": [ + { + "Library": { + "crate_name": "shell_words", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "shell_words", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "edition": "2015", + "version": "1.1.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "shlex 1.3.0": { "name": "shlex", "version": "1.3.0", @@ -66727,6 +70018,69 @@ ], "license_file": "LICENSE-APACHE" }, + "signature 1.6.4": { + "name": "signature", + "version": "1.6.4", + "package_url": "https://github.com/RustCrypto/traits/tree/master/signature", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/signature/1.6.4/download", + "sha256": "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "signature", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "signature", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "digest", + "digest-preview", + "hazmat-preview", + "rand-preview", + "rand_core", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "digest 0.10.7", + "target": "digest" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.6.4" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "signature 2.2.0": { "name": "signature", "version": "2.2.0", @@ -68313,6 +71667,66 @@ ], "license_file": "LICENSE" }, + "spki 0.6.0": { + "name": "spki", + "version": "0.6.0", + "package_url": "https://github.com/RustCrypto/formats/tree/master/spki", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/spki/0.6.0/download", + "sha256": "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "spki", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "spki", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "base64ct", + "pem" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "base64ct 1.6.0", + "target": "base64ct" + }, + { + "id": "der 0.6.1", + "target": "der" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.6.0" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "spki 0.7.3": { "name": "spki", "version": "0.7.3", @@ -70676,14 +74090,14 @@ ], "license_file": "LICENSE-APACHE" }, - "target-lexicon 0.12.16": { + "target-lexicon 0.13.1": { "name": "target-lexicon", - "version": "0.12.16", + "version": "0.13.1", "package_url": "https://github.com/bytecodealliance/target-lexicon", "repository": { "Http": { - "url": "https://static.crates.io/crates/target-lexicon/0.12.16/download", - "sha256": "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + "url": "https://static.crates.io/crates/target-lexicon/0.13.1/download", + "sha256": "dc12939a1c9b9d391e0b7135f72fd30508b73450753e28341fed159317582a77" } }, "targets": [ @@ -70726,14 +74140,14 @@ "deps": { "common": [ { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "build_script_build" } ], "selects": {} }, "edition": "2018", - "version": "0.12.16" + "version": "0.13.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -71669,14 +75083,14 @@ ], "license_file": "LICENSE-APACHE" }, - "thiserror 2.0.3": { + "thiserror 2.0.11": { "name": "thiserror", - "version": "2.0.3", + "version": "2.0.11", "package_url": "https://github.com/dtolnay/thiserror", "repository": { "Http": { - "url": "https://static.crates.io/crates/thiserror/2.0.3/download", - "sha256": "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" + "url": "https://static.crates.io/crates/thiserror/2.0.11/download", + "sha256": "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" } }, "targets": [ @@ -71720,7 +75134,7 @@ "deps": { "common": [ { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "build_script_build" } ], @@ -71730,13 +75144,13 @@ "proc_macro_deps": { "common": [ { - "id": "thiserror-impl 2.0.3", + "id": "thiserror-impl 2.0.11", "target": "thiserror_impl" } ], "selects": {} }, - "version": "2.0.3" + "version": "2.0.11" }, "build_script_attrs": { "compile_data_glob": [ @@ -71809,14 +75223,14 @@ ], "license_file": "LICENSE-APACHE" }, - "thiserror-impl 2.0.3": { + "thiserror-impl 2.0.11": { "name": "thiserror-impl", - "version": "2.0.3", + "version": "2.0.11", "package_url": "https://github.com/dtolnay/thiserror", "repository": { "Http": { - "url": "https://static.crates.io/crates/thiserror-impl/2.0.3/download", - "sha256": "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" + "url": "https://static.crates.io/crates/thiserror-impl/2.0.11/download", + "sha256": "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" } }, "targets": [ @@ -71856,7 +75270,7 @@ "selects": {} }, "edition": "2021", - "version": "2.0.3" + "version": "2.0.11" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -72272,6 +75686,8 @@ "local-offset", "macros", "parsing", + "serde", + "serde-human-readable", "std" ], "selects": {} @@ -72294,6 +75710,10 @@ "id": "powerfmt 0.2.0", "target": "powerfmt" }, + { + "id": "serde 1.0.217", + "target": "serde" + }, { "id": "time-core 0.1.2", "target": "time_core" @@ -72632,7 +76052,8 @@ "crate_features": { "common": [ "formatting", - "parsing" + "parsing", + "serde" ], "selects": {} }, @@ -72659,6 +76080,110 @@ ], "license_file": "LICENSE-Apache" }, + "tiny-bip39 1.0.0": { + "name": "tiny-bip39", + "version": "1.0.0", + "package_url": "https://github.com/maciejhirsz/tiny-bip39/", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/tiny-bip39/1.0.0/download", + "sha256": "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" + } + }, + "targets": [ + { + "Library": { + "crate_name": "bip39", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "bip39", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "chinese-simplified", + "chinese-traditional", + "default", + "french", + "italian", + "japanese", + "korean", + "spanish" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "anyhow 1.0.93", + "target": "anyhow" + }, + { + "id": "hmac 0.12.1", + "target": "hmac" + }, + { + "id": "once_cell 1.19.0", + "target": "once_cell" + }, + { + "id": "pbkdf2 0.11.0", + "target": "pbkdf2" + }, + { + "id": "rand 0.8.5", + "target": "rand" + }, + { + "id": "rustc-hash 1.1.0", + "target": "rustc_hash" + }, + { + "id": "sha2 0.10.8", + "target": "sha2" + }, + { + "id": "thiserror 1.0.68", + "target": "thiserror" + }, + { + "id": "unicode-normalization 0.1.22", + "target": "unicode_normalization" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": { + "cfg(target_arch = \"wasm32\")": [ + { + "id": "wasm-bindgen 0.2.95", + "target": "wasm_bindgen" + } + ] + } + }, + "edition": "2018", + "version": "1.0.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "tiny-keccak 2.0.2": { "name": "tiny-keccak", "version": "2.0.2", @@ -79749,7 +83274,7 @@ "target": "anyhow" }, { - "id": "arbitrary 1.3.2", + "id": "arbitrary 1.4.1", "target": "arbitrary" }, { @@ -80267,14 +83792,14 @@ ], "license_file": null }, - "wasmtime 28.0.0": { + "wasmtime 29.0.1": { "name": "wasmtime", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime/28.0.0/download", - "sha256": "f639ecae347b9a2227e453a7b7671e84370a0b61f47a15e0390fe9b7725e47b3" + "url": "https://static.crates.io/crates/wasmtime/29.0.1/download", + "sha256": "11976a250672556d1c4c04c6d5d7656ac9192ac9edc42a4587d6c21460010e69" } }, "targets": [ @@ -80351,10 +83876,6 @@ "id": "libc 0.2.158", "target": "libc" }, - { - "id": "libm 0.2.8", - "target": "libm" - }, { "id": "log 0.4.20", "target": "log" @@ -80388,7 +83909,7 @@ "target": "sptr" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" }, { @@ -80396,27 +83917,31 @@ "target": "wasmparser" }, { - "id": "wasmtime 28.0.0", + "id": "wasmtime 29.0.1", "target": "build_script_build" }, { - "id": "wasmtime-asm-macros 28.0.0", + "id": "wasmtime-asm-macros 29.0.1", "target": "wasmtime_asm_macros" }, { - "id": "wasmtime-cranelift 28.0.0", + "id": "wasmtime-cranelift 29.0.1", "target": "wasmtime_cranelift" }, { - "id": "wasmtime-environ 28.0.0", + "id": "wasmtime-environ 29.0.1", "target": "wasmtime_environ" }, { - "id": "wasmtime-jit-icache-coherence 28.0.0", + "id": "wasmtime-jit-icache-coherence 29.0.1", "target": "wasmtime_jit_icache_coherence" }, { - "id": "wasmtime-slab 28.0.0", + "id": "wasmtime-math 29.0.1", + "target": "wasmtime_math" + }, + { + "id": "wasmtime-slab 29.0.1", "target": "wasmtime_slab" } ], @@ -80649,7 +84174,7 @@ "target": "serde_derive" }, { - "id": "wasmtime-versioned-export-macros 28.0.0", + "id": "wasmtime-versioned-export-macros 29.0.1", "target": "wasmtime_versioned_export_macros" } ], @@ -80676,7 +84201,7 @@ ], "selects": {} }, - "version": "28.0.0" + "version": "29.0.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -80697,7 +84222,7 @@ "proc_macro_deps": { "common": [ { - "id": "wasmtime-versioned-export-macros 28.0.0", + "id": "wasmtime-versioned-export-macros 29.0.1", "target": "wasmtime_versioned_export_macros" } ], @@ -80710,14 +84235,14 @@ ], "license_file": "LICENSE" }, - "wasmtime-asm-macros 28.0.0": { + "wasmtime-asm-macros 29.0.1": { "name": "wasmtime-asm-macros", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-asm-macros/28.0.0/download", - "sha256": "882a18800471cfc063c8b3ccf75723784acc3fd534009ac09421f2fac2fcdcec" + "url": "https://static.crates.io/crates/wasmtime-asm-macros/29.0.1/download", + "sha256": "1f178b0d125201fbe9f75beaf849bd3e511891f9e45ba216a5b620802ccf64f2" } }, "targets": [ @@ -80749,7 +84274,7 @@ "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -80757,14 +84282,14 @@ ], "license_file": null }, - "wasmtime-component-macro 28.0.0": { + "wasmtime-component-macro 29.0.1": { "name": "wasmtime-component-macro", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-component-macro/28.0.0/download", - "sha256": "eb5c0a77c9e1927c3d471f53cc13767c3d3438e5d5ffd394e3eb31c86445fd60" + "url": "https://static.crates.io/crates/wasmtime-component-macro/29.0.1/download", + "sha256": "d74de6592ed945d0a602f71243982a304d5d02f1e501b638addf57f42d57dfaf" } }, "targets": [ @@ -80817,15 +84342,15 @@ "target": "syn" }, { - "id": "wasmtime-component-macro 28.0.0", + "id": "wasmtime-component-macro 29.0.1", "target": "build_script_build" }, { - "id": "wasmtime-component-util 28.0.0", + "id": "wasmtime-component-util 29.0.1", "target": "wasmtime_component_util" }, { - "id": "wasmtime-wit-bindgen 28.0.0", + "id": "wasmtime-wit-bindgen 29.0.1", "target": "wasmtime_wit_bindgen" }, { @@ -80836,7 +84361,7 @@ "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -80852,14 +84377,14 @@ ], "license_file": null }, - "wasmtime-component-util 28.0.0": { + "wasmtime-component-util 29.0.1": { "name": "wasmtime-component-util", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-component-util/28.0.0/download", - "sha256": "43702ca98bf5162eca0573db691ed9ecd36d716f8c6688410fe26ec16b6f9bcb" + "url": "https://static.crates.io/crates/wasmtime-component-util/29.0.1/download", + "sha256": "707dc7b3c112ab5a366b30cfe2fb5b2f8e6a0f682f16df96a5ec582bfe6f056e" } }, "targets": [ @@ -80882,7 +84407,7 @@ "**" ], "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -80890,14 +84415,14 @@ ], "license_file": null }, - "wasmtime-cranelift 28.0.0": { + "wasmtime-cranelift 29.0.1": { "name": "wasmtime-cranelift", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-cranelift/28.0.0/download", - "sha256": "20070aa5b75080a8932ec328419faf841df2bc6ceb16b55b0df2b952098392a2" + "url": "https://static.crates.io/crates/wasmtime-cranelift/29.0.1/download", + "sha256": "366be722674d4bf153290fbcbc4d7d16895cc82fb3e869f8d550ff768f9e9e87" } }, "targets": [ @@ -80937,23 +84462,23 @@ "target": "cfg_if" }, { - "id": "cranelift-codegen 0.115.0", + "id": "cranelift-codegen 0.116.1", "target": "cranelift_codegen" }, { - "id": "cranelift-control 0.115.0", + "id": "cranelift-control 0.116.1", "target": "cranelift_control" }, { - "id": "cranelift-entity 0.115.0", + "id": "cranelift-entity 0.116.1", "target": "cranelift_entity" }, { - "id": "cranelift-frontend 0.115.0", + "id": "cranelift-frontend 0.116.1", "target": "cranelift_frontend" }, { - "id": "cranelift-native 0.115.0", + "id": "cranelift-native 0.116.1", "target": "cranelift_native" }, { @@ -80977,7 +84502,7 @@ "target": "smallvec" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" }, { @@ -80989,7 +84514,7 @@ "target": "wasmparser" }, { - "id": "wasmtime-environ 28.0.0", + "id": "wasmtime-environ 29.0.1", "target": "wasmtime_environ" } ], @@ -80999,13 +84524,13 @@ "proc_macro_deps": { "common": [ { - "id": "wasmtime-versioned-export-macros 28.0.0", + "id": "wasmtime-versioned-export-macros 29.0.1", "target": "wasmtime_versioned_export_macros" } ], "selects": {} }, - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -81013,14 +84538,14 @@ ], "license_file": "LICENSE" }, - "wasmtime-environ 28.0.0": { + "wasmtime-environ 29.0.1": { "name": "wasmtime-environ", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-environ/28.0.0/download", - "sha256": "2604ddb24879d4dc1dedcb7081d7a8e017259bce916fdae097a97db52cbaab80" + "url": "https://static.crates.io/crates/wasmtime-environ/29.0.1/download", + "sha256": "cdadc1af7097347aa276a4f008929810f726b5b46946971c660b6d421e9994ad" } }, "targets": [ @@ -81058,11 +84583,11 @@ "target": "anyhow" }, { - "id": "cranelift-bitset 0.115.0", + "id": "cranelift-bitset 0.116.1", "target": "cranelift_bitset" }, { - "id": "cranelift-entity 0.115.0", + "id": "cranelift-entity 0.116.1", "target": "cranelift_entity" }, { @@ -81094,7 +84619,7 @@ "target": "smallvec" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" }, { @@ -81122,7 +84647,7 @@ ], "selects": {} }, - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -81130,14 +84655,14 @@ ], "license_file": "LICENSE" }, - "wasmtime-fiber 28.0.0": { + "wasmtime-fiber 29.0.1": { "name": "wasmtime-fiber", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-fiber/28.0.0/download", - "sha256": "98593412d2b167ebe2b59d4a17a184978a72f976b53b3a0ec05629451079ac1d" + "url": "https://static.crates.io/crates/wasmtime-fiber/29.0.1/download", + "sha256": "ccba90d4119f081bca91190485650730a617be1fff5228f8c4757ce133d21117" } }, "targets": [ @@ -81182,11 +84707,11 @@ "target": "cfg_if" }, { - "id": "wasmtime-asm-macros 28.0.0", + "id": "wasmtime-asm-macros 29.0.1", "target": "wasmtime_asm_macros" }, { - "id": "wasmtime-fiber 28.0.0", + "id": "wasmtime-fiber 29.0.1", "target": "build_script_build" } ], @@ -81209,13 +84734,13 @@ "proc_macro_deps": { "common": [ { - "id": "wasmtime-versioned-export-macros 28.0.0", + "id": "wasmtime-versioned-export-macros 29.0.1", "target": "wasmtime_versioned_export_macros" } ], "selects": {} }, - "version": "28.0.0" + "version": "29.0.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -81236,7 +84761,7 @@ "proc_macro_deps": { "common": [ { - "id": "wasmtime-versioned-export-macros 28.0.0", + "id": "wasmtime-versioned-export-macros 29.0.1", "target": "wasmtime_versioned_export_macros" } ], @@ -81249,14 +84774,14 @@ ], "license_file": "LICENSE" }, - "wasmtime-jit-icache-coherence 28.0.0": { + "wasmtime-jit-icache-coherence 29.0.1": { "name": "wasmtime-jit-icache-coherence", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-jit-icache-coherence/28.0.0/download", - "sha256": "d40d7722b9e1fbeae135715710a8a2570b1e6cf72b74dd653962d89831c6c70d" + "url": "https://static.crates.io/crates/wasmtime-jit-icache-coherence/29.0.1/download", + "sha256": "ec5e8552e01692e6c2e5293171704fed8abdec79d1a6995a0870ab190e5747d1" } }, "targets": [ @@ -81305,7 +84830,7 @@ } }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -81313,14 +84838,67 @@ ], "license_file": null }, - "wasmtime-slab 28.0.0": { + "wasmtime-math 29.0.1": { + "name": "wasmtime-math", + "version": "29.0.1", + "package_url": "https://github.com/bytecodealliance/wasmtime", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/wasmtime-math/29.0.1/download", + "sha256": "29210ec2aa25e00f4d54605cedaf080f39ec01a872c5bd520ad04c67af1dde17" + } + }, + "targets": [ + { + "Library": { + "crate_name": "wasmtime_math", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "wasmtime_math", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "libm 0.2.8", + "target": "libm" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "29.0.1" + }, + "license": "Apache-2.0 WITH LLVM-exception", + "license_ids": [ + "Apache-2.0" + ], + "license_file": null + }, + "wasmtime-slab 29.0.1": { "name": "wasmtime-slab", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-slab/28.0.0/download", - "sha256": "8579c335220b4ece9aa490a0e8b46de78cd342b195ab21ff981d095e14b52383" + "url": "https://static.crates.io/crates/wasmtime-slab/29.0.1/download", + "sha256": "fcb5821a96fa04ac14bc7b158bb3d5cd7729a053db5a74dad396cd513a5e5ccf" } }, "targets": [ @@ -81343,7 +84921,7 @@ "**" ], "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -81351,14 +84929,14 @@ ], "license_file": null }, - "wasmtime-versioned-export-macros 28.0.0": { + "wasmtime-versioned-export-macros 29.0.1": { "name": "wasmtime-versioned-export-macros", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-versioned-export-macros/28.0.0/download", - "sha256": "d7de0a56fb0a69b185968f2d7a9ba54750920a806470dff7ad8de91ac06d277e" + "url": "https://static.crates.io/crates/wasmtime-versioned-export-macros/29.0.1/download", + "sha256": "86ff86db216dc0240462de40c8290887a613dddf9685508eb39479037ba97b5b" } }, "targets": [ @@ -81398,7 +84976,7 @@ "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -81406,14 +84984,14 @@ ], "license_file": null }, - "wasmtime-winch 28.0.0": { + "wasmtime-winch 29.0.1": { "name": "wasmtime-winch", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-winch/28.0.0/download", - "sha256": "abd309943c443f5590d12f9aba9ba63c481091c955a0a14de0c2a9e0e3aaeca9" + "url": "https://static.crates.io/crates/wasmtime-winch/29.0.1/download", + "sha256": "fdbabfb8f20502d5e1d81092b9ead3682ae59988487aafcd7567387b7a43cf8f" } }, "targets": [ @@ -81442,7 +85020,7 @@ "target": "anyhow" }, { - "id": "cranelift-codegen 0.115.0", + "id": "cranelift-codegen 0.116.1", "target": "cranelift_codegen" }, { @@ -81454,7 +85032,7 @@ "target": "object" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" }, { @@ -81462,22 +85040,22 @@ "target": "wasmparser" }, { - "id": "wasmtime-cranelift 28.0.0", + "id": "wasmtime-cranelift 29.0.1", "target": "wasmtime_cranelift" }, { - "id": "wasmtime-environ 28.0.0", + "id": "wasmtime-environ 29.0.1", "target": "wasmtime_environ" }, { - "id": "winch-codegen 28.0.0", + "id": "winch-codegen 29.0.1", "target": "winch_codegen" } ], "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -81485,14 +85063,14 @@ ], "license_file": "LICENSE" }, - "wasmtime-wit-bindgen 28.0.0": { + "wasmtime-wit-bindgen 29.0.1": { "name": "wasmtime-wit-bindgen", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-wit-bindgen/28.0.0/download", - "sha256": "969f83022dac3435d6469edb582ceed04cfe32aa44dc3ef16e5cb55574633df8" + "url": "https://static.crates.io/crates/wasmtime-wit-bindgen/29.0.1/download", + "sha256": "8358319c2dd1e4db79e3c1c5d3a5af84956615343f9f89f4e4996a36816e06e6" } }, "targets": [ @@ -81536,7 +85114,7 @@ "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -82505,14 +86083,14 @@ ], "license_file": null }, - "winch-codegen 28.0.0": { + "winch-codegen 29.0.1": { "name": "winch-codegen", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/winch-codegen/28.0.0/download", - "sha256": "9110decc2983ed94de904804dcd979ba59cbabc78a94fec6b1d8468ec513d0f6" + "url": "https://static.crates.io/crates/winch-codegen/29.0.1/download", + "sha256": "2f849ef2c5f46cb0a20af4b4487aaa239846e52e2c03f13fa3c784684552859c" } }, "targets": [ @@ -82553,7 +86131,7 @@ "target": "anyhow" }, { - "id": "cranelift-codegen 0.115.0", + "id": "cranelift-codegen 0.116.1", "target": "cranelift_codegen" }, { @@ -82569,30 +86147,34 @@ "target": "smallvec" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" }, + { + "id": "thiserror 1.0.68", + "target": "thiserror" + }, { "id": "wasmparser 0.221.2", "target": "wasmparser" }, { - "id": "wasmtime-cranelift 28.0.0", + "id": "wasmtime-cranelift 29.0.1", "target": "wasmtime_cranelift" }, { - "id": "wasmtime-environ 28.0.0", + "id": "wasmtime-environ 29.0.1", "target": "wasmtime_environ" }, { - "id": "winch-codegen 28.0.0", + "id": "winch-codegen 29.0.1", "target": "build_script_build" } ], "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -83093,6 +86675,7 @@ "Win32_Networking", "Win32_Networking_WinSock", "Win32_Security", + "Win32_Security_Credentials", "Win32_Storage", "Win32_Storage_FileSystem", "Win32_System", @@ -86667,7 +90250,7 @@ } }, "binary_crates": [ - "canbench 0.1.8", + "canbench 0.1.9", "ic-wasm 0.8.4", "metrics-proxy 0.1.0" ], @@ -87739,7 +91322,7 @@ "addr 0.15.6", "aide 0.13.4", "anyhow 1.0.93", - "arbitrary 1.3.2", + "arbitrary 1.4.1", "arc-swap 1.7.1", "arrayvec 0.7.4", "askama 0.12.1", @@ -87775,8 +91358,8 @@ "byteorder 1.5.0", "bytes 1.9.0", "cached 0.49.2", - "canbench 0.1.8", - "canbench-rs 0.1.8", + "canbench 0.1.9", + "canbench-rs 0.1.9", "candid 0.10.13", "candid_parser 0.1.2", "cargo_metadata 0.14.2", @@ -87802,6 +91385,7 @@ "curve25519-dalek 4.1.3", "cvt 0.1.2", "dashmap 5.5.3", + "dfx-core 0.1.3", "dyn-clone 1.0.14", "ed25519-dalek 2.1.1", "educe 0.4.23", @@ -87810,7 +91394,7 @@ "escargot 0.5.8", "ethers-core 2.0.10", "ethnum 1.4.0", - "evm_rpc_types 1.2.0", + "evm_rpc_types 1.3.0", "exec 0.3.1", "eyre 0.6.8", "ff 0.12.1", @@ -87843,9 +91427,9 @@ "ic-canister-log 0.2.0", "ic-canister-sig-creation 1.1.0", "ic-cbor 3.0.2", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-cdk 0.18.0-alpha.1", - "ic-cdk-macros 0.9.0", + "ic-cdk-macros 0.17.1", "ic-cdk-macros 0.18.0-alpha.1", "ic-cdk-timers 0.11.0", "ic-certificate-verification 3.0.2", @@ -87853,6 +91437,7 @@ "ic-certified-map 0.3.4", "ic-http-certification 3.0.2", "ic-http-gateway 0.1.0", + "ic-management-canister-types 0.1.0", "ic-metrics-encoder 1.1.1", "ic-response-verification 3.0.2", "ic-sha3 1.0.0", @@ -87883,7 +91468,7 @@ "json5 0.4.1", "k256 0.13.4", "k8s-openapi 0.22.0", - "kube 0.93.1", + "kube 0.94.2", "lazy_static 1.4.0", "leb128 0.2.5", "libc 0.2.158", @@ -87899,6 +91484,7 @@ "mach2 0.4.2", "maplit 1.0.2", "maxminddb 0.24.0", + "memmap2 0.9.5", "metrics-proxy 0.1.0", "minicbor 0.19.1", "minicbor-derive 0.13.0", @@ -87977,7 +91563,7 @@ "rustls-pemfile 2.2.0", "rustversion 1.0.14", "rusty-fork 0.3.0", - "schemars 0.8.16", + "schemars 0.8.21", "scoped_threadpool 0.1.9", "scopeguard 1.2.0", "scraper 0.17.1", @@ -88018,7 +91604,7 @@ "test-strategy 0.3.1", "tester 0.7.0", "textplots 0.8.4", - "thiserror 2.0.3", + "thiserror 2.0.11", "thousands 0.2.0", "threadpool 1.8.1", "tikv-jemalloc-ctl 0.5.4", @@ -88060,8 +91646,8 @@ "wasm-smith 0.212.0", "wasmparser 0.217.0", "wasmprinter 0.217.0", - "wasmtime 28.0.0", - "wasmtime-environ 28.0.0", + "wasmtime 29.0.1", + "wasmtime-environ 29.0.1", "wast 212.0.0", "wat 1.212.0", "wee_alloc 0.4.5", @@ -88075,11 +91661,5 @@ "zstd 0.13.2" ], "direct_dev_deps": [], - "unused_patches": [ - { - "name": "jsonrpc", - "version": "0.12.1", - "source": "git+https://github.com/apoelstra/rust-jsonrpc?rev=e42044d#e42044d8e0896317488dfbd65eb5563d76e937fe" - } - ] + "unused_patches": [] } diff --git a/Cargo.Bazel.Fuzzing.toml.lock b/Cargo.Bazel.Fuzzing.toml.lock index 2eb3bdb7886..72474315264 100644 --- a/Cargo.Bazel.Fuzzing.toml.lock +++ b/Cargo.Bazel.Fuzzing.toml.lock @@ -257,6 +257,31 @@ dependencies = [ "generic-array", ] +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if 1.0.0", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + [[package]] name = "ahash" version = "0.7.8" @@ -419,9 +444,9 @@ checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] @@ -432,6 +457,17 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[package]] +name = "argon2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db4ce4441f99dbd377ca8a8f57b698c44d0d6e712d8329b5040da5a64aa1ce73" +dependencies = [ + "base64ct", + "blake2", + "password-hash", +] + [[package]] name = "arrayvec" version = "0.5.2" @@ -984,6 +1020,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + [[package]] name = "base16ct" version = "0.2.0" @@ -1145,17 +1187,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bip32" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" +dependencies = [ + "bs58 0.4.0", + "hmac", + "k256 0.11.6", + "once_cell", + "pbkdf2 0.11.0", + "rand_core 0.6.4", + "ripemd", + "sha2 0.10.8", + "subtle", + "zeroize", +] + [[package]] name = "bip32" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e141fb0f8be1c7b45887af94c88b182472b57c96b56773250ae00cd6a14a164" dependencies = [ - "bs58", + "bs58 0.5.0", "hmac", - "k256", + "k256 0.13.4", "once_cell", - "pbkdf2", + "pbkdf2 0.12.2", "rand_core 0.6.4", "ripemd", "sha2 0.10.8", @@ -1344,6 +1404,15 @@ dependencies = [ "wyz", ] +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + [[package]] name = "block-buffer" version = "0.9.0" @@ -1451,6 +1520,15 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +dependencies = [ + "sha2 0.9.9", +] + [[package]] name = "bs58" version = "0.5.0" @@ -1706,9 +1784,9 @@ dependencies = [ [[package]] name = "canbench" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb548f9e006ad29b160d37e07435c499af7d2741918e18d95ddc87dfe97a0b8d" +checksum = "c3eba78c84aa78e67f27c5c5a7d6c3d33cc301f95886171748e8f6ed8a31b258" dependencies = [ "canbench-rs", "candid", @@ -1728,9 +1806,9 @@ dependencies = [ [[package]] name = "canbench-rs" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497d900e11ab1891dd9743dd45dbeaada540ce323aa1adc7fc0ce1da2c6e86ff" +checksum = "588701e2d05679b79603acca6a6f8b78fe0d21f5f7a9c06fe689f769ae797008" dependencies = [ "canbench-rs-macros", "candid", @@ -1740,9 +1818,9 @@ dependencies = [ [[package]] name = "canbench-rs-macros" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5509bcfe6eeb86f057d46fbf20a2ba6b6bf9a1099b053a8f491cd7a909dfa6" +checksum = "e05fe21a7dfc85c3be8e40edbbcb3fe23b4c070fac4741eff18129f1d0f11aa9" dependencies = [ "proc-macro2", "quote", @@ -1999,7 +2077,7 @@ checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" dependencies = [ "glob", "libc", - "libloading", + "libloading 0.7.4", ] [[package]] @@ -2104,7 +2182,7 @@ dependencies = [ [[package]] name = "cloudflare" version = "0.12.0" -source = "git+https://github.com/dfinity/cloudflare-rs.git?rev=a6538a036926bd756986c9c0a5de356daef48881#a6538a036926bd756986c9c0a5de356daef48881" +source = "git+https://github.com/dfinity/cloudflare-rs.git?rev=8b011d170d9d61eaad77bb9645371f6219285104#8b011d170d9d61eaad77bb9645371f6219285104" dependencies = [ "chrono", "http 0.2.12", @@ -2319,6 +2397,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -2371,18 +2459,18 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac89549be94911dd0e839b4a7db99e9ed29c17517e1c026f61066884c168aa3c" +checksum = "e15d04a0ce86cb36ead88ad68cf693ffd6cda47052b9e0ac114bc47fd9cd23c4" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-bitset" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9bd49369f76c77e34e641af85d0956869237832c118964d08bf5f51f210875a" +checksum = "7c6e3969a7ce267259ce244b7867c5d3bc9e65b0a87e81039588dfdeaede9f34" dependencies = [ "serde", "serde_derive", @@ -2390,9 +2478,9 @@ dependencies = [ [[package]] name = "cranelift-codegen" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd96ce9cf8efebd7f5ab8ced5a0ce44250280bbae9f593d74a6d7effc3582a35" +checksum = "2c22032c4cb42558371cf516bb47f26cdad1819d3475c133e93c49f50ebf304e" dependencies = [ "bumpalo", "cranelift-bforest", @@ -2414,33 +2502,33 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a68e358827afe4bfb6239fcbf6fbd5ac56206ece8a99c8f5f9bbd518773281a" +checksum = "c904bc71c61b27fc57827f4a1379f29de64fe95653b620a3db77d59655eee0b8" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e184c9767afbe73d50c55ec29abcf4c32f9baf0d9d22b86d58c4d55e06dee181" +checksum = "40180f5497572f644ce88c255480981ae2ec1d7bb4d8e0c0136a13b87a2f2ceb" [[package]] name = "cranelift-control" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc7664f2a66f053e33f149e952bb5971d138e3af637f5097727ed6dc0ed95dd" +checksum = "26d132c6d0bd8a489563472afc171759da0707804a65ece7ceb15a8c6d7dd5ef" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "118597e3a9cf86c3556fa579a7a23b955fa18231651a52a77a2475d305a9cf84" +checksum = "4b2d0d9618275474fbf679dd018ac6e009acbd6ae6850f6a67be33fb3b00b323" dependencies = [ "cranelift-bitset", "serde", @@ -2449,9 +2537,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7638ea1efb069a0aa18d8ee67401b6b0d19f6bfe5de5e9ede348bfc80bb0d8c7" +checksum = "4fac41e16729107393174b0c9e3730fb072866100e1e64e80a1a963b2e484d57" dependencies = [ "cranelift-codegen", "log", @@ -2461,15 +2549,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c53e1152a0b01c4ed2b1e0535602b8e86458777dd9d18b28732b16325c7dc0" +checksum = "1ca20d576e5070044d0a72a9effc2deacf4d6aa650403189d8ea50126483944d" [[package]] name = "cranelift-native" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b7d8f895444fa52dd7bdd0bed11bf007a7fb43af65a6deac8fcc4094c6372f7" +checksum = "b8dee82f3f1f2c4cba9177f1cc5e350fe98764379bcd29340caa7b01f85076c7" dependencies = [ "cranelift-codegen", "libc", @@ -2610,6 +2698,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-bigint" version = "0.5.3" @@ -2677,6 +2777,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + [[package]] name = "ctrlc" version = "3.4.5" @@ -2698,7 +2807,7 @@ dependencies = [ "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", - "group", + "group 0.13.0", "rand_core 0.6.4", "rustc_version", "subtle", @@ -2847,6 +2956,31 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +[[package]] +name = "dbus" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" +dependencies = [ + "libc", + "libdbus-sys", + "winapi 0.3.9", +] + +[[package]] +name = "dbus-secret-service" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42a16374481d92aed73ae45b1f120207d8e71d24fb89f357fadbd8f946fd84b" +dependencies = [ + "dbus", + "futures-util", + "num", + "once_cell", + "openssl", + "rand 0.8.5", +] + [[package]] name = "debugid" version = "0.8.0" @@ -2856,6 +2990,17 @@ dependencies = [ "uuid", ] +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "pem-rfc7468 0.6.0", + "zeroize", +] + [[package]] name = "der" version = "0.7.8" @@ -2865,7 +3010,7 @@ dependencies = [ "const-oid", "der_derive", "flagset", - "pem-rfc7468", + "pem-rfc7468 0.7.0", "zeroize", ] @@ -2917,9 +3062,9 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", @@ -2939,6 +3084,64 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "dfx-core" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4be4fc6929580b0ef8ac3678c03f31b59ffb1aa0d90ab754842d40cfc5b4552" +dependencies = [ + "aes-gcm", + "argon2", + "backoff", + "bip32 0.4.0", + "byte-unit", + "bytes", + "candid", + "clap 4.5.20", + "dialoguer", + "directories-next", + "dunce", + "flate2", + "handlebars", + "hex", + "humantime-serde", + "ic-agent", + "ic-identity-hsm", + "ic-utils", + "itertools 0.10.5", + "k256 0.11.6", + "keyring", + "lazy_static", + "reqwest 0.12.9", + "ring 0.16.20", + "schemars", + "sec1 0.3.0", + "semver", + "serde", + "serde_json", + "sha2 0.10.8", + "slog", + "tar", + "tempfile", + "thiserror 1.0.68", + "time", + "tiny-bip39", + "url", +] + +[[package]] +name = "dialoguer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console 0.15.7", + "shell-words", + "tempfile", + "thiserror 1.0.68", + "zeroize", +] + [[package]] name = "diff" version = "0.1.13" @@ -3002,14 +3205,14 @@ dependencies = [ "bech32 0.9.1", "bincode", "bindgen 0.65.1", - "bip32", + "bip32 0.5.1", "bit-vec", "bitcoin 0.28.2", "bitcoin 0.32.5", "bitcoincore-rpc", "bitcoind", "bitflags 1.3.2", - "bs58", + "bs58 0.5.0", "build-info", "build-info-build", "by_address", @@ -3030,7 +3233,7 @@ dependencies = [ "ciborium", "cidr", "clap 4.5.20", - "cloudflare 0.12.0 (git+https://github.com/dfinity/cloudflare-rs.git?rev=a6538a036926bd756986c9c0a5de356daef48881)", + "cloudflare 0.12.0 (git+https://github.com/dfinity/cloudflare-rs.git?rev=8b011d170d9d61eaad77bb9645371f6219285104)", "colored", "comparable", "console 0.11.3", @@ -3044,6 +3247,7 @@ dependencies = [ "curve25519-dalek", "cvt", "dashmap 5.5.3", + "dfx-core", "dyn-clone", "ed25519-dalek", "educe", @@ -3064,7 +3268,7 @@ dependencies = [ "futures-util", "get_if_addrs", "getrandom", - "group", + "group 0.13.0", "hashlink", "hex", "hex-literal", @@ -3085,16 +3289,17 @@ dependencies = [ "ic-canister-log", "ic-canister-sig-creation", "ic-cbor", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-cdk 0.18.0-alpha.1", + "ic-cdk-macros 0.17.1", "ic-cdk-macros 0.18.0-alpha.1", - "ic-cdk-macros 0.9.0", "ic-cdk-timers", "ic-certificate-verification", "ic-certification 3.0.2", "ic-certified-map", "ic-http-certification", "ic-http-gateway", + "ic-management-canister-types", "ic-metrics-encoder", "ic-response-verification", "ic-sha3", @@ -3123,7 +3328,7 @@ dependencies = [ "itertools 0.12.0", "json-patch", "json5", - "k256", + "k256 0.13.4", "k8s-openapi", "kube", "lazy_static", @@ -3141,6 +3346,7 @@ dependencies = [ "mach2", "maplit", "maxminddb", + "memmap2 0.9.5", "metrics-proxy", "minicbor", "minicbor-derive", @@ -3152,7 +3358,7 @@ dependencies = [ "nix 0.24.3", "num-bigint 0.4.6", "num-bigint-dig", - "num-rational", + "num-rational 0.2.4", "num-traits", "num_cpus", "once_cell", @@ -3170,7 +3376,7 @@ dependencies = [ "pem 1.1.1", "pin-project-lite", "ping", - "pkcs8", + "pkcs8 0.10.2", "pkg-config", "pprof", "predicates", @@ -3236,7 +3442,7 @@ dependencies = [ "sha2 0.10.8", "sha3", "signal-hook", - "signature", + "signature 2.2.0", "simple_asn1", "simple_moving_average", "slog", @@ -3260,7 +3466,7 @@ dependencies = [ "test-strategy", "tester", "textplots", - "thiserror 2.0.3", + "thiserror 2.0.11", "thousands", "threadpool", "tikv-jemalloc-ctl", @@ -3317,6 +3523,16 @@ dependencies = [ "zstd", ] +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + [[package]] name = "dirs" version = "2.0.2" @@ -3407,6 +3623,12 @@ dependencies = [ "dtoa", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "duration-string" version = "0.3.0" @@ -3422,18 +3644,30 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] + [[package]] name = "ecdsa" version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der", + "der 0.7.8", "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "signature 2.2.0", + "spki 0.7.3", ] [[package]] @@ -3442,8 +3676,8 @@ version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "pkcs8", - "signature", + "pkcs8 0.10.2", + "signature 2.2.0", ] [[package]] @@ -3473,7 +3707,7 @@ dependencies = [ "rand_core 0.6.4", "serde", "sha2 0.10.8", - "signature", + "signature 2.2.0", "subtle", "zeroize", ] @@ -3502,22 +3736,43 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.7", + "ff 0.12.1", + "generic-array", + "group 0.12.1", + "pem-rfc7468 0.6.0", + "pkcs8 0.9.0", + "rand_core 0.6.4", + "sec1 0.3.0", + "subtle", + "zeroize", +] + [[package]] name = "elliptic-curve" version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "base16ct", - "crypto-bigint", + "base16ct 0.2.0", + "crypto-bigint 0.5.3", "digest 0.10.7", "ff 0.13.0", "generic-array", - "group", - "pem-rfc7468", - "pkcs8", + "group 0.13.0", + "pem-rfc7468 0.7.0", + "pkcs8 0.10.2", "rand_core 0.6.4", - "sec1", + "sec1 0.7.3", "subtle", "zeroize", ] @@ -3765,10 +4020,10 @@ dependencies = [ "bytes", "chrono", "const-hex", - "elliptic-curve", + "elliptic-curve 0.13.8", "ethabi", "generic-array", - "k256", + "k256 0.13.4", "num_enum", "open-fastrlp", "rand 0.8.5", @@ -3841,17 +4096,17 @@ dependencies = [ [[package]] name = "evm_rpc_types" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ed9ee7b89726f4a343208e9a89e9ad22fe7b4518b0d722973cc83274e7bf7f" +checksum = "fa134314bce7c35b9214710572fb7305edc7f4223c5bd03b5857ed08bbb05897" dependencies = [ "candid", "hex", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "num-bigint 0.4.6", "serde", "strum 0.26.3", - "thiserror 1.0.68", + "thiserror 2.0.11", "url", ] @@ -4019,6 +4274,21 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -4273,6 +4543,16 @@ dependencies = [ "wasi", ] +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + [[package]] name = "gimli" version = "0.26.2" @@ -4325,6 +4605,17 @@ dependencies = [ "smallvec", ] +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "group" version = "0.13.0" @@ -4380,6 +4671,20 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +[[package]] +name = "handlebars" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225" +dependencies = [ + "log", + "pest", + "pest_derive", + "serde", + "serde_json", + "thiserror 1.0.68", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -4941,10 +5246,10 @@ dependencies = [ "backoff", "cached 0.52.0", "candid", - "der", - "ecdsa", + "der 0.7.8", + "ecdsa 0.16.9", "ed25519-consensus", - "elliptic-curve", + "elliptic-curve 0.13.8", "futures-util", "hex", "http 1.2.0", @@ -4952,16 +5257,16 @@ dependencies = [ "ic-certification 3.0.2", "ic-transport-types 0.39.2", "ic-verify-bls-signature 0.5.0", - "k256", + "k256 0.13.4", "leb128", "p256", "pem 3.0.4", - "pkcs8", + "pkcs8 0.10.2", "rand 0.8.5", "rangemap", "reqwest 0.12.9", "ring 0.17.7", - "sec1", + "sec1 0.7.3", "serde", "serde_bytes", "serde_cbor", @@ -4969,7 +5274,7 @@ dependencies = [ "sha2 0.10.8", "simple_asn1", "stop-token", - "thiserror 2.0.3", + "thiserror 2.0.11", "time", "tokio", "tower-service", @@ -5025,7 +5330,7 @@ dependencies = [ "strum 0.26.3", "strum_macros 0.26.4", "systemstat", - "thiserror 2.0.3", + "thiserror 2.0.11", "tokio", "tokio-io-timeout", "tokio-rustls 0.26.0", @@ -5068,7 +5373,7 @@ source = "git+https://github.com/dfinity/ic-canister-sig-creation?rev=7f9e931954 dependencies = [ "candid", "hex", - "ic-cdk 0.17.0", + "ic-cdk 0.17.1", "ic-certification 3.0.2", "ic-representation-independent-hash", "lazy_static", @@ -5076,7 +5381,7 @@ dependencies = [ "serde_bytes", "serde_cbor", "sha2 0.10.8", - "thiserror 2.0.3", + "thiserror 2.0.11", ] [[package]] @@ -5107,25 +5412,12 @@ dependencies = [ [[package]] name = "ic-cdk" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8ecacd682fa05a985253592963306cb9799622d7b1cce4b1edb89c6ec85be1" -dependencies = [ - "candid", - "ic-cdk-macros 0.16.0", - "ic0 0.23.0", - "serde", - "serde_bytes", -] - -[[package]] -name = "ic-cdk" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2abdf9341da9f9f6b451a40609cb69645a05a8e9eb7784c16209f16f2c0f76f" +checksum = "122efbcb0af5280d408a75a57b7dc6e9d92893bf6ed9cc98fe4dcff51f18b67c" dependencies = [ "candid", - "ic-cdk-macros 0.17.0", + "ic-cdk-macros 0.17.1", "ic0 0.23.0", "serde", "serde_bytes", @@ -5141,7 +5433,7 @@ dependencies = [ "ic0 0.24.0-alpha.1", "serde", "serde_bytes", - "thiserror 2.0.3", + "thiserror 2.0.11", ] [[package]] @@ -5160,37 +5452,9 @@ dependencies = [ [[package]] name = "ic-cdk-macros" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fde5ca6ef1e69825c68916ff1bf7256b8f7ed69ac5ea3f1756f6e57f1503e27" -dependencies = [ - "candid", - "proc-macro2", - "quote", - "serde", - "serde_tokenstream 0.1.7", - "syn 1.0.109", -] - -[[package]] -name = "ic-cdk-macros" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4d857135deef20cc7ea8f3869a30cd9cfeb1392b3a81043790b2cd82adc3e0" -dependencies = [ - "candid", - "proc-macro2", - "quote", - "serde", - "serde_tokenstream 0.2.1", - "syn 2.0.87", -] - -[[package]] -name = "ic-cdk-macros" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8df41980e95dead28735ab0f748c75477b0c5eab37a09a5641c78ec406a1db0" +checksum = "c792bf0d1621c893ccf2bcdeac4ee70121103a03030a1827031a6b3c60488944" dependencies = [ "candid", "proc-macro2", @@ -5220,7 +5484,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb8fd812a9e26f6aa00594546f8fbf4d4853f39c3ba794c8ff11ecf86fd3c9e4" dependencies = [ "futures", - "ic-cdk 0.17.0", + "ic-cdk 0.17.1", "ic0 0.23.0", "serde", "serde_bytes", @@ -5317,6 +5581,31 @@ dependencies = [ "thiserror 1.0.68", ] +[[package]] +name = "ic-identity-hsm" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ebb94d7cb5be09bed47655008f0c2968a3a3253dcf680297f3e8475e4b317c4" +dependencies = [ + "hex", + "ic-agent", + "pkcs11", + "sha2 0.10.8", + "simple_asn1", + "thiserror 2.0.11", +] + +[[package]] +name = "ic-management-canister-types" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadff40906491c8c61a3c886cce4ee02f48a4798684d8a10e4a14891a217a284" +dependencies = [ + "candid", + "serde", + "serde_bytes", +] + [[package]] name = "ic-metrics-encoder" version = "1.1.1" @@ -5419,7 +5708,7 @@ dependencies = [ "serde_cbor", "serde_repr", "sha2 0.10.8", - "thiserror 2.0.3", + "thiserror 2.0.11", ] [[package]] @@ -5439,7 +5728,7 @@ dependencies = [ "sha2 0.10.8", "strum 0.26.3", "strum_macros 0.26.4", - "thiserror 2.0.3", + "thiserror 2.0.11", "time", "tokio", ] @@ -5529,7 +5818,7 @@ checksum = "22c65787944f32af084dffd0c68c1e544237b76e215654ddea8cd9f527dd8b69" dependencies = [ "digest 0.10.7", "ff 0.13.0", - "group", + "group 0.13.0", "pairing", "rand_core 0.6.4", "subtle", @@ -6136,6 +6425,19 @@ dependencies = [ "serde_json", ] +[[package]] +name = "k256" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +dependencies = [ + "cfg-if 1.0.0", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.8", + "sha3", +] + [[package]] name = "k256" version = "0.13.4" @@ -6143,11 +6445,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if 1.0.0", - "ecdsa", - "elliptic-curve", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", "once_cell", "sha2 0.10.8", - "signature", + "signature 2.2.0", ] [[package]] @@ -6158,6 +6460,7 @@ checksum = "19501afb943ae5806548bc3ebd7f3374153ca057a38f480ef30adfde5ef09755" dependencies = [ "base64 0.22.1", "chrono", + "schemars", "serde", "serde-value", "serde_json", @@ -6172,22 +6475,37 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "keyring" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd3d701d3de5b9c4b0d9d077f8c2c66f0388d75e96932ebbb7cdff8713d7f7c6" +dependencies = [ + "byteorder", + "dbus-secret-service", + "linux-keyutils", + "openssl", + "security-framework 3.0.1", + "windows-sys 0.59.0", +] + [[package]] name = "kube" -version = "0.93.1" +version = "0.94.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0365920075af1a2d23619c1ca801c492f2400157de42627f041a061716e76416" +checksum = "52ace78a62b361077505f2950bd48aa3e46596fb15350c9c993de15ddfa3cac5" dependencies = [ "k8s-openapi", "kube-client", "kube-core", + "kube-derive", ] [[package]] name = "kube-client" -version = "0.93.1" +version = "0.94.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d81336eb3a5b10a40c97a5a97ad66622e92bad942ce05ee789edd730aa4f8603" +checksum = "18ec0fcafd3add30b413b096a61d69b0a37f94d3f95b6f505a57ea3d27cec2a7" dependencies = [ "base64 0.22.1", "bytes", @@ -6223,19 +6541,34 @@ dependencies = [ [[package]] name = "kube-core" -version = "0.93.1" +version = "0.94.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cce373a74d787d439063cdefab0f3672860bd7bac01a38e39019177e764a0fe6" +checksum = "a50c095f051dada37740d883b6d47ad0430e95082140718073b773c8a70f231c" dependencies = [ "chrono", "form_urlencoded", "http 1.2.0", "k8s-openapi", + "schemars", "serde", + "serde-value", "serde_json", "thiserror 1.0.68", ] +[[package]] +name = "kube-derive" +version = "0.94.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7871f02c3c848b63fee3d2f2645bb4a3c0b68ee147badcddf1b0cf8fb5db87ad" +dependencies = [ + "darling 0.20.10", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.87", +] + [[package]] name = "lalrpop" version = "0.19.12" @@ -6396,6 +6729,16 @@ version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +[[package]] +name = "libdbus-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" +dependencies = [ + "cc", + "pkg-config", +] + [[package]] name = "libflate" version = "2.1.0" @@ -6431,6 +6774,16 @@ dependencies = [ "once_cell", ] +[[package]] +name = "libloading" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" +dependencies = [ + "cc", + "winapi 0.3.9", +] + [[package]] name = "libloading" version = "0.7.4" @@ -6527,6 +6880,16 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-keyutils" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761e49ec5fd8a5a463f9b84e877c373d888935b71c6be78f3767fe2ae6bed18e" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + [[package]] name = "linux-raw-sys" version = "0.4.13" @@ -6811,6 +7174,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.5" @@ -7231,6 +7603,20 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint 0.4.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational 0.4.2", + "num-traits", +] + [[package]] name = "num-bigint" version = "0.2.6" @@ -7271,6 +7657,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -7298,9 +7693,9 @@ dependencies = [ [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg 1.1.0", "num-integer", @@ -7319,6 +7714,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint 0.4.6", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -7461,20 +7867,56 @@ dependencies = [ "thiserror 1.0.68", ] +[[package]] +name = "openssl" +version = "0.10.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" +dependencies = [ + "bitflags 2.6.0", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-src" +version = "300.4.1+3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] @@ -7752,8 +8194,8 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ - "ecdsa", - "elliptic-curve", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", "primeorder", "sha2 0.10.8", ] @@ -7764,7 +8206,7 @@ version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" dependencies = [ - "group", + "group 0.13.0", ] [[package]] @@ -7853,12 +8295,32 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "487f2ccd1e17ce8c1bfab3a65c89525af41cfad4c8659021a1e9a2aacd73b89b" +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + [[package]] name = "pbkdf2" version = "0.12.2" @@ -7916,6 +8378,15 @@ dependencies = [ "serde", ] +[[package]] +name = "pem-rfc7468" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" +dependencies = [ + "base64ct", +] + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -8142,9 +8613,29 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" dependencies = [ - "der", - "pkcs8", - "spki", + "der 0.7.8", + "pkcs8 0.10.2", + "spki 0.7.3", +] + +[[package]] +name = "pkcs11" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aca6d67e4c8613bfe455599d0233d00735f85df2001f6bfd9bb7ac0496b10af" +dependencies = [ + "libloading 0.5.2", + "num-bigint 0.2.6", +] + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der 0.6.1", + "spki 0.6.0", ] [[package]] @@ -8153,8 +8644,8 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der", - "spki", + "der 0.7.8", + "spki 0.7.3", ] [[package]] @@ -8246,6 +8737,18 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "portable-atomic" version = "1.4.3" @@ -8397,7 +8900,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" dependencies = [ - "elliptic-curve", + "elliptic-curve 0.13.8", ] [[package]] @@ -8740,13 +9243,14 @@ dependencies = [ [[package]] name = "pulley-interpreter" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403a1a95f4c18a45c86c7bff13df00347afd0abcbf2e54af273c837339ffcf77" +checksum = "62d95f8575df49a2708398182f49a888cf9dc30210fb1fd2df87c889edcee75d" dependencies = [ "cranelift-bitset", "log", "sptr", + "wasmtime-math", ] [[package]] @@ -9337,6 +9841,17 @@ dependencies = [ "quick-error", ] +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac", + "zeroize", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -9481,11 +9996,11 @@ dependencies = [ "num-integer", "num-traits", "pkcs1", - "pkcs8", + "pkcs8 0.10.2", "rand_core 0.6.4", "sha2 0.10.8", - "signature", - "spki", + "signature 2.2.0", + "spki 0.7.3", "subtle", "zeroize", ] @@ -9688,7 +10203,7 @@ dependencies = [ "ring 0.17.7", "serde", "serde_json", - "thiserror 2.0.3", + "thiserror 2.0.11", "webpki-roots 0.26.1", "x509-parser", ] @@ -9702,7 +10217,7 @@ dependencies = [ "openssl-probe", "rustls-pemfile 1.0.3", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] @@ -9715,7 +10230,7 @@ dependencies = [ "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] @@ -9728,7 +10243,7 @@ dependencies = [ "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] @@ -9761,7 +10276,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4c7dc240fec5517e6c4eab3310438636cfe6391dfc345ba013109909a90d136" dependencies = [ - "core-foundation", + "core-foundation 0.9.4", "core-foundation-sys", "jni", "log", @@ -9770,7 +10285,7 @@ dependencies = [ "rustls-native-certs 0.7.0", "rustls-platform-verifier-android", "rustls-webpki 0.102.8", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "webpki-root-certs", "windows-sys 0.52.0", @@ -9871,9 +10386,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.16" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" dependencies = [ "dyn-clone", "indexmap 2.2.6", @@ -9884,14 +10399,14 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.16" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 1.0.109", + "syn 2.0.87", ] [[package]] @@ -9945,16 +10460,30 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct 0.1.1", + "der 0.6.1", + "generic-array", + "pkcs8 0.9.0", + "subtle", + "zeroize", +] + [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct", - "der", + "base16ct 0.2.0", + "der 0.7.8", "generic-array", - "pkcs8", + "pkcs8 0.10.2", "subtle", "zeroize", ] @@ -10038,13 +10567,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", - "core-foundation", + "core-foundation 0.9.4", "core-foundation-sys", "libc", "num-bigint 0.4.6", "security-framework-sys", ] +[[package]] +name = "security-framework" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + [[package]] name = "security-framework-sys" version = "2.12.0" @@ -10156,13 +10698,13 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.26.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.87", ] [[package]] @@ -10407,6 +10949,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + [[package]] name = "shlex" version = "1.3.0" @@ -10443,6 +10991,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + [[package]] name = "signature" version = "2.2.0" @@ -10679,6 +11237,16 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + [[package]] name = "spki" version = "0.7.3" @@ -10686,7 +11254,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der", + "der 0.7.8", ] [[package]] @@ -10885,7 +11453,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fac08504d60cf5bdffeb8a6a028f1a4868a5da1098bb19eb46239440039163fb" dependencies = [ "debugid", - "memmap2", + "memmap2 0.5.10", "stable_deref_trait", "uuid", ] @@ -10965,7 +11533,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -11024,9 +11592,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.16" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +checksum = "dc12939a1c9b9d391e0b7135f72fd30508b73450753e28341fed159317582a77" [[package]] name = "tarpc" @@ -11192,11 +11760,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.3" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "thiserror-impl 2.0.3", + "thiserror-impl 2.0.11", ] [[package]] @@ -11212,9 +11780,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.3" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", @@ -11310,6 +11878,25 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-bip39" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" +dependencies = [ + "anyhow", + "hmac", + "once_cell", + "pbkdf2 0.11.0", + "rand 0.8.5", + "rustc-hash 1.1.0", + "sha2 0.10.8", + "thiserror 1.0.68", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -12549,9 +13136,9 @@ dependencies = [ [[package]] name = "wasmtime" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639ecae347b9a2227e453a7b7671e84370a0b61f47a15e0390fe9b7725e47b3" +checksum = "11976a250672556d1c4c04c6d5d7656ac9192ac9edc42a4587d6c21460010e69" dependencies = [ "anyhow", "bitflags 2.6.0", @@ -12561,7 +13148,6 @@ dependencies = [ "hashbrown 0.14.5", "indexmap 2.2.6", "libc", - "libm", "log", "mach2", "memfd", @@ -12585,6 +13171,7 @@ dependencies = [ "wasmtime-environ", "wasmtime-fiber", "wasmtime-jit-icache-coherence", + "wasmtime-math", "wasmtime-slab", "wasmtime-versioned-export-macros", "wasmtime-winch", @@ -12593,18 +13180,18 @@ dependencies = [ [[package]] name = "wasmtime-asm-macros" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882a18800471cfc063c8b3ccf75723784acc3fd534009ac09421f2fac2fcdcec" +checksum = "1f178b0d125201fbe9f75beaf849bd3e511891f9e45ba216a5b620802ccf64f2" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "wasmtime-component-macro" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5c0a77c9e1927c3d471f53cc13767c3d3438e5d5ffd394e3eb31c86445fd60" +checksum = "d74de6592ed945d0a602f71243982a304d5d02f1e501b638addf57f42d57dfaf" dependencies = [ "anyhow", "proc-macro2", @@ -12617,15 +13204,15 @@ dependencies = [ [[package]] name = "wasmtime-component-util" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43702ca98bf5162eca0573db691ed9ecd36d716f8c6688410fe26ec16b6f9bcb" +checksum = "707dc7b3c112ab5a366b30cfe2fb5b2f8e6a0f682f16df96a5ec582bfe6f056e" [[package]] name = "wasmtime-cranelift" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20070aa5b75080a8932ec328419faf841df2bc6ceb16b55b0df2b952098392a2" +checksum = "366be722674d4bf153290fbcbc4d7d16895cc82fb3e869f8d550ff768f9e9e87" dependencies = [ "anyhow", "cfg-if 1.0.0", @@ -12648,9 +13235,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2604ddb24879d4dc1dedcb7081d7a8e017259bce916fdae097a97db52cbaab80" +checksum = "cdadc1af7097347aa276a4f008929810f726b5b46946971c660b6d421e9994ad" dependencies = [ "anyhow", "cranelift-bitset", @@ -12671,9 +13258,9 @@ dependencies = [ [[package]] name = "wasmtime-fiber" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98593412d2b167ebe2b59d4a17a184978a72f976b53b3a0ec05629451079ac1d" +checksum = "ccba90d4119f081bca91190485650730a617be1fff5228f8c4757ce133d21117" dependencies = [ "anyhow", "cc", @@ -12686,9 +13273,9 @@ dependencies = [ [[package]] name = "wasmtime-jit-icache-coherence" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d40d7722b9e1fbeae135715710a8a2570b1e6cf72b74dd653962d89831c6c70d" +checksum = "ec5e8552e01692e6c2e5293171704fed8abdec79d1a6995a0870ab190e5747d1" dependencies = [ "anyhow", "cfg-if 1.0.0", @@ -12696,17 +13283,26 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "wasmtime-math" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29210ec2aa25e00f4d54605cedaf080f39ec01a872c5bd520ad04c67af1dde17" +dependencies = [ + "libm", +] + [[package]] name = "wasmtime-slab" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8579c335220b4ece9aa490a0e8b46de78cd342b195ab21ff981d095e14b52383" +checksum = "fcb5821a96fa04ac14bc7b158bb3d5cd7729a053db5a74dad396cd513a5e5ccf" [[package]] name = "wasmtime-versioned-export-macros" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7de0a56fb0a69b185968f2d7a9ba54750920a806470dff7ad8de91ac06d277e" +checksum = "86ff86db216dc0240462de40c8290887a613dddf9685508eb39479037ba97b5b" dependencies = [ "proc-macro2", "quote", @@ -12715,9 +13311,9 @@ dependencies = [ [[package]] name = "wasmtime-winch" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abd309943c443f5590d12f9aba9ba63c481091c955a0a14de0c2a9e0e3aaeca9" +checksum = "fdbabfb8f20502d5e1d81092b9ead3682ae59988487aafcd7567387b7a43cf8f" dependencies = [ "anyhow", "cranelift-codegen", @@ -12732,9 +13328,9 @@ dependencies = [ [[package]] name = "wasmtime-wit-bindgen" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969f83022dac3435d6469edb582ceed04cfe32aa44dc3ef16e5cb55574633df8" +checksum = "8358319c2dd1e4db79e3c1c5d3a5af84956615343f9f89f4e4996a36816e06e6" dependencies = [ "anyhow", "heck 0.5.0", @@ -12877,9 +13473,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9110decc2983ed94de904804dcd979ba59cbabc78a94fec6b1d8468ec513d0f6" +checksum = "2f849ef2c5f46cb0a20af4b4487aaa239846e52e2c03f13fa3c784684552859c" dependencies = [ "anyhow", "cranelift-codegen", @@ -12887,6 +13483,7 @@ dependencies = [ "regalloc2", "smallvec", "target-lexicon", + "thiserror 1.0.68", "wasmparser 0.221.2", "wasmtime-cranelift", "wasmtime-environ", @@ -13242,10 +13839,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94" dependencies = [ "const-oid", - "der", + "der 0.7.8", "sha1", - "signature", - "spki", + "signature 2.2.0", + "spki 0.7.3", "tls_codec", ] @@ -13442,9 +14039,3 @@ dependencies = [ "cc", "pkg-config", ] - -[[patch.unused]] -name = "jsonrpc" -version = "0.12.1" -source = "git+https://github.com/apoelstra/rust-jsonrpc?rev=e42044d#e42044d8e0896317488dfbd65eb5563d76e937fe" - diff --git a/Cargo.Bazel.json.lock b/Cargo.Bazel.json.lock index f8413db2d1b..5bc3d4b8ba0 100644 --- a/Cargo.Bazel.json.lock +++ b/Cargo.Bazel.json.lock @@ -1,5 +1,5 @@ { - "checksum": "536b2baa9e3ea1956ceedabcbea2b38d092ad5b579a5e7e61df6c84cae348752", + "checksum": "ff5ce967fff3aff7ce36393d3aa743d1235fbd9a17d407e6fa937539f17654a9", "crates": { "abnf 0.12.0": { "name": "abnf", @@ -1336,6 +1336,143 @@ ], "license_file": "LICENSE-APACHE" }, + "aes 0.8.4": { + "name": "aes", + "version": "0.8.4", + "package_url": "https://github.com/RustCrypto/block-ciphers", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/aes/0.8.4/download", + "sha256": "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" + } + }, + "targets": [ + { + "Library": { + "crate_name": "aes", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "aes", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "cipher 0.4.4", + "target": "cipher" + } + ], + "selects": { + "cfg(any(target_arch = \"aarch64\", target_arch = \"x86_64\", target_arch = \"x86\"))": [ + { + "id": "cpufeatures 0.2.9", + "target": "cpufeatures" + } + ] + } + }, + "edition": "2021", + "version": "0.8.4" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "aes-gcm 0.10.3": { + "name": "aes-gcm", + "version": "0.10.3", + "package_url": "https://github.com/RustCrypto/AEADs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/aes-gcm/0.10.3/download", + "sha256": "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "aes_gcm", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "aes_gcm", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "aes", + "alloc", + "default", + "getrandom", + "rand_core" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "aead 0.5.2", + "target": "aead" + }, + { + "id": "aes 0.8.4", + "target": "aes" + }, + { + "id": "cipher 0.4.4", + "target": "cipher" + }, + { + "id": "ctr 0.9.2", + "target": "ctr" + }, + { + "id": "ghash 0.5.1", + "target": "ghash" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.10.3" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "ahash 0.7.8": { "name": "ahash", "version": "0.7.8", @@ -1646,7 +1783,7 @@ "target": "indexmap" }, { - "id": "schemars 0.8.16", + "id": "schemars 0.8.21", "target": "schemars" }, { @@ -2378,14 +2515,14 @@ ], "license_file": "LICENSE-APACHE" }, - "arbitrary 1.3.2": { + "arbitrary 1.4.1": { "name": "arbitrary", - "version": "1.3.2", + "version": "1.4.1", "package_url": "https://github.com/rust-fuzz/arbitrary/", "repository": { "Http": { - "url": "https://static.crates.io/crates/arbitrary/1.3.2/download", - "sha256": "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + "url": "https://static.crates.io/crates/arbitrary/1.4.1/download", + "sha256": "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" } }, "targets": [ @@ -2418,13 +2555,13 @@ "proc_macro_deps": { "common": [ { - "id": "derive_arbitrary 1.3.2", + "id": "derive_arbitrary 1.4.1", "target": "derive_arbitrary" } ], "selects": {} }, - "version": "1.3.2" + "version": "1.4.1" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -2472,6 +2609,71 @@ ], "license_file": "LICENSE-APACHE" }, + "argon2 0.4.1": { + "name": "argon2", + "version": "0.4.1", + "package_url": "https://github.com/RustCrypto/password-hashes/tree/master/argon2", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/argon2/0.4.1/download", + "sha256": "db4ce4441f99dbd377ca8a8f57b698c44d0d6e712d8329b5040da5a64aa1ce73" + } + }, + "targets": [ + { + "Library": { + "crate_name": "argon2", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "argon2", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "default", + "password-hash", + "rand" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "base64ct 1.6.0", + "target": "base64ct" + }, + { + "id": "blake2 0.10.6", + "target": "blake2" + }, + { + "id": "password-hash 0.4.2", + "target": "password_hash" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "arrayvec 0.5.2": { "name": "arrayvec", "version": "0.5.2", @@ -5498,6 +5700,51 @@ ], "license_file": "LICENSE-CC0" }, + "base16ct 0.1.1": { + "name": "base16ct", + "version": "0.1.1", + "package_url": "https://github.com/RustCrypto/formats/tree/master/base16ct", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/base16ct/0.1.1/download", + "sha256": "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + } + }, + "targets": [ + { + "Library": { + "crate_name": "base16ct", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "base16ct", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc" + ], + "selects": {} + }, + "edition": "2021", + "version": "0.1.1" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "base16ct 0.2.0": { "name": "base16ct", "version": "0.2.0", @@ -6557,6 +6804,104 @@ ], "license_file": null }, + "bip32 0.4.0": { + "name": "bip32", + "version": "0.4.0", + "package_url": "https://github.com/iqlusioninc/crates/tree/main/bip32", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/bip32/0.4.0/download", + "sha256": "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "bip32", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "bip32", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "bip39", + "default", + "k256", + "mnemonic", + "once_cell", + "pbkdf2", + "secp256k1", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "bs58 0.4.0", + "target": "bs58" + }, + { + "id": "hmac 0.12.1", + "target": "hmac" + }, + { + "id": "k256 0.11.6", + "target": "k256" + }, + { + "id": "once_cell 1.19.0", + "target": "once_cell" + }, + { + "id": "pbkdf2 0.11.0", + "target": "pbkdf2" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + }, + { + "id": "ripemd 0.1.3", + "target": "ripemd" + }, + { + "id": "sha2 0.10.8", + "target": "sha2" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.0" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "bip32 0.5.1": { "name": "bip32", "version": "0.5.1", @@ -7028,7 +7373,7 @@ "target": "hex_lit" }, { - "id": "secp256k1 0.29.1", + "id": "secp256k1 0.29.0", "target": "secp256k1" }, { @@ -7874,6 +8219,54 @@ ], "license_file": "LICENSE.txt" }, + "blake2 0.10.6": { + "name": "blake2", + "version": "0.10.6", + "package_url": "https://github.com/RustCrypto/hashes", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/blake2/0.10.6/download", + "sha256": "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" + } + }, + "targets": [ + { + "Library": { + "crate_name": "blake2", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "blake2", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "digest 0.10.7", + "target": "digest" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.10.6" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "block-buffer 0.9.0": { "name": "block-buffer", "version": "0.9.0", @@ -8483,6 +8876,61 @@ ], "license_file": "LICENSE" }, + "bs58 0.4.0": { + "name": "bs58", + "version": "0.4.0", + "package_url": "https://github.com/mycorrhiza/bs58-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/bs58/0.4.0/download", + "sha256": "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "bs58", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "bs58", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "check", + "sha2" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "sha2 0.9.9", + "target": "sha2" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.4.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "bs58 0.5.0": { "name": "bs58", "version": "0.5.0", @@ -10036,14 +10484,14 @@ ], "license_file": "LICENSE-APACHE" }, - "canbench 0.1.8": { + "canbench 0.1.9": { "name": "canbench", - "version": "0.1.8", + "version": "0.1.9", "package_url": "https://github.com/dfinity/canbench", "repository": { "Http": { - "url": "https://static.crates.io/crates/canbench/0.1.8/download", - "sha256": "cb548f9e006ad29b160d37e07435c499af7d2741918e18d95ddc87dfe97a0b8d" + "url": "https://static.crates.io/crates/canbench/0.1.9/download", + "sha256": "c3eba78c84aa78e67f27c5c5a7d6c3d33cc301f95886171748e8f6ed8a31b258" } }, "targets": [ @@ -10080,7 +10528,7 @@ "deps": { "common": [ { - "id": "canbench-rs 0.1.8", + "id": "canbench-rs 0.1.9", "target": "canbench_rs" }, { @@ -10139,7 +10587,7 @@ "selects": {} }, "edition": "2021", - "version": "0.1.8" + "version": "0.1.9" }, "license": "Apache-2.0", "license_ids": [ @@ -10147,14 +10595,14 @@ ], "license_file": null }, - "canbench-rs 0.1.8": { + "canbench-rs 0.1.9": { "name": "canbench-rs", - "version": "0.1.8", + "version": "0.1.9", "package_url": "https://github.com/dfinity/canbench", "repository": { "Http": { - "url": "https://static.crates.io/crates/canbench-rs/0.1.8/download", - "sha256": "497d900e11ab1891dd9743dd45dbeaada540ce323aa1adc7fc0ce1da2c6e86ff" + "url": "https://static.crates.io/crates/canbench-rs/0.1.9/download", + "sha256": "588701e2d05679b79603acca6a6f8b78fe0d21f5f7a9c06fe689f769ae797008" } }, "targets": [ @@ -10197,13 +10645,13 @@ "proc_macro_deps": { "common": [ { - "id": "canbench-rs-macros 0.1.8", + "id": "canbench-rs-macros 0.1.9", "target": "canbench_rs_macros" } ], "selects": {} }, - "version": "0.1.8" + "version": "0.1.9" }, "license": "Apache-2.0", "license_ids": [ @@ -10211,14 +10659,14 @@ ], "license_file": null }, - "canbench-rs-macros 0.1.8": { + "canbench-rs-macros 0.1.9": { "name": "canbench-rs-macros", - "version": "0.1.8", + "version": "0.1.9", "package_url": "https://github.com/dfinity/canbench", "repository": { "Http": { - "url": "https://static.crates.io/crates/canbench-rs-macros/0.1.8/download", - "sha256": "5a5509bcfe6eeb86f057d46fbf20a2ba6b6bf9a1099b053a8f491cd7a909dfa6" + "url": "https://static.crates.io/crates/canbench-rs-macros/0.1.9/download", + "sha256": "e05fe21a7dfc85c3be8e40edbbcb3fe23b4c070fac4741eff18129f1d0f11aa9" } }, "targets": [ @@ -10258,7 +10706,7 @@ "selects": {} }, "edition": "2021", - "version": "0.1.8" + "version": "0.1.9" }, "license": "Apache-2.0", "license_ids": [ @@ -12863,7 +13311,7 @@ "Git": { "remote": "https://github.com/dfinity/cloudflare-rs.git", "commitish": { - "Rev": "a6538a036926bd756986c9c0a5de356daef48881" + "Rev": "8b011d170d9d61eaad77bb9645371f6219285104" }, "strip_prefix": "cloudflare" } @@ -13586,6 +14034,7 @@ "crate_features": { "common": [ "ansi-parsing", + "default", "unicode-width" ], "selects": {} @@ -13961,6 +14410,65 @@ ], "license_file": "LICENSE-APACHE" }, + "core-foundation 0.10.0": { + "name": "core-foundation", + "version": "0.10.0", + "package_url": "https://github.com/servo/core-foundation-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/core-foundation/0.10.0/download", + "sha256": "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" + } + }, + "targets": [ + { + "Library": { + "crate_name": "core_foundation", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "core_foundation", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "link" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "core-foundation-sys 0.8.7", + "target": "core_foundation_sys" + }, + { + "id": "libc 0.2.158", + "target": "libc" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.10.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "core-foundation-sys 0.8.7": { "name": "core-foundation-sys", "version": "0.8.7", @@ -14250,14 +14758,14 @@ ], "license_file": "LICENSE-APACHE" }, - "cranelift-bforest 0.115.0": { + "cranelift-bforest 0.116.1": { "name": "cranelift-bforest", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-bforest/0.115.0/download", - "sha256": "ac89549be94911dd0e839b4a7db99e9ed29c17517e1c026f61066884c168aa3c" + "url": "https://static.crates.io/crates/cranelift-bforest/0.116.1/download", + "sha256": "e15d04a0ce86cb36ead88ad68cf693ffd6cda47052b9e0ac114bc47fd9cd23c4" } }, "targets": [ @@ -14282,14 +14790,14 @@ "deps": { "common": [ { - "id": "cranelift-entity 0.115.0", + "id": "cranelift-entity 0.116.1", "target": "cranelift_entity" } ], "selects": {} }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14297,14 +14805,14 @@ ], "license_file": "LICENSE" }, - "cranelift-bitset 0.115.0": { + "cranelift-bitset 0.116.1": { "name": "cranelift-bitset", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-bitset/0.115.0/download", - "sha256": "b9bd49369f76c77e34e641af85d0956869237832c118964d08bf5f51f210875a" + "url": "https://static.crates.io/crates/cranelift-bitset/0.116.1/download", + "sha256": "7c6e3969a7ce267259ce244b7867c5d3bc9e65b0a87e81039588dfdeaede9f34" } }, "targets": [ @@ -14351,7 +14859,7 @@ ], "selects": {} }, - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14359,14 +14867,14 @@ ], "license_file": null }, - "cranelift-codegen 0.115.0": { + "cranelift-codegen 0.116.1": { "name": "cranelift-codegen", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-codegen/0.115.0/download", - "sha256": "fd96ce9cf8efebd7f5ab8ced5a0ce44250280bbae9f593d74a6d7effc3582a35" + "url": "https://static.crates.io/crates/cranelift-codegen/0.116.1/download", + "sha256": "2c22032c4cb42558371cf516bb47f26cdad1819d3475c133e93c49f50ebf304e" } }, "targets": [ @@ -14417,27 +14925,27 @@ "target": "bumpalo" }, { - "id": "cranelift-bforest 0.115.0", + "id": "cranelift-bforest 0.116.1", "target": "cranelift_bforest" }, { - "id": "cranelift-bitset 0.115.0", + "id": "cranelift-bitset 0.116.1", "target": "cranelift_bitset" }, { - "id": "cranelift-codegen 0.115.0", + "id": "cranelift-codegen 0.116.1", "target": "build_script_build" }, { - "id": "cranelift-codegen-shared 0.115.0", + "id": "cranelift-codegen-shared 0.116.1", "target": "cranelift_codegen_shared" }, { - "id": "cranelift-control 0.115.0", + "id": "cranelift-control 0.116.1", "target": "cranelift_control" }, { - "id": "cranelift-entity 0.115.0", + "id": "cranelift-entity 0.116.1", "target": "cranelift_entity" }, { @@ -14465,14 +14973,14 @@ "target": "smallvec" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" } ], "selects": {} }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -14484,11 +14992,11 @@ "deps": { "common": [ { - "id": "cranelift-codegen-meta 0.115.0", + "id": "cranelift-codegen-meta 0.116.1", "target": "cranelift_codegen_meta" }, { - "id": "cranelift-isle 0.115.0", + "id": "cranelift-isle 0.116.1", "target": "cranelift_isle" } ], @@ -14501,14 +15009,14 @@ ], "license_file": "LICENSE" }, - "cranelift-codegen-meta 0.115.0": { + "cranelift-codegen-meta 0.116.1": { "name": "cranelift-codegen-meta", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-codegen-meta/0.115.0/download", - "sha256": "5a68e358827afe4bfb6239fcbf6fbd5ac56206ece8a99c8f5f9bbd518773281a", + "url": "https://static.crates.io/crates/cranelift-codegen-meta/0.116.1/download", + "sha256": "c904bc71c61b27fc57827f4a1379f29de64fe95653b620a3db77d59655eee0b8", "patch_args": [ "-p4" ], @@ -14539,14 +15047,14 @@ "deps": { "common": [ { - "id": "cranelift-codegen-shared 0.115.0", + "id": "cranelift-codegen-shared 0.116.1", "target": "cranelift_codegen_shared" } ], "selects": {} }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14554,14 +15062,14 @@ ], "license_file": "LICENSE" }, - "cranelift-codegen-shared 0.115.0": { + "cranelift-codegen-shared 0.116.1": { "name": "cranelift-codegen-shared", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-codegen-shared/0.115.0/download", - "sha256": "e184c9767afbe73d50c55ec29abcf4c32f9baf0d9d22b86d58c4d55e06dee181" + "url": "https://static.crates.io/crates/cranelift-codegen-shared/0.116.1/download", + "sha256": "40180f5497572f644ce88c255480981ae2ec1d7bb4d8e0c0136a13b87a2f2ceb" } }, "targets": [ @@ -14584,7 +15092,7 @@ "**" ], "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14592,14 +15100,14 @@ ], "license_file": "LICENSE" }, - "cranelift-control 0.115.0": { + "cranelift-control 0.116.1": { "name": "cranelift-control", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-control/0.115.0/download", - "sha256": "5cc7664f2a66f053e33f149e952bb5971d138e3af637f5097727ed6dc0ed95dd" + "url": "https://static.crates.io/crates/cranelift-control/0.116.1/download", + "sha256": "26d132c6d0bd8a489563472afc171759da0707804a65ece7ceb15a8c6d7dd5ef" } }, "targets": [ @@ -14631,14 +15139,14 @@ "deps": { "common": [ { - "id": "arbitrary 1.3.2", + "id": "arbitrary 1.4.1", "target": "arbitrary" } ], "selects": {} }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14646,14 +15154,14 @@ ], "license_file": "LICENSE" }, - "cranelift-entity 0.115.0": { + "cranelift-entity 0.116.1": { "name": "cranelift-entity", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-entity/0.115.0/download", - "sha256": "118597e3a9cf86c3556fa579a7a23b955fa18231651a52a77a2475d305a9cf84" + "url": "https://static.crates.io/crates/cranelift-entity/0.116.1/download", + "sha256": "4b2d0d9618275474fbf679dd018ac6e009acbd6ae6850f6a67be33fb3b00b323" } }, "targets": [ @@ -14686,7 +15194,7 @@ "deps": { "common": [ { - "id": "cranelift-bitset 0.115.0", + "id": "cranelift-bitset 0.116.1", "target": "cranelift_bitset" }, { @@ -14706,7 +15214,7 @@ ], "selects": {} }, - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14714,14 +15222,14 @@ ], "license_file": "LICENSE" }, - "cranelift-frontend 0.115.0": { + "cranelift-frontend 0.116.1": { "name": "cranelift-frontend", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-frontend/0.115.0/download", - "sha256": "7638ea1efb069a0aa18d8ee67401b6b0d19f6bfe5de5e9ede348bfc80bb0d8c7" + "url": "https://static.crates.io/crates/cranelift-frontend/0.116.1/download", + "sha256": "4fac41e16729107393174b0c9e3730fb072866100e1e64e80a1a963b2e484d57" } }, "targets": [ @@ -14753,7 +15261,7 @@ "deps": { "common": [ { - "id": "cranelift-codegen 0.115.0", + "id": "cranelift-codegen 0.116.1", "target": "cranelift_codegen" }, { @@ -14765,14 +15273,14 @@ "target": "smallvec" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" } ], "selects": {} }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -14780,14 +15288,14 @@ ], "license_file": "LICENSE" }, - "cranelift-isle 0.115.0": { + "cranelift-isle 0.116.1": { "name": "cranelift-isle", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime/tree/main/cranelift/isle", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-isle/0.115.0/download", - "sha256": "15c53e1152a0b01c4ed2b1e0535602b8e86458777dd9d18b28732b16325c7dc0", + "url": "https://static.crates.io/crates/cranelift-isle/0.116.1/download", + "sha256": "1ca20d576e5070044d0a72a9effc2deacf4d6aa650403189d8ea50126483944d", "patch_args": [ "-p4" ], @@ -14836,14 +15344,14 @@ "deps": { "common": [ { - "id": "cranelift-isle 0.115.0", + "id": "cranelift-isle 0.116.1", "target": "build_script_build" } ], "selects": {} }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -14859,14 +15367,14 @@ ], "license_file": null }, - "cranelift-native 0.115.0": { + "cranelift-native 0.116.1": { "name": "cranelift-native", - "version": "0.115.0", + "version": "0.116.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/cranelift-native/0.115.0/download", - "sha256": "7b7d8f895444fa52dd7bdd0bed11bf007a7fb43af65a6deac8fcc4094c6372f7" + "url": "https://static.crates.io/crates/cranelift-native/0.116.1/download", + "sha256": "b8dee82f3f1f2c4cba9177f1cc5e350fe98764379bcd29340caa7b01f85076c7" } }, "targets": [ @@ -14898,11 +15406,11 @@ "deps": { "common": [ { - "id": "cranelift-codegen 0.115.0", + "id": "cranelift-codegen 0.116.1", "target": "cranelift_codegen" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" } ], @@ -14916,7 +15424,7 @@ } }, "edition": "2021", - "version": "0.115.0" + "version": "0.116.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -16132,6 +16640,74 @@ ], "license_file": null }, + "crypto-bigint 0.4.9": { + "name": "crypto-bigint", + "version": "0.4.9", + "package_url": "https://github.com/RustCrypto/crypto-bigint", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/crypto-bigint/0.4.9/download", + "sha256": "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" + } + }, + "targets": [ + { + "Library": { + "crate_name": "crypto_bigint", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "crypto_bigint", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "generic-array", + "rand_core", + "zeroize" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "generic-array 0.14.7", + "target": "generic_array" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.9" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "crypto-bigint 0.5.2": { "name": "crypto-bigint", "version": "0.5.2", @@ -16497,6 +17073,54 @@ ], "license_file": "LICENSE-MIT" }, + "ctr 0.9.2": { + "name": "ctr", + "version": "0.9.2", + "package_url": "https://github.com/RustCrypto/block-modes", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/ctr/0.9.2/download", + "sha256": "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" + } + }, + "targets": [ + { + "Library": { + "crate_name": "ctr", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "ctr", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cipher 0.4.4", + "target": "cipher" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.9.2" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "ctrlc 3.4.5": { "name": "ctrlc", "version": "3.4.5", @@ -17475,6 +18099,141 @@ ], "license_file": "LICENSE" }, + "dbus 0.9.7": { + "name": "dbus", + "version": "0.9.7", + "package_url": "https://github.com/diwic/dbus-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/dbus/0.9.7/download", + "sha256": "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "dbus", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "dbus", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "vendored" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "libc 0.2.158", + "target": "libc" + }, + { + "id": "libdbus-sys 0.2.5", + "target": "libdbus_sys" + } + ], + "selects": { + "cfg(windows)": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } + }, + "edition": "2018", + "version": "0.9.7" + }, + "license": "Apache-2.0/MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "dbus-secret-service 4.0.3": { + "name": "dbus-secret-service", + "version": "4.0.3", + "package_url": "https://github.com/brotskydotcom/dbus-secret-service.git", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/dbus-secret-service/4.0.3/download", + "sha256": "b42a16374481d92aed73ae45b1f120207d8e71d24fb89f357fadbd8f946fd84b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "dbus_secret_service", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "dbus_secret_service", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "vendored" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "dbus 0.9.7", + "target": "dbus" + }, + { + "id": "futures-util 0.3.31", + "target": "futures_util" + }, + { + "id": "num 0.4.3", + "target": "num" + }, + { + "id": "once_cell 1.19.0", + "target": "once_cell" + }, + { + "id": "rand 0.8.5", + "target": "rand" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "4.0.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "debugid 0.8.0": { "name": "debugid", "version": "0.8.0", @@ -17522,6 +18281,74 @@ ], "license_file": "LICENSE" }, + "der 0.6.1": { + "name": "der", + "version": "0.6.1", + "package_url": "https://github.com/RustCrypto/formats/tree/master/der", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/der/0.6.1/download", + "sha256": "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" + } + }, + "targets": [ + { + "Library": { + "crate_name": "der", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "der", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "const-oid", + "oid", + "pem", + "pem-rfc7468", + "std", + "zeroize" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "const-oid 0.9.4", + "target": "const_oid" + }, + { + "id": "pem-rfc7468 0.6.0", + "target": "pem_rfc7468" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.6.1" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "der 0.7.7": { "name": "der", "version": "0.7.7", @@ -17774,6 +18601,7 @@ "common": [ "alloc", "powerfmt", + "serde", "std" ], "selects": {} @@ -17783,6 +18611,10 @@ { "id": "powerfmt 0.2.0", "target": "powerfmt" + }, + { + "id": "serde 1.0.217", + "target": "serde" } ], "selects": {} @@ -17859,14 +18691,14 @@ ], "license_file": "LICENSE" }, - "derive_arbitrary 1.3.2": { + "derive_arbitrary 1.4.1": { "name": "derive_arbitrary", - "version": "1.3.2", + "version": "1.4.1", "package_url": "https://github.com/rust-fuzz/arbitrary", "repository": { "Http": { - "url": "https://static.crates.io/crates/derive_arbitrary/1.3.2/download", - "sha256": "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" + "url": "https://static.crates.io/crates/derive_arbitrary/1.4.1/download", + "sha256": "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" } }, "targets": [ @@ -17906,7 +18738,7 @@ "selects": {} }, "edition": "2021", - "version": "1.3.2" + "version": "1.4.1" }, "license": "MIT/Apache-2.0", "license_ids": [ @@ -18005,6 +18837,270 @@ ], "license_file": "LICENSE" }, + "dfx-core 0.1.3": { + "name": "dfx-core", + "version": "0.1.3", + "package_url": "https://github.com/dfinity/sdk", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/dfx-core/0.1.3/download", + "sha256": "b4be4fc6929580b0ef8ac3678c03f31b59ffb1aa0d90ab754842d40cfc5b4552" + } + }, + "targets": [ + { + "Library": { + "crate_name": "dfx_core", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "dfx_core", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "aes-gcm 0.10.3", + "target": "aes_gcm" + }, + { + "id": "argon2 0.4.1", + "target": "argon2" + }, + { + "id": "backoff 0.4.0", + "target": "backoff" + }, + { + "id": "bip32 0.4.0", + "target": "bip32" + }, + { + "id": "byte-unit 4.0.19", + "target": "byte_unit" + }, + { + "id": "bytes 1.9.0", + "target": "bytes" + }, + { + "id": "candid 0.10.13", + "target": "candid" + }, + { + "id": "clap 4.5.20", + "target": "clap" + }, + { + "id": "dialoguer 0.11.0", + "target": "dialoguer" + }, + { + "id": "directories-next 2.0.0", + "target": "directories_next" + }, + { + "id": "dunce 1.0.5", + "target": "dunce" + }, + { + "id": "flate2 1.0.31", + "target": "flate2" + }, + { + "id": "handlebars 4.5.0", + "target": "handlebars" + }, + { + "id": "hex 0.4.3", + "target": "hex" + }, + { + "id": "humantime-serde 1.1.1", + "target": "humantime_serde" + }, + { + "id": "ic-agent 0.39.2", + "target": "ic_agent" + }, + { + "id": "ic-identity-hsm 0.39.3", + "target": "ic_identity_hsm" + }, + { + "id": "ic-utils 0.39.0", + "target": "ic_utils" + }, + { + "id": "itertools 0.10.5", + "target": "itertools" + }, + { + "id": "k256 0.11.6", + "target": "k256" + }, + { + "id": "keyring 3.4.0", + "target": "keyring" + }, + { + "id": "lazy_static 1.4.0", + "target": "lazy_static" + }, + { + "id": "reqwest 0.12.9", + "target": "reqwest" + }, + { + "id": "ring 0.16.20", + "target": "ring" + }, + { + "id": "schemars 0.8.21", + "target": "schemars" + }, + { + "id": "sec1 0.3.0", + "target": "sec1" + }, + { + "id": "semver 1.0.22", + "target": "semver" + }, + { + "id": "serde 1.0.217", + "target": "serde" + }, + { + "id": "serde_json 1.0.132", + "target": "serde_json" + }, + { + "id": "sha2 0.10.8", + "target": "sha2" + }, + { + "id": "slog 2.7.0", + "target": "slog" + }, + { + "id": "tar 0.4.39", + "target": "tar" + }, + { + "id": "tempfile 3.12.0", + "target": "tempfile" + }, + { + "id": "thiserror 1.0.68", + "target": "thiserror" + }, + { + "id": "time 0.3.36", + "target": "time" + }, + { + "id": "tiny-bip39 1.0.0", + "target": "bip39" + }, + { + "id": "url 2.5.3", + "target": "url" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.1.3" + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": null + }, + "dialoguer 0.11.0": { + "name": "dialoguer", + "version": "0.11.0", + "package_url": "https://github.com/console-rs/dialoguer", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/dialoguer/0.11.0/download", + "sha256": "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" + } + }, + "targets": [ + { + "Library": { + "crate_name": "dialoguer", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "dialoguer", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "editor", + "password", + "tempfile", + "zeroize" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "console 0.15.7", + "target": "console" + }, + { + "id": "shell-words 1.1.0", + "target": "shell_words" + }, + { + "id": "tempfile 3.12.0", + "target": "tempfile" + }, + { + "id": "thiserror 1.0.68", + "target": "thiserror" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.11.0" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": "LICENSE" + }, "diff 0.1.13": { "name": "diff", "version": "0.1.13", @@ -18258,7 +19354,7 @@ "target": "anyhow" }, { - "id": "arbitrary 1.3.2", + "id": "arbitrary 1.4.1", "target": "arbitrary" }, { @@ -18395,11 +19491,11 @@ "target": "cached" }, { - "id": "canbench 0.1.8", + "id": "canbench 0.1.9", "target": "canbench" }, { - "id": "canbench-rs 0.1.8", + "id": "canbench-rs 0.1.9", "target": "canbench_rs" }, { @@ -18502,6 +19598,10 @@ "id": "dashmap 5.5.0", "target": "dashmap" }, + { + "id": "dfx-core 0.1.3", + "target": "dfx_core" + }, { "id": "dyn-clone 1.0.14", "target": "dyn_clone" @@ -18531,7 +19631,7 @@ "target": "ethnum" }, { - "id": "evm_rpc_types 1.2.0", + "id": "evm_rpc_types 1.3.0", "target": "evm_rpc_types" }, { @@ -18663,7 +19763,7 @@ "target": "ic_cbor" }, { - "id": "ic-cdk 0.16.0", + "id": "ic-cdk 0.17.1", "target": "ic_cdk" }, { @@ -18695,6 +19795,10 @@ "id": "ic-http-gateway 0.1.0", "target": "ic_http_gateway" }, + { + "id": "ic-management-canister-types 0.1.0", + "target": "ic_management_canister_types" + }, { "id": "ic-metrics-encoder 1.1.1", "target": "ic_metrics_encoder" @@ -18812,7 +19916,7 @@ "target": "k8s_openapi" }, { - "id": "kube 0.93.1", + "id": "kube 0.94.2", "target": "kube" }, { @@ -18875,6 +19979,10 @@ "id": "maxminddb 0.24.0", "target": "maxminddb" }, + { + "id": "memmap2 0.9.5", + "target": "memmap2" + }, { "id": "metrics-proxy 0.1.0", "target": "metrics_proxy" @@ -19170,7 +20278,7 @@ "target": "rusty_fork" }, { - "id": "schemars 0.8.16", + "id": "schemars 0.8.21", "target": "schemars" }, { @@ -19326,7 +20434,7 @@ "target": "textplots" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" }, { @@ -19494,11 +20602,11 @@ "target": "wasmprinter" }, { - "id": "wasmtime 28.0.0", + "id": "wasmtime 29.0.1", "target": "wasmtime" }, { - "id": "wasmtime-environ 28.0.0", + "id": "wasmtime-environ 29.0.1", "target": "wasmtime_environ" }, { @@ -19564,7 +20672,7 @@ "target": "educe" }, { - "id": "ic-cdk-macros 0.9.0", + "id": "ic-cdk-macros 0.17.1", "target": "ic_cdk_macros" }, { @@ -19613,6 +20721,58 @@ "license_ids": [], "license_file": null }, + "directories-next 2.0.0": { + "name": "directories-next", + "version": "2.0.0", + "package_url": "https://github.com/xdg-rs/dirs/tree/master/directories", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/directories-next/2.0.0/download", + "sha256": "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" + } + }, + "targets": [ + { + "Library": { + "crate_name": "directories_next", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "directories_next", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "dirs-sys-next 0.1.2", + "target": "dirs_sys_next" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "2.0.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "dirs 2.0.2": { "name": "dirs", "version": "2.0.2", @@ -20154,6 +21314,46 @@ ], "license_file": "LICENSE" }, + "dunce 1.0.5": { + "name": "dunce", + "version": "1.0.5", + "package_url": "https://gitlab.com/kornelski/dunce", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/dunce/1.0.5/download", + "sha256": "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + } + }, + "targets": [ + { + "Library": { + "crate_name": "dunce", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "dunce", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2021", + "version": "1.0.5" + }, + "license": "CC0-1.0 OR MIT-0 OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "CC0-1.0", + "MIT-0" + ], + "license_file": "LICENSE" + }, "duration-string 0.3.0": { "name": "duration-string", "version": "0.3.0", @@ -20244,6 +21444,82 @@ ], "license_file": "LICENSE-APACHE" }, + "ecdsa 0.14.8": { + "name": "ecdsa", + "version": "0.14.8", + "package_url": "https://github.com/RustCrypto/signatures/tree/master/ecdsa", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/ecdsa/0.14.8/download", + "sha256": "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "ecdsa", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "ecdsa", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "arithmetic", + "der", + "digest", + "hazmat", + "pem", + "pkcs8", + "rfc6979", + "sign", + "std", + "verify" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "der 0.6.1", + "target": "der" + }, + { + "id": "elliptic-curve 0.12.3", + "target": "elliptic_curve" + }, + { + "id": "rfc6979 0.3.1", + "target": "rfc6979" + }, + { + "id": "signature 1.6.4", + "target": "signature" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.14.8" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "ecdsa 0.16.9": { "name": "ecdsa", "version": "0.16.9", @@ -20731,6 +22007,118 @@ ], "license_file": "LICENSE-APACHE" }, + "elliptic-curve 0.12.3": { + "name": "elliptic-curve", + "version": "0.12.3", + "package_url": "https://github.com/RustCrypto/traits/tree/master/elliptic-curve", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/elliptic-curve/0.12.3/download", + "sha256": "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" + } + }, + "targets": [ + { + "Library": { + "crate_name": "elliptic_curve", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "elliptic_curve", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "arithmetic", + "digest", + "ff", + "group", + "hazmat", + "pem", + "pem-rfc7468", + "pkcs8", + "sec1", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "base16ct 0.1.1", + "target": "base16ct" + }, + { + "id": "crypto-bigint 0.4.9", + "target": "crypto_bigint" + }, + { + "id": "der 0.6.1", + "target": "der" + }, + { + "id": "digest 0.10.7", + "target": "digest" + }, + { + "id": "ff 0.12.1", + "target": "ff" + }, + { + "id": "generic-array 0.14.7", + "target": "generic_array" + }, + { + "id": "group 0.12.1", + "target": "group" + }, + { + "id": "pem-rfc7468 0.6.0", + "target": "pem_rfc7468" + }, + { + "id": "pkcs8 0.9.0", + "target": "pkcs8" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + }, + { + "id": "sec1 0.3.0", + "target": "sec1" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.12.3" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "elliptic-curve 0.13.8": { "name": "elliptic-curve", "version": "0.13.8", @@ -23111,14 +24499,14 @@ ], "license_file": "LICENSE-APACHE" }, - "evm_rpc_types 1.2.0": { + "evm_rpc_types 1.3.0": { "name": "evm_rpc_types", - "version": "1.2.0", + "version": "1.3.0", "package_url": "https://github.com/internet-computer-protocol/evm-rpc-canister", "repository": { "Http": { - "url": "https://static.crates.io/crates/evm_rpc_types/1.2.0/download", - "sha256": "29ed9ee7b89726f4a343208e9a89e9ad22fe7b4518b0d722973cc83274e7bf7f" + "url": "https://static.crates.io/crates/evm_rpc_types/1.3.0/download", + "sha256": "fa134314bce7c35b9214710572fb7305edc7f4223c5bd03b5857ed08bbb05897" } }, "targets": [ @@ -23151,7 +24539,7 @@ "target": "hex" }, { - "id": "ic-cdk 0.16.0", + "id": "ic-cdk 0.17.1", "target": "ic_cdk" }, { @@ -23167,7 +24555,7 @@ "target": "strum" }, { - "id": "thiserror 1.0.68", + "id": "thiserror 2.0.11", "target": "thiserror" }, { @@ -23178,7 +24566,7 @@ "selects": {} }, "edition": "2021", - "version": "1.2.0" + "version": "1.3.0" }, "license": "Apache-2.0", "license_ids": [ @@ -24245,6 +25633,93 @@ ], "license_file": "LICENSE" }, + "foreign-types 0.3.2": { + "name": "foreign-types", + "version": "0.3.2", + "package_url": "https://github.com/sfackler/foreign-types", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/foreign-types/0.3.2/download", + "sha256": "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "foreign_types", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "foreign_types", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "foreign-types-shared 0.1.1", + "target": "foreign_types_shared" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.3.2" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "foreign-types-shared 0.1.1": { + "name": "foreign-types-shared", + "version": "0.1.1", + "package_url": "https://github.com/sfackler/foreign-types", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/foreign-types-shared/0.1.1/download", + "sha256": "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "foreign_types_shared", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "foreign_types_shared", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "edition": "2015", + "version": "0.1.1" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "form_urlencoded 1.2.1": { "name": "form_urlencoded", "version": "1.2.1", @@ -25832,6 +27307,58 @@ ], "license_file": "LICENSE-APACHE" }, + "ghash 0.5.1": { + "name": "ghash", + "version": "0.5.1", + "package_url": "https://github.com/RustCrypto/universal-hashes", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/ghash/0.5.1/download", + "sha256": "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" + } + }, + "targets": [ + { + "Library": { + "crate_name": "ghash", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "ghash", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "opaque-debug 0.3.0", + "target": "opaque_debug" + }, + { + "id": "polyval 0.6.2", + "target": "polyval" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.5.1" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "gimli 0.26.2": { "name": "gimli", "version": "0.26.2", @@ -26140,6 +27667,62 @@ ], "license_file": null }, + "group 0.12.1": { + "name": "group", + "version": "0.12.1", + "package_url": "https://github.com/zkcrypto/group", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/group/0.12.1/download", + "sha256": "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" + } + }, + "targets": [ + { + "Library": { + "crate_name": "group", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "group", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "ff 0.12.1", + "target": "ff" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.12.1" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "group 0.13.0": { "name": "group", "version": "0.13.0", @@ -26287,8 +27870,95 @@ ], "selects": {} }, - "edition": "2018", - "version": "0.3.26" + "edition": "2018", + "version": "0.3.26" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": "LICENSE" + }, + "h2 0.4.4": { + "name": "h2", + "version": "0.4.4", + "package_url": "https://github.com/hyperium/h2", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/h2/0.4.4/download", + "sha256": "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" + } + }, + "targets": [ + { + "Library": { + "crate_name": "h2", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "h2", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "bytes 1.9.0", + "target": "bytes" + }, + { + "id": "fnv 1.0.7", + "target": "fnv" + }, + { + "id": "futures-core 0.3.31", + "target": "futures_core" + }, + { + "id": "futures-sink 0.3.31", + "target": "futures_sink" + }, + { + "id": "futures-util 0.3.31", + "target": "futures_util" + }, + { + "id": "http 1.2.0", + "target": "http" + }, + { + "id": "indexmap 2.2.6", + "target": "indexmap" + }, + { + "id": "slab 0.4.8", + "target": "slab" + }, + { + "id": "tokio 1.42.0", + "target": "tokio" + }, + { + "id": "tokio-util 0.7.13", + "target": "tokio_util" + }, + { + "id": "tracing 0.1.41", + "target": "tracing" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.4" }, "license": "MIT", "license_ids": [ @@ -26296,20 +27966,20 @@ ], "license_file": "LICENSE" }, - "h2 0.4.4": { - "name": "h2", - "version": "0.4.4", - "package_url": "https://github.com/hyperium/h2", + "half 1.8.2": { + "name": "half", + "version": "1.8.2", + "package_url": "https://github.com/starkat99/half-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/h2/0.4.4/download", - "sha256": "816ec7294445779408f36fe57bc5b7fc1cf59664059096c65f905c1c61f58069" + "url": "https://static.crates.io/crates/half/1.8.2/download", + "sha256": "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" } }, "targets": [ { "Library": { - "crate_name": "h2", + "crate_name": "half", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -26320,83 +27990,35 @@ } } ], - "library_target_name": "h2", + "library_target_name": "half", "common_attrs": { "compile_data_glob": [ "**" ], - "deps": { - "common": [ - { - "id": "bytes 1.9.0", - "target": "bytes" - }, - { - "id": "fnv 1.0.7", - "target": "fnv" - }, - { - "id": "futures-core 0.3.31", - "target": "futures_core" - }, - { - "id": "futures-sink 0.3.31", - "target": "futures_sink" - }, - { - "id": "futures-util 0.3.31", - "target": "futures_util" - }, - { - "id": "http 1.2.0", - "target": "http" - }, - { - "id": "indexmap 2.2.6", - "target": "indexmap" - }, - { - "id": "slab 0.4.8", - "target": "slab" - }, - { - "id": "tokio 1.42.0", - "target": "tokio" - }, - { - "id": "tokio-util 0.7.13", - "target": "tokio_util" - }, - { - "id": "tracing 0.1.41", - "target": "tracing" - } - ], - "selects": {} - }, - "edition": "2021", - "version": "0.4.4" + "edition": "2018", + "version": "1.8.2" }, - "license": "MIT", + "license": "MIT OR Apache-2.0", "license_ids": [ + "Apache-2.0", "MIT" ], "license_file": "LICENSE" }, - "half 1.8.2": { - "name": "half", - "version": "1.8.2", - "package_url": "https://github.com/starkat99/half-rs", + "handlebars 4.5.0": { + "name": "handlebars", + "version": "4.5.0", + "package_url": "https://github.com/sunng87/handlebars-rust", "repository": { "Http": { - "url": "https://static.crates.io/crates/half/1.8.2/download", - "sha256": "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + "url": "https://static.crates.io/crates/handlebars/4.5.0/download", + "sha256": "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225" } }, "targets": [ { "Library": { - "crate_name": "half", + "crate_name": "handlebars", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -26407,17 +28029,56 @@ } } ], - "library_target_name": "half", + "library_target_name": "handlebars", "common_attrs": { "compile_data_glob": [ "**" ], - "edition": "2018", - "version": "1.8.2" + "crate_features": { + "common": [ + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "log 0.4.20", + "target": "log" + }, + { + "id": "pest 2.7.1", + "target": "pest" + }, + { + "id": "serde 1.0.217", + "target": "serde" + }, + { + "id": "serde_json 1.0.132", + "target": "serde_json" + }, + { + "id": "thiserror 1.0.68", + "target": "thiserror" + } + ], + "selects": {} + }, + "edition": "2021", + "proc_macro_deps": { + "common": [ + { + "id": "pest_derive 2.7.1", + "target": "pest_derive" + } + ], + "selects": {} + }, + "version": "4.5.0" }, - "license": "MIT OR Apache-2.0", + "license": "MIT", "license_ids": [ - "Apache-2.0", "MIT" ], "license_file": "LICENSE" @@ -30007,7 +31668,7 @@ "target": "stop_token" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" }, { @@ -30248,7 +31909,7 @@ "target": "systemstat" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" }, { @@ -30478,7 +32139,7 @@ "target": "hex" }, { - "id": "ic-cdk 0.17.0", + "id": "ic-cdk 0.17.1", "target": "ic_cdk" }, { @@ -30510,7 +32171,7 @@ "target": "sha2" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" } ], @@ -30656,82 +32317,14 @@ ], "license_file": "LICENSE" }, - "ic-cdk 0.16.0": { - "name": "ic-cdk", - "version": "0.16.0", - "package_url": "https://github.com/dfinity/cdk-rs", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/ic-cdk/0.16.0/download", - "sha256": "dd8ecacd682fa05a985253592963306cb9799622d7b1cce4b1edb89c6ec85be1" - } - }, - "targets": [ - { - "Library": { - "crate_name": "ic_cdk", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "ic_cdk", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "candid 0.10.13", - "target": "candid" - }, - { - "id": "ic0 0.23.0", - "target": "ic0" - }, - { - "id": "serde 1.0.217", - "target": "serde" - }, - { - "id": "serde_bytes 0.11.15", - "target": "serde_bytes" - } - ], - "selects": {} - }, - "edition": "2021", - "proc_macro_deps": { - "common": [ - { - "id": "ic-cdk-macros 0.16.0", - "target": "ic_cdk_macros" - } - ], - "selects": {} - }, - "version": "0.16.0" - }, - "license": "Apache-2.0", - "license_ids": [ - "Apache-2.0" - ], - "license_file": "LICENSE" - }, - "ic-cdk 0.17.0": { + "ic-cdk 0.17.1": { "name": "ic-cdk", - "version": "0.17.0", + "version": "0.17.1", "package_url": "https://github.com/dfinity/cdk-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/ic-cdk/0.17.0/download", - "sha256": "b2abdf9341da9f9f6b451a40609cb69645a05a8e9eb7784c16209f16f2c0f76f" + "url": "https://static.crates.io/crates/ic-cdk/0.17.1/download", + "sha256": "122efbcb0af5280d408a75a57b7dc6e9d92893bf6ed9cc98fe4dcff51f18b67c" } }, "targets": [ @@ -30778,13 +32371,13 @@ "proc_macro_deps": { "common": [ { - "id": "ic-cdk-macros 0.17.0", + "id": "ic-cdk-macros 0.17.1", "target": "ic_cdk_macros" } ], "selects": {} }, - "version": "0.17.0" + "version": "0.17.1" }, "license": "Apache-2.0", "license_ids": [ @@ -30843,7 +32436,7 @@ "target": "serde_bytes" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" } ], @@ -30926,141 +32519,7 @@ "selects": {} }, "edition": "2021", - "version": "0.8.4" - }, - "license": "Apache-2.0", - "license_ids": [ - "Apache-2.0" - ], - "license_file": "LICENSE" - }, - "ic-cdk-macros 0.9.0": { - "name": "ic-cdk-macros", - "version": "0.9.0", - "package_url": "https://github.com/dfinity/cdk-rs", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/ic-cdk-macros/0.9.0/download", - "sha256": "2fde5ca6ef1e69825c68916ff1bf7256b8f7ed69ac5ea3f1756f6e57f1503e27" - } - }, - "targets": [ - { - "ProcMacro": { - "crate_name": "ic_cdk_macros", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "ic_cdk_macros", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "candid 0.10.13", - "target": "candid" - }, - { - "id": "proc-macro2 1.0.89", - "target": "proc_macro2" - }, - { - "id": "quote 1.0.37", - "target": "quote" - }, - { - "id": "serde 1.0.217", - "target": "serde" - }, - { - "id": "serde_tokenstream 0.1.7", - "target": "serde_tokenstream" - }, - { - "id": "syn 1.0.109", - "target": "syn" - } - ], - "selects": {} - }, - "edition": "2021", - "version": "0.9.0" - }, - "license": "Apache-2.0", - "license_ids": [ - "Apache-2.0" - ], - "license_file": "LICENSE" - }, - "ic-cdk-macros 0.16.0": { - "name": "ic-cdk-macros", - "version": "0.16.0", - "package_url": "https://github.com/dfinity/cdk-rs", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/ic-cdk-macros/0.16.0/download", - "sha256": "0d4d857135deef20cc7ea8f3869a30cd9cfeb1392b3a81043790b2cd82adc3e0" - } - }, - "targets": [ - { - "ProcMacro": { - "crate_name": "ic_cdk_macros", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "ic_cdk_macros", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "deps": { - "common": [ - { - "id": "candid 0.10.13", - "target": "candid" - }, - { - "id": "proc-macro2 1.0.89", - "target": "proc_macro2" - }, - { - "id": "quote 1.0.37", - "target": "quote" - }, - { - "id": "serde 1.0.217", - "target": "serde" - }, - { - "id": "serde_tokenstream 0.2.1", - "target": "serde_tokenstream" - }, - { - "id": "syn 2.0.87", - "target": "syn" - } - ], - "selects": {} - }, - "edition": "2021", - "version": "0.16.0" + "version": "0.8.4" }, "license": "Apache-2.0", "license_ids": [ @@ -31068,14 +32527,14 @@ ], "license_file": "LICENSE" }, - "ic-cdk-macros 0.17.0": { + "ic-cdk-macros 0.17.1": { "name": "ic-cdk-macros", - "version": "0.17.0", + "version": "0.17.1", "package_url": "https://github.com/dfinity/cdk-rs", "repository": { "Http": { - "url": "https://static.crates.io/crates/ic-cdk-macros/0.17.0/download", - "sha256": "b8df41980e95dead28735ab0f748c75477b0c5eab37a09a5641c78ec406a1db0" + "url": "https://static.crates.io/crates/ic-cdk-macros/0.17.1/download", + "sha256": "c792bf0d1621c893ccf2bcdeac4ee70121103a03030a1827031a6b3c60488944" } }, "targets": [ @@ -31127,7 +32586,7 @@ "selects": {} }, "edition": "2021", - "version": "0.17.0" + "version": "0.17.1" }, "license": "Apache-2.0", "license_ids": [ @@ -31241,7 +32700,7 @@ "target": "futures" }, { - "id": "ic-cdk 0.17.0", + "id": "ic-cdk 0.17.1", "target": "ic_cdk" }, { @@ -31713,6 +33172,128 @@ ], "license_file": "LICENSE" }, + "ic-identity-hsm 0.39.3": { + "name": "ic-identity-hsm", + "version": "0.39.3", + "package_url": "https://github.com/dfinity/agent-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/ic-identity-hsm/0.39.3/download", + "sha256": "e294ee038eb647cd9cce78b5961533be7f883494e6ea1faece52459bce2d29e9" + } + }, + "targets": [ + { + "Library": { + "crate_name": "ic_identity_hsm", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "ic_identity_hsm", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "hex 0.4.3", + "target": "hex" + }, + { + "id": "ic-agent 0.39.2", + "target": "ic_agent" + }, + { + "id": "pkcs11 0.5.0", + "target": "pkcs11" + }, + { + "id": "sha2 0.10.8", + "target": "sha2" + }, + { + "id": "simple_asn1 0.6.2", + "target": "simple_asn1" + }, + { + "id": "thiserror 2.0.11", + "target": "thiserror" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.39.3" + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": null + }, + "ic-management-canister-types 0.1.0": { + "name": "ic-management-canister-types", + "version": "0.1.0", + "package_url": "https://github.com/dfinity/cdk-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/ic-management-canister-types/0.1.0/download", + "sha256": "eadff40906491c8c61a3c886cce4ee02f48a4798684d8a10e4a14891a217a284" + } + }, + "targets": [ + { + "Library": { + "crate_name": "ic_management_canister_types", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "ic_management_canister_types", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "candid 0.10.13", + "target": "candid" + }, + { + "id": "serde 1.0.217", + "target": "serde" + }, + { + "id": "serde_bytes 0.11.15", + "target": "serde_bytes" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.1.0" + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": "LICENSE" + }, "ic-metrics-encoder 1.1.1": { "name": "ic-metrics-encoder", "version": "1.1.1", @@ -32210,7 +33791,7 @@ "target": "sha2" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" } ], @@ -32933,7 +34514,7 @@ "deps": { "common": [ { - "id": "arbitrary 1.3.2", + "id": "arbitrary 1.4.1", "target": "arbitrary" }, { @@ -36331,7 +37912,7 @@ "target": "base64" }, { - "id": "minreq 2.13.0", + "id": "minreq 2.13.2", "target": "minreq" }, { @@ -36354,6 +37935,96 @@ ], "license_file": "LICENSE" }, + "k256 0.11.6": { + "name": "k256", + "version": "0.11.6", + "package_url": "https://github.com/RustCrypto/elliptic-curves/tree/master/k256", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/k256/0.11.6/download", + "sha256": "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "k256", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "k256", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "arithmetic", + "default", + "digest", + "ecdsa", + "ecdsa-core", + "keccak256", + "pem", + "pkcs8", + "schnorr", + "sha2", + "sha256", + "sha3", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "ecdsa 0.14.8", + "target": "ecdsa", + "alias": "ecdsa_core" + }, + { + "id": "elliptic-curve 0.12.3", + "target": "elliptic_curve" + }, + { + "id": "sha2 0.10.8", + "target": "sha2" + }, + { + "id": "sha3 0.10.8", + "target": "sha3" + } + ], + "selects": {} + }, + "edition": "2021", + "rustc_flags": { + "common": [ + "-C", + "opt-level=3" + ], + "selects": {} + }, + "version": "0.11.6" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "k256 0.13.4": { "name": "k256", "version": "0.13.4", @@ -36493,7 +38164,8 @@ ], "crate_features": { "common": [ - "v1_24" + "schemars", + "v1_28" ], "selects": {} }, @@ -36511,6 +38183,10 @@ "id": "k8s-openapi 0.22.0", "target": "build_script_build" }, + { + "id": "schemars 0.8.21", + "target": "schemars" + }, { "id": "serde 1.0.217", "target": "serde" @@ -36594,14 +38270,236 @@ ], "license_file": "LICENSE-APACHE" }, - "kube 0.93.1": { + "keyring 3.4.0": { + "name": "keyring", + "version": "3.4.0", + "package_url": "https://github.com/hwchen/keyring-rs.git", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/keyring/3.4.0/download", + "sha256": "bd3d701d3de5b9c4b0d9d077f8c2c66f0388d75e96932ebbb7cdff8713d7f7c6" + } + }, + "targets": [ + { + "Library": { + "crate_name": "keyring", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "keyring", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "apple-native", + "linux-native", + "sync-secret-service", + "vendored", + "windows-native" + ], + "selects": {} + }, + "deps": { + "common": [], + "selects": { + "aarch64-apple-darwin": [ + { + "id": "security-framework 3.0.1", + "target": "security_framework" + } + ], + "aarch64-apple-ios": [ + { + "id": "security-framework 3.0.1", + "target": "security_framework" + } + ], + "aarch64-apple-ios-sim": [ + { + "id": "security-framework 3.0.1", + "target": "security_framework" + } + ], + "aarch64-pc-windows-msvc": [ + { + "id": "byteorder 1.5.0", + "target": "byteorder" + }, + { + "id": "windows-sys 0.59.0", + "target": "windows_sys" + } + ], + "aarch64-unknown-linux-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "aarch64-unknown-nixos-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "arm-unknown-linux-gnueabi": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "armv7-unknown-linux-gnueabi": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "i686-apple-darwin": [ + { + "id": "security-framework 3.0.1", + "target": "security_framework" + } + ], + "i686-pc-windows-msvc": [ + { + "id": "byteorder 1.5.0", + "target": "byteorder" + }, + { + "id": "windows-sys 0.59.0", + "target": "windows_sys" + } + ], + "i686-unknown-freebsd": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + } + ], + "i686-unknown-linux-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "powerpc-unknown-linux-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "s390x-unknown-linux-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "x86_64-apple-darwin": [ + { + "id": "security-framework 3.0.1", + "target": "security_framework" + } + ], + "x86_64-apple-ios": [ + { + "id": "security-framework 3.0.1", + "target": "security_framework" + } + ], + "x86_64-pc-windows-msvc": [ + { + "id": "byteorder 1.5.0", + "target": "byteorder" + }, + { + "id": "windows-sys 0.59.0", + "target": "windows_sys" + } + ], + "x86_64-unknown-freebsd": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + } + ], + "x86_64-unknown-linux-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ], + "x86_64-unknown-nixos-gnu": [ + { + "id": "dbus-secret-service 4.0.3", + "target": "dbus_secret_service" + }, + { + "id": "linux-keyutils 0.2.4", + "target": "linux_keyutils" + } + ] + } + }, + "edition": "2021", + "version": "3.4.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "kube 0.94.2": { "name": "kube", - "version": "0.93.1", + "version": "0.94.2", "package_url": "https://github.com/kube-rs/kube", "repository": { "Http": { - "url": "https://static.crates.io/crates/kube/0.93.1/download", - "sha256": "0365920075af1a2d23619c1ca801c492f2400157de42627f041a061716e76416" + "url": "https://static.crates.io/crates/kube/0.94.2/download", + "sha256": "52ace78a62b361077505f2950bd48aa3e46596fb15350c9c993de15ddfa3cac5" } }, "targets": [ @@ -36628,7 +38526,9 @@ "client", "config", "default", + "derive", "kube-client", + "kube-derive", "rustls-tls" ], "selects": {} @@ -36640,18 +38540,27 @@ "target": "k8s_openapi" }, { - "id": "kube-client 0.93.1", + "id": "kube-client 0.94.2", "target": "kube_client" }, { - "id": "kube-core 0.93.1", + "id": "kube-core 0.94.2", "target": "kube_core" } ], "selects": {} }, "edition": "2021", - "version": "0.93.1" + "proc_macro_deps": { + "common": [ + { + "id": "kube-derive 0.94.2", + "target": "kube_derive" + } + ], + "selects": {} + }, + "version": "0.94.2" }, "license": "Apache-2.0", "license_ids": [ @@ -36659,14 +38568,14 @@ ], "license_file": null }, - "kube-client 0.93.1": { + "kube-client 0.94.2": { "name": "kube-client", - "version": "0.93.1", + "version": "0.94.2", "package_url": "https://github.com/kube-rs/kube", "repository": { "Http": { - "url": "https://static.crates.io/crates/kube-client/0.93.1/download", - "sha256": "d81336eb3a5b10a40c97a5a97ad66622e92bad942ce05ee789edd730aa4f8603" + "url": "https://static.crates.io/crates/kube-client/0.94.2/download", + "sha256": "18ec0fcafd3add30b413b096a61d69b0a37f94d3f95b6f505a57ea3d27cec2a7" } }, "targets": [ @@ -36782,7 +38691,7 @@ "target": "k8s_openapi" }, { - "id": "kube-core 0.93.1", + "id": "kube-core 0.94.2", "target": "kube_core" }, { @@ -36841,7 +38750,7 @@ "selects": {} }, "edition": "2021", - "version": "0.93.1" + "version": "0.94.2" }, "license": "Apache-2.0", "license_ids": [ @@ -36849,14 +38758,14 @@ ], "license_file": null }, - "kube-core 0.93.1": { + "kube-core 0.94.2": { "name": "kube-core", - "version": "0.93.1", + "version": "0.94.2", "package_url": "https://github.com/kube-rs/kube", "repository": { "Http": { - "url": "https://static.crates.io/crates/kube-core/0.93.1/download", - "sha256": "cce373a74d787d439063cdefab0f3672860bd7bac01a38e39019177e764a0fe6" + "url": "https://static.crates.io/crates/kube-core/0.94.2/download", + "sha256": "a50c095f051dada37740d883b6d47ad0430e95082140718073b773c8a70f231c" } }, "targets": [ @@ -36878,6 +38787,13 @@ "compile_data_glob": [ "**" ], + "crate_features": { + "common": [ + "schema", + "schemars" + ], + "selects": {} + }, "deps": { "common": [ { @@ -36896,10 +38812,18 @@ "id": "k8s-openapi 0.22.0", "target": "k8s_openapi" }, + { + "id": "schemars 0.8.21", + "target": "schemars" + }, { "id": "serde 1.0.217", "target": "serde" }, + { + "id": "serde-value 0.7.0", + "target": "serde_value" + }, { "id": "serde_json 1.0.132", "target": "serde_json" @@ -36912,7 +38836,70 @@ "selects": {} }, "edition": "2021", - "version": "0.93.1" + "version": "0.94.2" + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": null + }, + "kube-derive 0.94.2": { + "name": "kube-derive", + "version": "0.94.2", + "package_url": "https://github.com/kube-rs/kube", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/kube-derive/0.94.2/download", + "sha256": "7871f02c3c848b63fee3d2f2645bb4a3c0b68ee147badcddf1b0cf8fb5db87ad" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "kube_derive", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "kube_derive", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "darling 0.20.10", + "target": "darling" + }, + { + "id": "proc-macro2 1.0.89", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.37", + "target": "quote" + }, + { + "id": "serde_json 1.0.132", + "target": "serde_json" + }, + { + "id": "syn 2.0.87", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.94.2" }, "license": "Apache-2.0", "license_ids": [ @@ -38157,6 +40144,97 @@ ], "license_file": "LICENSE-APACHE" }, + "libdbus-sys 0.2.5": { + "name": "libdbus-sys", + "version": "0.2.5", + "package_url": "https://github.com/diwic/dbus-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/libdbus-sys/0.2.5/download", + "sha256": "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" + } + }, + "targets": [ + { + "Library": { + "crate_name": "libdbus_sys", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "libdbus_sys", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "cc", + "default", + "pkg-config", + "vendored" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "libdbus-sys 0.2.5", + "target": "build_script_build" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.2.5" + }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.1.37", + "target": "cc" + }, + { + "id": "pkg-config 0.3.27", + "target": "pkg_config" + } + ], + "selects": {} + }, + "links": "dbus" + }, + "license": "Apache-2.0/MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "libflate 2.1.0": { "name": "libflate", "version": "2.1.0", @@ -38332,7 +40410,7 @@ "deps": { "common": [ { - "id": "arbitrary 1.3.2", + "id": "arbitrary 1.4.1", "target": "arbitrary" }, { @@ -38374,6 +40452,89 @@ ], "license_file": "LICENSE-APACHE" }, + "libloading 0.5.2": { + "name": "libloading", + "version": "0.5.2", + "package_url": "https://github.com/nagisa/rust_libloading/", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/libloading/0.5.2/download", + "sha256": "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" + } + }, + "targets": [ + { + "Library": { + "crate_name": "libloading", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "libloading", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "libloading 0.5.2", + "target": "build_script_build" + } + ], + "selects": { + "cfg(windows)": [ + { + "id": "winapi 0.3.9", + "target": "winapi" + } + ] + } + }, + "edition": "2015", + "version": "0.5.2" + }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.1.37", + "target": "cc" + } + ], + "selects": {} + } + }, + "license": "ISC", + "license_ids": [ + "ISC" + ], + "license_file": "LICENSE" + }, "libloading 0.7.4": { "name": "libloading", "version": "0.7.4", @@ -38829,7 +40990,7 @@ "selects": { "cfg(unix)": [ { - "id": "openssl-sys 0.9.102", + "id": "openssl-sys 0.9.105", "target": "openssl_sys" } ] @@ -38875,7 +41036,7 @@ "selects": { "cfg(unix)": [ { - "id": "openssl-sys 0.9.102", + "id": "openssl-sys 0.9.105", "target": "openssl_sys" } ] @@ -39120,6 +41281,65 @@ ], "license_file": "LICENSE-APACHE" }, + "linux-keyutils 0.2.4": { + "name": "linux-keyutils", + "version": "0.2.4", + "package_url": "https://github.com/landhb/linux-keyutils", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/linux-keyutils/0.2.4/download", + "sha256": "761e49ec5fd8a5a463f9b84e877c373d888935b71c6be78f3767fe2ae6bed18e" + } + }, + "targets": [ + { + "Library": { + "crate_name": "linux_keyutils", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "linux_keyutils", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "bitflags 2.6.0", + "target": "bitflags" + }, + { + "id": "libc 0.2.158", + "target": "libc" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.2.4" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": null + }, "linux-raw-sys 0.4.13": { "name": "linux-raw-sys", "version": "0.4.13", @@ -40985,6 +43205,56 @@ ], "license_file": "LICENSE-APACHE" }, + "memmap2 0.9.5": { + "name": "memmap2", + "version": "0.9.5", + "package_url": "https://github.com/RazrFalcon/memmap2-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/memmap2/0.9.5/download", + "sha256": "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" + } + }, + "targets": [ + { + "Library": { + "crate_name": "memmap2", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "memmap2", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [], + "selects": { + "cfg(unix)": [ + { + "id": "libc 0.2.158", + "target": "libc" + } + ] + } + }, + "edition": "2018", + "version": "0.9.5" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "memoffset 0.6.5": { "name": "memoffset", "version": "0.6.5", @@ -41814,14 +44084,14 @@ ], "license_file": "LICENSE" }, - "minreq 2.13.0": { + "minreq 2.13.2": { "name": "minreq", - "version": "2.13.0", + "version": "2.13.2", "package_url": "https://github.com/neonmoe/minreq", "repository": { "Http": { - "url": "https://static.crates.io/crates/minreq/2.13.0/download", - "sha256": "36a8e50e917e18a37d500d27d40b7bc7d127e71c0c94fb2d83f43b4afd308390" + "url": "https://static.crates.io/crates/minreq/2.13.2/download", + "sha256": "da0c420feb01b9fb5061f8c8f452534361dd783756dcf38ec45191ce55e7a161" } }, "targets": [ @@ -41870,7 +44140,7 @@ "target": "log" }, { - "id": "minreq 2.13.0", + "id": "minreq 2.13.2", "target": "build_script_build" }, { @@ -41885,7 +44155,7 @@ "selects": {} }, "edition": "2018", - "version": "2.13.0" + "version": "2.13.2" }, "build_script_attrs": { "compile_data_glob": [ @@ -43747,6 +46017,82 @@ ], "license_file": null }, + "num 0.4.3": { + "name": "num", + "version": "0.4.3", + "package_url": "https://github.com/rust-num/num", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/num/0.4.3/download", + "sha256": "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" + } + }, + "targets": [ + { + "Library": { + "crate_name": "num", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "num", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "num-bigint", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "num-bigint 0.4.6", + "target": "num_bigint" + }, + { + "id": "num-complex 0.4.6", + "target": "num_complex" + }, + { + "id": "num-integer 0.1.46", + "target": "num_integer" + }, + { + "id": "num-iter 0.1.45", + "target": "num_iter" + }, + { + "id": "num-rational 0.4.2", + "target": "num_rational" + }, + { + "id": "num-traits 0.2.19", + "target": "num_traits" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.3" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "num-bigint 0.2.6": { "name": "num-bigint", "version": "0.2.6", @@ -43790,6 +46136,7 @@ ], "crate_features": { "common": [ + "default", "std" ], "selects": {} @@ -44023,6 +46370,60 @@ ], "license_file": "LICENSE-APACHE" }, + "num-complex 0.4.6": { + "name": "num-complex", + "version": "0.4.6", + "package_url": "https://github.com/rust-num/num-complex", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/num-complex/0.4.6/download", + "sha256": "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" + } + }, + "targets": [ + { + "Library": { + "crate_name": "num_complex", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "num_complex", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "num-traits 0.2.19", + "target": "num_traits" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.6" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "num-conv 0.1.0": { "name": "num-conv", "version": "0.1.0", @@ -44198,6 +46599,55 @@ "compile_data_glob": [ "**" ], + "crate_features": { + "common": [], + "selects": { + "aarch64-unknown-linux-gnu": [ + "i128", + "std" + ], + "aarch64-unknown-nixos-gnu": [ + "i128", + "std" + ], + "arm-unknown-linux-gnueabi": [ + "i128", + "std" + ], + "armv7-unknown-linux-gnueabi": [ + "i128", + "std" + ], + "i686-unknown-freebsd": [ + "i128", + "std" + ], + "i686-unknown-linux-gnu": [ + "i128", + "std" + ], + "powerpc-unknown-linux-gnu": [ + "i128", + "std" + ], + "s390x-unknown-linux-gnu": [ + "i128", + "std" + ], + "x86_64-unknown-freebsd": [ + "i128", + "std" + ], + "x86_64-unknown-linux-gnu": [ + "i128", + "std" + ], + "x86_64-unknown-nixos-gnu": [ + "i128", + "std" + ] + } + }, "deps": { "common": [ { @@ -44320,6 +46770,70 @@ ], "license_file": "LICENSE-APACHE" }, + "num-rational 0.4.2": { + "name": "num-rational", + "version": "0.4.2", + "package_url": "https://github.com/rust-num/num-rational", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/num-rational/0.4.2/download", + "sha256": "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" + } + }, + "targets": [ + { + "Library": { + "crate_name": "num_rational", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "num_rational", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "num-bigint", + "num-bigint-std", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "num-bigint 0.4.6", + "target": "num_bigint" + }, + { + "id": "num-integer 0.1.46", + "target": "num_integer" + }, + { + "id": "num-traits 0.2.19", + "target": "num_traits" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.2" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "num-traits 0.2.19": { "name": "num-traits", "version": "0.2.19", @@ -45259,6 +47773,173 @@ ], "license_file": "LICENSE-APACHE" }, + "openssl 0.10.70": { + "name": "openssl", + "version": "0.10.70", + "package_url": "https://github.com/sfackler/rust-openssl", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/openssl/0.10.70/download", + "sha256": "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" + } + }, + "targets": [ + { + "Library": { + "crate_name": "openssl", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "openssl", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "bitflags 2.6.0", + "target": "bitflags" + }, + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "foreign-types 0.3.2", + "target": "foreign_types" + }, + { + "id": "libc 0.2.158", + "target": "libc" + }, + { + "id": "once_cell 1.19.0", + "target": "once_cell" + }, + { + "id": "openssl 0.10.70", + "target": "build_script_build" + }, + { + "id": "openssl-sys 0.9.105", + "target": "openssl_sys", + "alias": "ffi" + } + ], + "selects": {} + }, + "edition": "2021", + "proc_macro_deps": { + "common": [ + { + "id": "openssl-macros 0.1.1", + "target": "openssl_macros" + } + ], + "selects": {} + }, + "version": "0.10.70" + }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ], + "link_deps": { + "common": [ + { + "id": "openssl-sys 0.9.105", + "target": "openssl_sys", + "alias": "ffi" + } + ], + "selects": {} + } + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": "LICENSE" + }, + "openssl-macros 0.1.1": { + "name": "openssl-macros", + "version": "0.1.1", + "package_url": null, + "repository": { + "Http": { + "url": "https://static.crates.io/crates/openssl-macros/0.1.1/download", + "sha256": "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "openssl_macros", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "openssl_macros", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "proc-macro2 1.0.89", + "target": "proc_macro2" + }, + { + "id": "quote 1.0.37", + "target": "quote" + }, + { + "id": "syn 2.0.87", + "target": "syn" + } + ], + "selects": {} + }, + "edition": "2018", + "version": "0.1.1" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "openssl-probe 0.1.5": { "name": "openssl-probe", "version": "0.1.5", @@ -45298,14 +47979,62 @@ ], "license_file": "LICENSE-APACHE" }, - "openssl-sys 0.9.102": { + "openssl-src 300.4.1+3.4.0": { + "name": "openssl-src", + "version": "300.4.1+3.4.0", + "package_url": "https://github.com/alexcrichton/openssl-src-rs", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/openssl-src/300.4.1+3.4.0/download", + "sha256": "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "openssl_src", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "openssl_src", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cc 1.1.37", + "target": "cc" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "300.4.1+3.4.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "openssl-sys 0.9.105": { "name": "openssl-sys", - "version": "0.9.102", + "version": "0.9.105", "package_url": "https://github.com/sfackler/rust-openssl", "repository": { "Http": { - "url": "https://static.crates.io/crates/openssl-sys/0.9.102/download", - "sha256": "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" + "url": "https://static.crates.io/crates/openssl-sys/0.9.105/download", + "sha256": "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" } }, "targets": [ @@ -45346,14 +48075,14 @@ "target": "libc" }, { - "id": "openssl-sys 0.9.102", + "id": "openssl-sys 0.9.105", "target": "build_script_main" } ], "selects": {} }, - "edition": "2018", - "version": "0.9.102" + "edition": "2021", + "version": "0.9.105" }, "build_script_attrs": { "compile_data_glob": [ @@ -47459,7 +50188,209 @@ } } ], - "library_target_name": "parking_lot_core", + "library_target_name": "parking_lot_core", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "parking_lot_core 0.9.8", + "target": "build_script_build" + }, + { + "id": "smallvec 1.13.2", + "target": "smallvec" + } + ], + "selects": { + "cfg(target_os = \"redox\")": [ + { + "id": "redox_syscall 0.3.5", + "target": "syscall" + } + ], + "cfg(unix)": [ + { + "id": "libc 0.2.158", + "target": "libc" + } + ], + "cfg(windows)": [ + { + "id": "windows-targets 0.48.1", + "target": "windows_targets" + } + ] + } + }, + "edition": "2018", + "version": "0.9.8" + }, + "build_script_attrs": { + "compile_data_glob": [ + "**" + ], + "data_glob": [ + "**" + ] + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "parse-size 1.1.0": { + "name": "parse-size", + "version": "1.1.0", + "package_url": "https://github.com/kennytm/parse-size", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/parse-size/1.1.0/download", + "sha256": "487f2ccd1e17ce8c1bfab3a65c89525af41cfad4c8659021a1e9a2aacd73b89b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "parse_size", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "parse_size", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "std" + ], + "selects": {} + }, + "edition": "2021", + "version": "1.1.0" + }, + "license": "MIT", + "license_ids": [ + "MIT" + ], + "license_file": "LICENSE.txt" + }, + "password-hash 0.4.2": { + "name": "password-hash", + "version": "0.4.2", + "package_url": "https://github.com/RustCrypto/traits/tree/master/password-hash", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/password-hash/0.4.2/download", + "sha256": "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" + } + }, + "targets": [ + { + "Library": { + "crate_name": "password_hash", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "password_hash", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "rand_core" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "base64ct 1.6.0", + "target": "base64ct" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.4.2" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, + "paste 1.0.15": { + "name": "paste", + "version": "1.0.15", + "package_url": "https://github.com/dtolnay/paste", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/paste/1.0.15/download", + "sha256": "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + } + }, + "targets": [ + { + "ProcMacro": { + "crate_name": "paste", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + }, + { + "BuildScript": { + "crate_name": "build_script_build", + "crate_root": "build.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "paste", "common_attrs": { "compile_data_glob": [ "**" @@ -47467,41 +50398,14 @@ "deps": { "common": [ { - "id": "cfg-if 1.0.0", - "target": "cfg_if" - }, - { - "id": "parking_lot_core 0.9.8", + "id": "paste 1.0.15", "target": "build_script_build" - }, - { - "id": "smallvec 1.13.2", - "target": "smallvec" } ], - "selects": { - "cfg(target_os = \"redox\")": [ - { - "id": "redox_syscall 0.3.5", - "target": "syscall" - } - ], - "cfg(unix)": [ - { - "id": "libc 0.2.158", - "target": "libc" - } - ], - "cfg(windows)": [ - { - "id": "windows-targets 0.48.1", - "target": "windows_targets" - } - ] - } + "selects": {} }, "edition": "2018", - "version": "0.9.8" + "version": "1.0.15" }, "build_script_attrs": { "compile_data_glob": [ @@ -47518,64 +50422,20 @@ ], "license_file": "LICENSE-APACHE" }, - "parse-size 1.1.0": { - "name": "parse-size", - "version": "1.1.0", - "package_url": "https://github.com/kennytm/parse-size", + "pbkdf2 0.11.0": { + "name": "pbkdf2", + "version": "0.11.0", + "package_url": "https://github.com/RustCrypto/password-hashes/tree/master/pbkdf2", "repository": { "Http": { - "url": "https://static.crates.io/crates/parse-size/1.1.0/download", - "sha256": "487f2ccd1e17ce8c1bfab3a65c89525af41cfad4c8659021a1e9a2aacd73b89b" + "url": "https://static.crates.io/crates/pbkdf2/0.11.0/download", + "sha256": "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" } }, "targets": [ { "Library": { - "crate_name": "parse_size", - "crate_root": "src/lib.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } - } - ], - "library_target_name": "parse_size", - "common_attrs": { - "compile_data_glob": [ - "**" - ], - "crate_features": { - "common": [ - "std" - ], - "selects": {} - }, - "edition": "2021", - "version": "1.1.0" - }, - "license": "MIT", - "license_ids": [ - "MIT" - ], - "license_file": "LICENSE.txt" - }, - "paste 1.0.15": { - "name": "paste", - "version": "1.0.15", - "package_url": "https://github.com/dtolnay/paste", - "repository": { - "Http": { - "url": "https://static.crates.io/crates/paste/1.0.15/download", - "sha256": "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - } - }, - "targets": [ - { - "ProcMacro": { - "crate_name": "paste", + "crate_name": "pbkdf2", "crate_root": "src/lib.rs", "srcs": { "allow_empty": true, @@ -47584,21 +50444,9 @@ ] } } - }, - { - "BuildScript": { - "crate_name": "build_script_build", - "crate_root": "build.rs", - "srcs": { - "allow_empty": true, - "include": [ - "**/*.rs" - ] - } - } } ], - "library_target_name": "paste", + "library_target_name": "pbkdf2", "common_attrs": { "compile_data_glob": [ "**" @@ -47606,22 +50454,14 @@ "deps": { "common": [ { - "id": "paste 1.0.15", - "target": "build_script_build" + "id": "digest 0.10.7", + "target": "digest" } ], "selects": {} }, - "edition": "2018", - "version": "1.0.15" - }, - "build_script_attrs": { - "compile_data_glob": [ - "**" - ], - "data_glob": [ - "**" - ] + "edition": "2021", + "version": "0.11.0" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -47969,6 +50809,60 @@ ], "license_file": "LICENSE.md" }, + "pem-rfc7468 0.6.0": { + "name": "pem-rfc7468", + "version": "0.6.0", + "package_url": "https://github.com/RustCrypto/formats/tree/master/pem-rfc7468", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/pem-rfc7468/0.6.0/download", + "sha256": "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" + } + }, + "targets": [ + { + "Library": { + "crate_name": "pem_rfc7468", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "pem_rfc7468", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "base64ct 1.6.0", + "target": "base64ct" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.6.0" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "pem-rfc7468 0.7.0": { "name": "pem-rfc7468", "version": "0.7.0", @@ -49267,6 +52161,116 @@ ], "license_file": "LICENSE-APACHE" }, + "pkcs11 0.5.0": { + "name": "pkcs11", + "version": "0.5.0", + "package_url": "https://github.com/mheese/rust-pkcs11", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/pkcs11/0.5.0/download", + "sha256": "3aca6d67e4c8613bfe455599d0233d00735f85df2001f6bfd9bb7ac0496b10af" + } + }, + "targets": [ + { + "Library": { + "crate_name": "pkcs11", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "pkcs11", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "libloading 0.5.2", + "target": "libloading" + }, + { + "id": "num-bigint 0.2.6", + "target": "num_bigint" + } + ], + "selects": {} + }, + "edition": "2015", + "version": "0.5.0" + }, + "license": "Apache-2.0", + "license_ids": [ + "Apache-2.0" + ], + "license_file": "LICENSE" + }, + "pkcs8 0.9.0": { + "name": "pkcs8", + "version": "0.9.0", + "package_url": "https://github.com/RustCrypto/formats/tree/master/pkcs8", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/pkcs8/0.9.0/download", + "sha256": "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" + } + }, + "targets": [ + { + "Library": { + "crate_name": "pkcs8", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "pkcs8", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "pem" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "der 0.6.1", + "target": "der" + }, + { + "id": "spki 0.6.0", + "target": "spki" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.9.0" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "pkcs8 0.10.2": { "name": "pkcs8", "version": "0.10.2", @@ -49582,7 +52586,7 @@ "target": "reqwest" }, { - "id": "schemars 0.8.16", + "id": "schemars 0.8.21", "target": "schemars" }, { @@ -49799,6 +52803,69 @@ ], "license_file": "LICENSE-APACHE" }, + "polyval 0.6.2": { + "name": "polyval", + "version": "0.6.2", + "package_url": "https://github.com/RustCrypto/universal-hashes", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/polyval/0.6.2/download", + "sha256": "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" + } + }, + "targets": [ + { + "Library": { + "crate_name": "polyval", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "polyval", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "cfg-if 1.0.0", + "target": "cfg_if" + }, + { + "id": "opaque-debug 0.3.0", + "target": "opaque_debug" + }, + { + "id": "universal-hash 0.5.1", + "target": "universal_hash" + } + ], + "selects": { + "cfg(any(target_arch = \"aarch64\", target_arch = \"x86_64\", target_arch = \"x86\"))": [ + { + "id": "cpufeatures 0.2.9", + "target": "cpufeatures" + } + ] + } + }, + "edition": "2021", + "version": "0.6.2" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "portable-atomic 1.4.1": { "name": "portable-atomic", "version": "1.4.1", @@ -52877,14 +55944,14 @@ ], "license_file": "LICENSE" }, - "pulley-interpreter 28.0.0": { + "pulley-interpreter 29.0.1": { "name": "pulley-interpreter", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime/tree/main/pulley", "repository": { "Http": { - "url": "https://static.crates.io/crates/pulley-interpreter/28.0.0/download", - "sha256": "403a1a95f4c18a45c86c7bff13df00347afd0abcbf2e54af273c837339ffcf77" + "url": "https://static.crates.io/crates/pulley-interpreter/29.0.1/download", + "sha256": "62d95f8575df49a2708398182f49a888cf9dc30210fb1fd2df87c889edcee75d" } }, "targets": [ @@ -52909,7 +55976,7 @@ "deps": { "common": [ { - "id": "cranelift-bitset 0.115.0", + "id": "cranelift-bitset 0.116.1", "target": "cranelift_bitset" }, { @@ -52924,7 +55991,7 @@ "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -59125,6 +62192,62 @@ ], "license_file": "LICENSE-APACHE" }, + "rfc6979 0.3.1": { + "name": "rfc6979", + "version": "0.3.1", + "package_url": "https://github.com/RustCrypto/signatures/tree/master/rfc6979", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/rfc6979/0.3.1/download", + "sha256": "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" + } + }, + "targets": [ + { + "Library": { + "crate_name": "rfc6979", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "rfc6979", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "deps": { + "common": [ + { + "id": "crypto-bigint 0.4.9", + "target": "crypto_bigint" + }, + { + "id": "hmac 0.12.1", + "target": "hmac" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.3.1" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "rfc6979 0.4.0": { "name": "rfc6979", "version": "0.4.0", @@ -62029,7 +65152,7 @@ "target": "serde_json" }, { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "thiserror" }, { @@ -63109,14 +66232,14 @@ ], "license_file": "LICENSE.md" }, - "schemars 0.8.16": { + "schemars 0.8.21": { "name": "schemars", - "version": "0.8.16", + "version": "0.8.21", "package_url": "https://github.com/GREsau/schemars", "repository": { "Http": { - "url": "https://static.crates.io/crates/schemars/0.8.16/download", - "sha256": "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" + "url": "https://static.crates.io/crates/schemars/0.8.21/download", + "sha256": "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" } }, "targets": [ @@ -63172,7 +66295,7 @@ "alias": "indexmap2" }, { - "id": "schemars 0.8.16", + "id": "schemars 0.8.21", "target": "build_script_build" }, { @@ -63190,13 +66313,13 @@ "proc_macro_deps": { "common": [ { - "id": "schemars_derive 0.8.16", + "id": "schemars_derive 0.8.21", "target": "schemars_derive" } ], "selects": {} }, - "version": "0.8.16" + "version": "0.8.21" }, "build_script_attrs": { "compile_data_glob": [ @@ -63212,14 +66335,14 @@ ], "license_file": "LICENSE" }, - "schemars_derive 0.8.16": { + "schemars_derive 0.8.21": { "name": "schemars_derive", - "version": "0.8.16", + "version": "0.8.21", "package_url": "https://github.com/GREsau/schemars", "repository": { "Http": { - "url": "https://static.crates.io/crates/schemars_derive/0.8.16/download", - "sha256": "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" + "url": "https://static.crates.io/crates/schemars_derive/0.8.21/download", + "sha256": "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" } }, "targets": [ @@ -63252,18 +66375,18 @@ "target": "quote" }, { - "id": "serde_derive_internals 0.26.0", + "id": "serde_derive_internals 0.29.1", "target": "serde_derive_internals" }, { - "id": "syn 1.0.109", + "id": "syn 2.0.87", "target": "syn" } ], "selects": {} }, "edition": "2021", - "version": "0.8.16" + "version": "0.8.21" }, "license": "MIT", "license_ids": [ @@ -63573,6 +66696,90 @@ ], "license_file": null }, + "sec1 0.3.0": { + "name": "sec1", + "version": "0.3.0", + "package_url": "https://github.com/RustCrypto/formats/tree/master/sec1", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/sec1/0.3.0/download", + "sha256": "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" + } + }, + "targets": [ + { + "Library": { + "crate_name": "sec1", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "sec1", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "base16ct", + "default", + "der", + "generic-array", + "pem", + "pkcs8", + "point", + "std", + "subtle", + "zeroize" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "base16ct 0.1.1", + "target": "base16ct" + }, + { + "id": "der 0.6.1", + "target": "der" + }, + { + "id": "generic-array 0.14.7", + "target": "generic_array" + }, + { + "id": "pkcs8 0.9.0", + "target": "pkcs8" + }, + { + "id": "subtle 2.6.1", + "target": "subtle" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.3.0" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "sec1 0.7.3": { "name": "sec1", "version": "0.7.3", @@ -63793,14 +67000,14 @@ ], "license_file": "LICENSE" }, - "secp256k1 0.29.1": { + "secp256k1 0.29.0": { "name": "secp256k1", - "version": "0.29.1", + "version": "0.29.0", "package_url": "https://github.com/rust-bitcoin/rust-secp256k1/", "repository": { "Http": { - "url": "https://static.crates.io/crates/secp256k1/0.29.1/download", - "sha256": "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" + "url": "https://static.crates.io/crates/secp256k1/0.29.0/download", + "sha256": "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" } }, "targets": [ @@ -63857,7 +67064,7 @@ "selects": {} }, "edition": "2021", - "version": "0.29.1" + "version": "0.29.0" }, "license": "CC0-1.0", "license_ids": [ @@ -64268,6 +67475,77 @@ ], "license_file": "LICENSE-APACHE" }, + "security-framework 3.0.1": { + "name": "security-framework", + "version": "3.0.1", + "package_url": "https://github.com/kornelski/rust-security-framework", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/security-framework/3.0.1/download", + "sha256": "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" + } + }, + "targets": [ + { + "Library": { + "crate_name": "security_framework", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "security_framework", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "OSX_10_12", + "default" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "bitflags 2.6.0", + "target": "bitflags" + }, + { + "id": "core-foundation 0.10.0", + "target": "core_foundation" + }, + { + "id": "core-foundation-sys 0.8.7", + "target": "core_foundation_sys" + }, + { + "id": "libc 0.2.158", + "target": "libc" + }, + { + "id": "security-framework-sys 2.12.0", + "target": "security_framework_sys" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "3.0.1" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "security-framework-sys 2.12.0": { "name": "security-framework-sys", "version": "2.12.0", @@ -64958,14 +68236,14 @@ ], "license_file": "LICENSE-APACHE" }, - "serde_derive_internals 0.26.0": { + "serde_derive_internals 0.29.1": { "name": "serde_derive_internals", - "version": "0.26.0", + "version": "0.29.1", "package_url": "https://github.com/serde-rs/serde", "repository": { "Http": { - "url": "https://static.crates.io/crates/serde_derive_internals/0.26.0/download", - "sha256": "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" + "url": "https://static.crates.io/crates/serde_derive_internals/0.29.1/download", + "sha256": "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" } }, "targets": [ @@ -64998,14 +68276,14 @@ "target": "quote" }, { - "id": "syn 1.0.109", + "id": "syn 2.0.87", "target": "syn" } ], "selects": {} }, "edition": "2015", - "version": "0.26.0" + "version": "0.29.1" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -66331,6 +69609,52 @@ ], "license_file": "LICENSE" }, + "shell-words 1.1.0": { + "name": "shell-words", + "version": "1.1.0", + "package_url": "https://github.com/tmiasko/shell-words", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/shell-words/1.1.0/download", + "sha256": "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + } + }, + "targets": [ + { + "Library": { + "crate_name": "shell_words", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "shell_words", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "default", + "std" + ], + "selects": {} + }, + "edition": "2015", + "version": "1.1.0" + }, + "license": "MIT/Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "shlex 1.3.0": { "name": "shlex", "version": "1.3.0", @@ -66573,6 +69897,69 @@ ], "license_file": "LICENSE-APACHE" }, + "signature 1.6.4": { + "name": "signature", + "version": "1.6.4", + "package_url": "https://github.com/RustCrypto/traits/tree/master/signature", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/signature/1.6.4/download", + "sha256": "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + } + }, + "targets": [ + { + "Library": { + "crate_name": "signature", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "signature", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "digest", + "digest-preview", + "hazmat-preview", + "rand-preview", + "rand_core", + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "digest 0.10.7", + "target": "digest" + }, + { + "id": "rand_core 0.6.4", + "target": "rand_core" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "1.6.4" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "signature 2.2.0": { "name": "signature", "version": "2.2.0", @@ -68159,6 +71546,66 @@ ], "license_file": "LICENSE" }, + "spki 0.6.0": { + "name": "spki", + "version": "0.6.0", + "package_url": "https://github.com/RustCrypto/formats/tree/master/spki", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/spki/0.6.0/download", + "sha256": "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" + } + }, + "targets": [ + { + "Library": { + "crate_name": "spki", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "spki", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "alloc", + "base64ct", + "pem" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "base64ct 1.6.0", + "target": "base64ct" + }, + { + "id": "der 0.6.1", + "target": "der" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "0.6.0" + }, + "license": "Apache-2.0 OR MIT", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "spki 0.7.3": { "name": "spki", "version": "0.7.3", @@ -70522,14 +73969,14 @@ ], "license_file": "LICENSE-APACHE" }, - "target-lexicon 0.12.16": { + "target-lexicon 0.13.1": { "name": "target-lexicon", - "version": "0.12.16", + "version": "0.13.1", "package_url": "https://github.com/bytecodealliance/target-lexicon", "repository": { "Http": { - "url": "https://static.crates.io/crates/target-lexicon/0.12.16/download", - "sha256": "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + "url": "https://static.crates.io/crates/target-lexicon/0.13.1/download", + "sha256": "dc12939a1c9b9d391e0b7135f72fd30508b73450753e28341fed159317582a77" } }, "targets": [ @@ -70572,14 +74019,14 @@ "deps": { "common": [ { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "build_script_build" } ], "selects": {} }, "edition": "2018", - "version": "0.12.16" + "version": "0.13.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -71515,14 +74962,14 @@ ], "license_file": "LICENSE-APACHE" }, - "thiserror 2.0.3": { + "thiserror 2.0.11": { "name": "thiserror", - "version": "2.0.3", + "version": "2.0.11", "package_url": "https://github.com/dtolnay/thiserror", "repository": { "Http": { - "url": "https://static.crates.io/crates/thiserror/2.0.3/download", - "sha256": "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" + "url": "https://static.crates.io/crates/thiserror/2.0.11/download", + "sha256": "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" } }, "targets": [ @@ -71566,7 +75013,7 @@ "deps": { "common": [ { - "id": "thiserror 2.0.3", + "id": "thiserror 2.0.11", "target": "build_script_build" } ], @@ -71576,13 +75023,13 @@ "proc_macro_deps": { "common": [ { - "id": "thiserror-impl 2.0.3", + "id": "thiserror-impl 2.0.11", "target": "thiserror_impl" } ], "selects": {} }, - "version": "2.0.3" + "version": "2.0.11" }, "build_script_attrs": { "compile_data_glob": [ @@ -71655,14 +75102,14 @@ ], "license_file": "LICENSE-APACHE" }, - "thiserror-impl 2.0.3": { + "thiserror-impl 2.0.11": { "name": "thiserror-impl", - "version": "2.0.3", + "version": "2.0.11", "package_url": "https://github.com/dtolnay/thiserror", "repository": { "Http": { - "url": "https://static.crates.io/crates/thiserror-impl/2.0.3/download", - "sha256": "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" + "url": "https://static.crates.io/crates/thiserror-impl/2.0.11/download", + "sha256": "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" } }, "targets": [ @@ -71702,7 +75149,7 @@ "selects": {} }, "edition": "2021", - "version": "2.0.3" + "version": "2.0.11" }, "license": "MIT OR Apache-2.0", "license_ids": [ @@ -72118,6 +75565,8 @@ "local-offset", "macros", "parsing", + "serde", + "serde-human-readable", "std" ], "selects": {} @@ -72140,6 +75589,10 @@ "id": "powerfmt 0.2.0", "target": "powerfmt" }, + { + "id": "serde 1.0.217", + "target": "serde" + }, { "id": "time-core 0.1.2", "target": "time_core" @@ -72478,7 +75931,8 @@ "crate_features": { "common": [ "formatting", - "parsing" + "parsing", + "serde" ], "selects": {} }, @@ -72505,6 +75959,110 @@ ], "license_file": "LICENSE-Apache" }, + "tiny-bip39 1.0.0": { + "name": "tiny-bip39", + "version": "1.0.0", + "package_url": "https://github.com/maciejhirsz/tiny-bip39/", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/tiny-bip39/1.0.0/download", + "sha256": "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" + } + }, + "targets": [ + { + "Library": { + "crate_name": "bip39", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "bip39", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "chinese-simplified", + "chinese-traditional", + "default", + "french", + "italian", + "japanese", + "korean", + "spanish" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "anyhow 1.0.93", + "target": "anyhow" + }, + { + "id": "hmac 0.12.1", + "target": "hmac" + }, + { + "id": "once_cell 1.19.0", + "target": "once_cell" + }, + { + "id": "pbkdf2 0.11.0", + "target": "pbkdf2" + }, + { + "id": "rand 0.8.5", + "target": "rand" + }, + { + "id": "rustc-hash 1.1.0", + "target": "rustc_hash" + }, + { + "id": "sha2 0.10.8", + "target": "sha2" + }, + { + "id": "thiserror 1.0.68", + "target": "thiserror" + }, + { + "id": "unicode-normalization 0.1.22", + "target": "unicode_normalization" + }, + { + "id": "zeroize 1.8.1", + "target": "zeroize" + } + ], + "selects": { + "cfg(target_arch = \"wasm32\")": [ + { + "id": "wasm-bindgen 0.2.95", + "target": "wasm_bindgen" + } + ] + } + }, + "edition": "2018", + "version": "1.0.0" + }, + "license": "MIT OR Apache-2.0", + "license_ids": [ + "Apache-2.0", + "MIT" + ], + "license_file": "LICENSE-APACHE" + }, "tiny-keccak 2.0.2": { "name": "tiny-keccak", "version": "2.0.2", @@ -79595,7 +83153,7 @@ "target": "anyhow" }, { - "id": "arbitrary 1.3.2", + "id": "arbitrary 1.4.1", "target": "arbitrary" }, { @@ -80113,14 +83671,14 @@ ], "license_file": null }, - "wasmtime 28.0.0": { + "wasmtime 29.0.1": { "name": "wasmtime", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime/28.0.0/download", - "sha256": "f639ecae347b9a2227e453a7b7671e84370a0b61f47a15e0390fe9b7725e47b3" + "url": "https://static.crates.io/crates/wasmtime/29.0.1/download", + "sha256": "11976a250672556d1c4c04c6d5d7656ac9192ac9edc42a4587d6c21460010e69" } }, "targets": [ @@ -80197,10 +83755,6 @@ "id": "libc 0.2.158", "target": "libc" }, - { - "id": "libm 0.2.7", - "target": "libm" - }, { "id": "log 0.4.20", "target": "log" @@ -80234,7 +83788,7 @@ "target": "sptr" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" }, { @@ -80242,27 +83796,31 @@ "target": "wasmparser" }, { - "id": "wasmtime 28.0.0", + "id": "wasmtime 29.0.1", "target": "build_script_build" }, { - "id": "wasmtime-asm-macros 28.0.0", + "id": "wasmtime-asm-macros 29.0.1", "target": "wasmtime_asm_macros" }, { - "id": "wasmtime-cranelift 28.0.0", + "id": "wasmtime-cranelift 29.0.1", "target": "wasmtime_cranelift" }, { - "id": "wasmtime-environ 28.0.0", + "id": "wasmtime-environ 29.0.1", "target": "wasmtime_environ" }, { - "id": "wasmtime-jit-icache-coherence 28.0.0", + "id": "wasmtime-jit-icache-coherence 29.0.1", "target": "wasmtime_jit_icache_coherence" }, { - "id": "wasmtime-slab 28.0.0", + "id": "wasmtime-math 29.0.1", + "target": "wasmtime_math" + }, + { + "id": "wasmtime-slab 29.0.1", "target": "wasmtime_slab" } ], @@ -80495,13 +84053,13 @@ "target": "serde_derive" }, { - "id": "wasmtime-versioned-export-macros 28.0.0", + "id": "wasmtime-versioned-export-macros 29.0.1", "target": "wasmtime_versioned_export_macros" } ], "selects": {} }, - "version": "28.0.0" + "version": "29.0.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -80522,7 +84080,7 @@ "proc_macro_deps": { "common": [ { - "id": "wasmtime-versioned-export-macros 28.0.0", + "id": "wasmtime-versioned-export-macros 29.0.1", "target": "wasmtime_versioned_export_macros" } ], @@ -80535,14 +84093,14 @@ ], "license_file": "LICENSE" }, - "wasmtime-asm-macros 28.0.0": { + "wasmtime-asm-macros 29.0.1": { "name": "wasmtime-asm-macros", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-asm-macros/28.0.0/download", - "sha256": "882a18800471cfc063c8b3ccf75723784acc3fd534009ac09421f2fac2fcdcec" + "url": "https://static.crates.io/crates/wasmtime-asm-macros/29.0.1/download", + "sha256": "1f178b0d125201fbe9f75beaf849bd3e511891f9e45ba216a5b620802ccf64f2" } }, "targets": [ @@ -80574,7 +84132,7 @@ "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -80582,14 +84140,14 @@ ], "license_file": null }, - "wasmtime-component-macro 28.0.0": { + "wasmtime-component-macro 29.0.1": { "name": "wasmtime-component-macro", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-component-macro/28.0.0/download", - "sha256": "eb5c0a77c9e1927c3d471f53cc13767c3d3438e5d5ffd394e3eb31c86445fd60" + "url": "https://static.crates.io/crates/wasmtime-component-macro/29.0.1/download", + "sha256": "d74de6592ed945d0a602f71243982a304d5d02f1e501b638addf57f42d57dfaf" } }, "targets": [ @@ -80642,15 +84200,15 @@ "target": "syn" }, { - "id": "wasmtime-component-macro 28.0.0", + "id": "wasmtime-component-macro 29.0.1", "target": "build_script_build" }, { - "id": "wasmtime-component-util 28.0.0", + "id": "wasmtime-component-util 29.0.1", "target": "wasmtime_component_util" }, { - "id": "wasmtime-wit-bindgen 28.0.0", + "id": "wasmtime-wit-bindgen 29.0.1", "target": "wasmtime_wit_bindgen" }, { @@ -80661,7 +84219,7 @@ "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -80677,14 +84235,14 @@ ], "license_file": null }, - "wasmtime-component-util 28.0.0": { + "wasmtime-component-util 29.0.1": { "name": "wasmtime-component-util", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-component-util/28.0.0/download", - "sha256": "43702ca98bf5162eca0573db691ed9ecd36d716f8c6688410fe26ec16b6f9bcb" + "url": "https://static.crates.io/crates/wasmtime-component-util/29.0.1/download", + "sha256": "707dc7b3c112ab5a366b30cfe2fb5b2f8e6a0f682f16df96a5ec582bfe6f056e" } }, "targets": [ @@ -80707,7 +84265,7 @@ "**" ], "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -80715,14 +84273,14 @@ ], "license_file": null }, - "wasmtime-cranelift 28.0.0": { + "wasmtime-cranelift 29.0.1": { "name": "wasmtime-cranelift", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-cranelift/28.0.0/download", - "sha256": "20070aa5b75080a8932ec328419faf841df2bc6ceb16b55b0df2b952098392a2" + "url": "https://static.crates.io/crates/wasmtime-cranelift/29.0.1/download", + "sha256": "366be722674d4bf153290fbcbc4d7d16895cc82fb3e869f8d550ff768f9e9e87" } }, "targets": [ @@ -80762,23 +84320,23 @@ "target": "cfg_if" }, { - "id": "cranelift-codegen 0.115.0", + "id": "cranelift-codegen 0.116.1", "target": "cranelift_codegen" }, { - "id": "cranelift-control 0.115.0", + "id": "cranelift-control 0.116.1", "target": "cranelift_control" }, { - "id": "cranelift-entity 0.115.0", + "id": "cranelift-entity 0.116.1", "target": "cranelift_entity" }, { - "id": "cranelift-frontend 0.115.0", + "id": "cranelift-frontend 0.116.1", "target": "cranelift_frontend" }, { - "id": "cranelift-native 0.115.0", + "id": "cranelift-native 0.116.1", "target": "cranelift_native" }, { @@ -80802,7 +84360,7 @@ "target": "smallvec" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" }, { @@ -80814,7 +84372,7 @@ "target": "wasmparser" }, { - "id": "wasmtime-environ 28.0.0", + "id": "wasmtime-environ 29.0.1", "target": "wasmtime_environ" } ], @@ -80824,13 +84382,13 @@ "proc_macro_deps": { "common": [ { - "id": "wasmtime-versioned-export-macros 28.0.0", + "id": "wasmtime-versioned-export-macros 29.0.1", "target": "wasmtime_versioned_export_macros" } ], "selects": {} }, - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -80838,14 +84396,14 @@ ], "license_file": "LICENSE" }, - "wasmtime-environ 28.0.0": { + "wasmtime-environ 29.0.1": { "name": "wasmtime-environ", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-environ/28.0.0/download", - "sha256": "2604ddb24879d4dc1dedcb7081d7a8e017259bce916fdae097a97db52cbaab80" + "url": "https://static.crates.io/crates/wasmtime-environ/29.0.1/download", + "sha256": "cdadc1af7097347aa276a4f008929810f726b5b46946971c660b6d421e9994ad" } }, "targets": [ @@ -80883,11 +84441,11 @@ "target": "anyhow" }, { - "id": "cranelift-bitset 0.115.0", + "id": "cranelift-bitset 0.116.1", "target": "cranelift_bitset" }, { - "id": "cranelift-entity 0.115.0", + "id": "cranelift-entity 0.116.1", "target": "cranelift_entity" }, { @@ -80919,7 +84477,7 @@ "target": "smallvec" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" }, { @@ -80947,7 +84505,7 @@ ], "selects": {} }, - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -80955,14 +84513,14 @@ ], "license_file": "LICENSE" }, - "wasmtime-fiber 28.0.0": { + "wasmtime-fiber 29.0.1": { "name": "wasmtime-fiber", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-fiber/28.0.0/download", - "sha256": "98593412d2b167ebe2b59d4a17a184978a72f976b53b3a0ec05629451079ac1d" + "url": "https://static.crates.io/crates/wasmtime-fiber/29.0.1/download", + "sha256": "ccba90d4119f081bca91190485650730a617be1fff5228f8c4757ce133d21117" } }, "targets": [ @@ -81007,11 +84565,11 @@ "target": "cfg_if" }, { - "id": "wasmtime-asm-macros 28.0.0", + "id": "wasmtime-asm-macros 29.0.1", "target": "wasmtime_asm_macros" }, { - "id": "wasmtime-fiber 28.0.0", + "id": "wasmtime-fiber 29.0.1", "target": "build_script_build" } ], @@ -81034,13 +84592,13 @@ "proc_macro_deps": { "common": [ { - "id": "wasmtime-versioned-export-macros 28.0.0", + "id": "wasmtime-versioned-export-macros 29.0.1", "target": "wasmtime_versioned_export_macros" } ], "selects": {} }, - "version": "28.0.0" + "version": "29.0.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -81061,7 +84619,7 @@ "proc_macro_deps": { "common": [ { - "id": "wasmtime-versioned-export-macros 28.0.0", + "id": "wasmtime-versioned-export-macros 29.0.1", "target": "wasmtime_versioned_export_macros" } ], @@ -81074,14 +84632,14 @@ ], "license_file": "LICENSE" }, - "wasmtime-jit-icache-coherence 28.0.0": { + "wasmtime-jit-icache-coherence 29.0.1": { "name": "wasmtime-jit-icache-coherence", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-jit-icache-coherence/28.0.0/download", - "sha256": "d40d7722b9e1fbeae135715710a8a2570b1e6cf72b74dd653962d89831c6c70d" + "url": "https://static.crates.io/crates/wasmtime-jit-icache-coherence/29.0.1/download", + "sha256": "ec5e8552e01692e6c2e5293171704fed8abdec79d1a6995a0870ab190e5747d1" } }, "targets": [ @@ -81130,7 +84688,7 @@ } }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -81138,14 +84696,67 @@ ], "license_file": null }, - "wasmtime-slab 28.0.0": { + "wasmtime-math 29.0.1": { + "name": "wasmtime-math", + "version": "29.0.1", + "package_url": "https://github.com/bytecodealliance/wasmtime", + "repository": { + "Http": { + "url": "https://static.crates.io/crates/wasmtime-math/29.0.1/download", + "sha256": "29210ec2aa25e00f4d54605cedaf080f39ec01a872c5bd520ad04c67af1dde17" + } + }, + "targets": [ + { + "Library": { + "crate_name": "wasmtime_math", + "crate_root": "src/lib.rs", + "srcs": { + "allow_empty": true, + "include": [ + "**/*.rs" + ] + } + } + } + ], + "library_target_name": "wasmtime_math", + "common_attrs": { + "compile_data_glob": [ + "**" + ], + "crate_features": { + "common": [ + "std" + ], + "selects": {} + }, + "deps": { + "common": [ + { + "id": "libm 0.2.7", + "target": "libm" + } + ], + "selects": {} + }, + "edition": "2021", + "version": "29.0.1" + }, + "license": "Apache-2.0 WITH LLVM-exception", + "license_ids": [ + "Apache-2.0" + ], + "license_file": null + }, + "wasmtime-slab 29.0.1": { "name": "wasmtime-slab", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-slab/28.0.0/download", - "sha256": "8579c335220b4ece9aa490a0e8b46de78cd342b195ab21ff981d095e14b52383" + "url": "https://static.crates.io/crates/wasmtime-slab/29.0.1/download", + "sha256": "fcb5821a96fa04ac14bc7b158bb3d5cd7729a053db5a74dad396cd513a5e5ccf" } }, "targets": [ @@ -81168,7 +84779,7 @@ "**" ], "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -81176,14 +84787,14 @@ ], "license_file": null }, - "wasmtime-versioned-export-macros 28.0.0": { + "wasmtime-versioned-export-macros 29.0.1": { "name": "wasmtime-versioned-export-macros", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-versioned-export-macros/28.0.0/download", - "sha256": "d7de0a56fb0a69b185968f2d7a9ba54750920a806470dff7ad8de91ac06d277e" + "url": "https://static.crates.io/crates/wasmtime-versioned-export-macros/29.0.1/download", + "sha256": "86ff86db216dc0240462de40c8290887a613dddf9685508eb39479037ba97b5b" } }, "targets": [ @@ -81223,7 +84834,7 @@ "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -81231,14 +84842,14 @@ ], "license_file": null }, - "wasmtime-winch 28.0.0": { + "wasmtime-winch 29.0.1": { "name": "wasmtime-winch", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-winch/28.0.0/download", - "sha256": "abd309943c443f5590d12f9aba9ba63c481091c955a0a14de0c2a9e0e3aaeca9" + "url": "https://static.crates.io/crates/wasmtime-winch/29.0.1/download", + "sha256": "fdbabfb8f20502d5e1d81092b9ead3682ae59988487aafcd7567387b7a43cf8f" } }, "targets": [ @@ -81267,7 +84878,7 @@ "target": "anyhow" }, { - "id": "cranelift-codegen 0.115.0", + "id": "cranelift-codegen 0.116.1", "target": "cranelift_codegen" }, { @@ -81279,7 +84890,7 @@ "target": "object" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" }, { @@ -81287,22 +84898,22 @@ "target": "wasmparser" }, { - "id": "wasmtime-cranelift 28.0.0", + "id": "wasmtime-cranelift 29.0.1", "target": "wasmtime_cranelift" }, { - "id": "wasmtime-environ 28.0.0", + "id": "wasmtime-environ 29.0.1", "target": "wasmtime_environ" }, { - "id": "winch-codegen 28.0.0", + "id": "winch-codegen 29.0.1", "target": "winch_codegen" } ], "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -81310,14 +84921,14 @@ ], "license_file": "LICENSE" }, - "wasmtime-wit-bindgen 28.0.0": { + "wasmtime-wit-bindgen 29.0.1": { "name": "wasmtime-wit-bindgen", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/wasmtime-wit-bindgen/28.0.0/download", - "sha256": "969f83022dac3435d6469edb582ceed04cfe32aa44dc3ef16e5cb55574633df8" + "url": "https://static.crates.io/crates/wasmtime-wit-bindgen/29.0.1/download", + "sha256": "8358319c2dd1e4db79e3c1c5d3a5af84956615343f9f89f4e4996a36816e06e6" } }, "targets": [ @@ -81361,7 +84972,7 @@ "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "license": "Apache-2.0 WITH LLVM-exception", "license_ids": [ @@ -82324,14 +85935,14 @@ ], "license_file": null }, - "winch-codegen 28.0.0": { + "winch-codegen 29.0.1": { "name": "winch-codegen", - "version": "28.0.0", + "version": "29.0.1", "package_url": "https://github.com/bytecodealliance/wasmtime", "repository": { "Http": { - "url": "https://static.crates.io/crates/winch-codegen/28.0.0/download", - "sha256": "9110decc2983ed94de904804dcd979ba59cbabc78a94fec6b1d8468ec513d0f6" + "url": "https://static.crates.io/crates/winch-codegen/29.0.1/download", + "sha256": "2f849ef2c5f46cb0a20af4b4487aaa239846e52e2c03f13fa3c784684552859c" } }, "targets": [ @@ -82372,7 +85983,7 @@ "target": "anyhow" }, { - "id": "cranelift-codegen 0.115.0", + "id": "cranelift-codegen 0.116.1", "target": "cranelift_codegen" }, { @@ -82388,30 +85999,34 @@ "target": "smallvec" }, { - "id": "target-lexicon 0.12.16", + "id": "target-lexicon 0.13.1", "target": "target_lexicon" }, + { + "id": "thiserror 1.0.68", + "target": "thiserror" + }, { "id": "wasmparser 0.221.2", "target": "wasmparser" }, { - "id": "wasmtime-cranelift 28.0.0", + "id": "wasmtime-cranelift 29.0.1", "target": "wasmtime_cranelift" }, { - "id": "wasmtime-environ 28.0.0", + "id": "wasmtime-environ 29.0.1", "target": "wasmtime_environ" }, { - "id": "winch-codegen 28.0.0", + "id": "winch-codegen 29.0.1", "target": "build_script_build" } ], "selects": {} }, "edition": "2021", - "version": "28.0.0" + "version": "29.0.1" }, "build_script_attrs": { "compile_data_glob": [ @@ -82913,6 +86528,7 @@ "Win32_Networking", "Win32_Networking_WinSock", "Win32_Security", + "Win32_Security_Credentials", "Win32_Storage", "Win32_Storage_FileSystem", "Win32_System", @@ -86625,7 +90241,7 @@ } }, "binary_crates": [ - "canbench 0.1.8", + "canbench 0.1.9", "ic-wasm 0.8.4", "metrics-proxy 0.1.0" ], @@ -87619,7 +91235,7 @@ "addr 0.15.6", "aide 0.13.4", "anyhow 1.0.93", - "arbitrary 1.3.2", + "arbitrary 1.4.1", "arc-swap 1.7.1", "arrayvec 0.7.4", "askama 0.12.1", @@ -87655,8 +91271,8 @@ "byteorder 1.5.0", "bytes 1.9.0", "cached 0.49.2", - "canbench 0.1.8", - "canbench-rs 0.1.8", + "canbench 0.1.9", + "canbench-rs 0.1.9", "candid 0.10.13", "candid_parser 0.1.2", "cargo_metadata 0.14.2", @@ -87682,6 +91298,7 @@ "curve25519-dalek 4.1.3", "cvt 0.1.2", "dashmap 5.5.0", + "dfx-core 0.1.3", "dyn-clone 1.0.14", "ed25519-dalek 2.1.1", "educe 0.4.22", @@ -87690,7 +91307,7 @@ "escargot 0.5.7", "ethers-core 2.0.8", "ethnum 1.3.2", - "evm_rpc_types 1.2.0", + "evm_rpc_types 1.3.0", "exec 0.3.1", "eyre 0.6.8", "ff 0.12.1", @@ -87723,9 +91340,9 @@ "ic-canister-log 0.2.0", "ic-canister-sig-creation 1.1.0", "ic-cbor 3.0.2", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-cdk 0.18.0-alpha.1", - "ic-cdk-macros 0.9.0", + "ic-cdk-macros 0.17.1", "ic-cdk-macros 0.18.0-alpha.1", "ic-cdk-timers 0.11.0", "ic-certificate-verification 3.0.2", @@ -87733,6 +91350,7 @@ "ic-certified-map 0.3.4", "ic-http-certification 3.0.2", "ic-http-gateway 0.1.0", + "ic-management-canister-types 0.1.0", "ic-metrics-encoder 1.1.1", "ic-response-verification 3.0.2", "ic-sha3 1.0.0", @@ -87763,7 +91381,7 @@ "json5 0.4.1", "k256 0.13.4", "k8s-openapi 0.22.0", - "kube 0.93.1", + "kube 0.94.2", "lazy_static 1.4.0", "leb128 0.2.5", "libc 0.2.158", @@ -87779,6 +91397,7 @@ "mach2 0.4.2", "maplit 1.0.2", "maxminddb 0.24.0", + "memmap2 0.9.5", "metrics-proxy 0.1.0", "minicbor 0.19.1", "minicbor-derive 0.13.0", @@ -87857,7 +91476,7 @@ "rustls-pemfile 2.2.0", "rustversion 1.0.14", "rusty-fork 0.3.0", - "schemars 0.8.16", + "schemars 0.8.21", "scoped_threadpool 0.1.9", "scopeguard 1.2.0", "scraper 0.17.1", @@ -87898,7 +91517,7 @@ "test-strategy 0.3.1", "tester 0.7.0", "textplots 0.8.4", - "thiserror 2.0.3", + "thiserror 2.0.11", "thousands 0.2.0", "threadpool 1.8.1", "tikv-jemalloc-ctl 0.5.4", @@ -87940,8 +91559,8 @@ "wasm-smith 0.212.0", "wasmparser 0.217.0", "wasmprinter 0.217.0", - "wasmtime 28.0.0", - "wasmtime-environ 28.0.0", + "wasmtime 29.0.1", + "wasmtime-environ 29.0.1", "wast 212.0.0", "wat 1.212.0", "wee_alloc 0.4.5", @@ -87955,11 +91574,5 @@ "zstd 0.13.2" ], "direct_dev_deps": [], - "unused_patches": [ - { - "name": "jsonrpc", - "version": "0.12.1", - "source": "git+https://github.com/apoelstra/rust-jsonrpc?rev=e42044d#e42044d8e0896317488dfbd65eb5563d76e937fe" - } - ] + "unused_patches": [] } diff --git a/Cargo.Bazel.toml.lock b/Cargo.Bazel.toml.lock index ccf252a795a..a22fb45d7f4 100644 --- a/Cargo.Bazel.toml.lock +++ b/Cargo.Bazel.toml.lock @@ -258,6 +258,31 @@ dependencies = [ "generic-array", ] +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if 1.0.0", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + [[package]] name = "ahash" version = "0.7.8" @@ -420,9 +445,9 @@ checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] @@ -433,6 +458,17 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[package]] +name = "argon2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db4ce4441f99dbd377ca8a8f57b698c44d0d6e712d8329b5040da5a64aa1ce73" +dependencies = [ + "base64ct", + "blake2", + "password-hash", +] + [[package]] name = "arrayvec" version = "0.5.2" @@ -985,6 +1021,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + [[package]] name = "base16ct" version = "0.2.0" @@ -1146,17 +1188,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bip32" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" +dependencies = [ + "bs58 0.4.0", + "hmac", + "k256 0.11.6", + "once_cell", + "pbkdf2 0.11.0", + "rand_core 0.6.4", + "ripemd", + "sha2 0.10.8", + "subtle", + "zeroize", +] + [[package]] name = "bip32" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e141fb0f8be1c7b45887af94c88b182472b57c96b56773250ae00cd6a14a164" dependencies = [ - "bs58", + "bs58 0.5.0", "hmac", - "k256", + "k256 0.13.4", "once_cell", - "pbkdf2", + "pbkdf2 0.12.2", "rand_core 0.6.4", "ripemd", "sha2 0.10.8", @@ -1219,7 +1279,7 @@ dependencies = [ "bitcoin_hashes 0.14.0", "hex-conservative", "hex_lit", - "secp256k1 0.29.1", + "secp256k1 0.29.0", "serde", ] @@ -1345,6 +1405,15 @@ dependencies = [ "wyz", ] +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + [[package]] name = "block-buffer" version = "0.9.0" @@ -1452,6 +1521,15 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +dependencies = [ + "sha2 0.9.9", +] + [[package]] name = "bs58" version = "0.5.0" @@ -1707,9 +1785,9 @@ dependencies = [ [[package]] name = "canbench" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb548f9e006ad29b160d37e07435c499af7d2741918e18d95ddc87dfe97a0b8d" +checksum = "c3eba78c84aa78e67f27c5c5a7d6c3d33cc301f95886171748e8f6ed8a31b258" dependencies = [ "canbench-rs", "candid", @@ -1729,9 +1807,9 @@ dependencies = [ [[package]] name = "canbench-rs" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497d900e11ab1891dd9743dd45dbeaada540ce323aa1adc7fc0ce1da2c6e86ff" +checksum = "588701e2d05679b79603acca6a6f8b78fe0d21f5f7a9c06fe689f769ae797008" dependencies = [ "canbench-rs-macros", "candid", @@ -1741,9 +1819,9 @@ dependencies = [ [[package]] name = "canbench-rs-macros" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5509bcfe6eeb86f057d46fbf20a2ba6b6bf9a1099b053a8f491cd7a909dfa6" +checksum = "e05fe21a7dfc85c3be8e40edbbcb3fe23b4c070fac4741eff18129f1d0f11aa9" dependencies = [ "proc-macro2", "quote", @@ -2000,7 +2078,7 @@ checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" dependencies = [ "glob", "libc", - "libloading", + "libloading 0.7.4", ] [[package]] @@ -2105,7 +2183,7 @@ dependencies = [ [[package]] name = "cloudflare" version = "0.12.0" -source = "git+https://github.com/dfinity/cloudflare-rs.git?rev=a6538a036926bd756986c9c0a5de356daef48881#a6538a036926bd756986c9c0a5de356daef48881" +source = "git+https://github.com/dfinity/cloudflare-rs.git?rev=8b011d170d9d61eaad77bb9645371f6219285104#8b011d170d9d61eaad77bb9645371f6219285104" dependencies = [ "chrono", "http 0.2.12", @@ -2308,6 +2386,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -2360,18 +2448,18 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac89549be94911dd0e839b4a7db99e9ed29c17517e1c026f61066884c168aa3c" +checksum = "e15d04a0ce86cb36ead88ad68cf693ffd6cda47052b9e0ac114bc47fd9cd23c4" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-bitset" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9bd49369f76c77e34e641af85d0956869237832c118964d08bf5f51f210875a" +checksum = "7c6e3969a7ce267259ce244b7867c5d3bc9e65b0a87e81039588dfdeaede9f34" dependencies = [ "serde", "serde_derive", @@ -2379,9 +2467,9 @@ dependencies = [ [[package]] name = "cranelift-codegen" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd96ce9cf8efebd7f5ab8ced5a0ce44250280bbae9f593d74a6d7effc3582a35" +checksum = "2c22032c4cb42558371cf516bb47f26cdad1819d3475c133e93c49f50ebf304e" dependencies = [ "bumpalo", "cranelift-bforest", @@ -2403,33 +2491,33 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a68e358827afe4bfb6239fcbf6fbd5ac56206ece8a99c8f5f9bbd518773281a" +checksum = "c904bc71c61b27fc57827f4a1379f29de64fe95653b620a3db77d59655eee0b8" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e184c9767afbe73d50c55ec29abcf4c32f9baf0d9d22b86d58c4d55e06dee181" +checksum = "40180f5497572f644ce88c255480981ae2ec1d7bb4d8e0c0136a13b87a2f2ceb" [[package]] name = "cranelift-control" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc7664f2a66f053e33f149e952bb5971d138e3af637f5097727ed6dc0ed95dd" +checksum = "26d132c6d0bd8a489563472afc171759da0707804a65ece7ceb15a8c6d7dd5ef" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "118597e3a9cf86c3556fa579a7a23b955fa18231651a52a77a2475d305a9cf84" +checksum = "4b2d0d9618275474fbf679dd018ac6e009acbd6ae6850f6a67be33fb3b00b323" dependencies = [ "cranelift-bitset", "serde", @@ -2438,9 +2526,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7638ea1efb069a0aa18d8ee67401b6b0d19f6bfe5de5e9ede348bfc80bb0d8c7" +checksum = "4fac41e16729107393174b0c9e3730fb072866100e1e64e80a1a963b2e484d57" dependencies = [ "cranelift-codegen", "log", @@ -2450,15 +2538,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15c53e1152a0b01c4ed2b1e0535602b8e86458777dd9d18b28732b16325c7dc0" +checksum = "1ca20d576e5070044d0a72a9effc2deacf4d6aa650403189d8ea50126483944d" [[package]] name = "cranelift-native" -version = "0.115.0" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b7d8f895444fa52dd7bdd0bed11bf007a7fb43af65a6deac8fcc4094c6372f7" +checksum = "b8dee82f3f1f2c4cba9177f1cc5e350fe98764379bcd29340caa7b01f85076c7" dependencies = [ "cranelift-codegen", "libc", @@ -2599,6 +2687,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-bigint" version = "0.5.2" @@ -2666,6 +2766,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + [[package]] name = "ctrlc" version = "3.4.5" @@ -2687,7 +2796,7 @@ dependencies = [ "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", - "group", + "group 0.13.0", "rand_core 0.6.4", "rustc_version", "subtle", @@ -2836,6 +2945,31 @@ version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +[[package]] +name = "dbus" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" +dependencies = [ + "libc", + "libdbus-sys", + "winapi 0.3.9", +] + +[[package]] +name = "dbus-secret-service" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42a16374481d92aed73ae45b1f120207d8e71d24fb89f357fadbd8f946fd84b" +dependencies = [ + "dbus", + "futures-util", + "num", + "once_cell", + "openssl", + "rand 0.8.5", +] + [[package]] name = "debugid" version = "0.8.0" @@ -2845,6 +2979,17 @@ dependencies = [ "uuid", ] +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "pem-rfc7468 0.6.0", + "zeroize", +] + [[package]] name = "der" version = "0.7.7" @@ -2854,7 +2999,7 @@ dependencies = [ "const-oid", "der_derive", "flagset", - "pem-rfc7468", + "pem-rfc7468 0.7.0", "zeroize", ] @@ -2906,9 +3051,9 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", @@ -2928,6 +3073,64 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "dfx-core" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4be4fc6929580b0ef8ac3678c03f31b59ffb1aa0d90ab754842d40cfc5b4552" +dependencies = [ + "aes-gcm", + "argon2", + "backoff", + "bip32 0.4.0", + "byte-unit", + "bytes", + "candid", + "clap 4.5.20", + "dialoguer", + "directories-next", + "dunce", + "flate2", + "handlebars", + "hex", + "humantime-serde", + "ic-agent", + "ic-identity-hsm", + "ic-utils", + "itertools 0.10.5", + "k256 0.11.6", + "keyring", + "lazy_static", + "reqwest 0.12.9", + "ring 0.16.20", + "schemars", + "sec1 0.3.0", + "semver", + "serde", + "serde_json", + "sha2 0.10.8", + "slog", + "tar", + "tempfile", + "thiserror 1.0.68", + "time", + "tiny-bip39", + "url", +] + +[[package]] +name = "dialoguer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console 0.15.7", + "shell-words", + "tempfile", + "thiserror 1.0.68", + "zeroize", +] + [[package]] name = "diff" version = "0.1.13" @@ -2991,14 +3194,14 @@ dependencies = [ "bech32 0.9.1", "bincode", "bindgen 0.65.1", - "bip32", + "bip32 0.5.1", "bit-vec", "bitcoin 0.28.2", "bitcoin 0.32.5", "bitcoincore-rpc", "bitcoind", "bitflags 1.3.2", - "bs58", + "bs58 0.5.0", "build-info", "build-info-build", "by_address", @@ -3019,7 +3222,7 @@ dependencies = [ "ciborium", "cidr", "clap 4.5.20", - "cloudflare 0.12.0 (git+https://github.com/dfinity/cloudflare-rs.git?rev=a6538a036926bd756986c9c0a5de356daef48881)", + "cloudflare 0.12.0 (git+https://github.com/dfinity/cloudflare-rs.git?rev=8b011d170d9d61eaad77bb9645371f6219285104)", "colored", "comparable", "console 0.11.3", @@ -3033,6 +3236,7 @@ dependencies = [ "curve25519-dalek", "cvt", "dashmap 5.5.0", + "dfx-core", "dyn-clone", "ed25519-dalek", "educe", @@ -3053,7 +3257,7 @@ dependencies = [ "futures-util", "get_if_addrs", "getrandom", - "group", + "group 0.13.0", "hashlink", "hex", "hex-literal", @@ -3074,16 +3278,17 @@ dependencies = [ "ic-canister-log", "ic-canister-sig-creation", "ic-cbor", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-cdk 0.18.0-alpha.1", + "ic-cdk-macros 0.17.1", "ic-cdk-macros 0.18.0-alpha.1", - "ic-cdk-macros 0.9.0", "ic-cdk-timers", "ic-certificate-verification", "ic-certification 3.0.2", "ic-certified-map", "ic-http-certification", "ic-http-gateway", + "ic-management-canister-types", "ic-metrics-encoder", "ic-response-verification", "ic-sha3", @@ -3112,7 +3317,7 @@ dependencies = [ "itertools 0.12.0", "json-patch", "json5", - "k256", + "k256 0.13.4", "k8s-openapi", "kube", "lazy_static", @@ -3130,6 +3335,7 @@ dependencies = [ "mach2", "maplit", "maxminddb", + "memmap2 0.9.5", "metrics-proxy", "minicbor", "minicbor-derive", @@ -3141,7 +3347,7 @@ dependencies = [ "nix 0.24.3", "num-bigint 0.4.6", "num-bigint-dig", - "num-rational", + "num-rational 0.2.4", "num-traits", "num_cpus", "once_cell", @@ -3159,7 +3365,7 @@ dependencies = [ "pem 1.1.1", "pin-project-lite", "ping", - "pkcs8", + "pkcs8 0.10.2", "pkg-config", "pprof", "predicates", @@ -3225,7 +3431,7 @@ dependencies = [ "sha2 0.10.8", "sha3", "signal-hook", - "signature", + "signature 2.2.0", "simple_asn1", "simple_moving_average", "slog", @@ -3249,7 +3455,7 @@ dependencies = [ "test-strategy", "tester", "textplots", - "thiserror 2.0.3", + "thiserror 2.0.11", "thousands", "threadpool", "tikv-jemalloc-ctl", @@ -3306,6 +3512,16 @@ dependencies = [ "zstd 0.13.2", ] +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + [[package]] name = "dirs" version = "2.0.2" @@ -3396,6 +3612,12 @@ dependencies = [ "dtoa", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "duration-string" version = "0.3.0" @@ -3411,18 +3633,30 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] + [[package]] name = "ecdsa" version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der", + "der 0.7.7", "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "signature 2.2.0", + "spki 0.7.3", ] [[package]] @@ -3431,8 +3665,8 @@ version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "pkcs8", - "signature", + "pkcs8 0.10.2", + "signature 2.2.0", ] [[package]] @@ -3462,7 +3696,7 @@ dependencies = [ "rand_core 0.6.4", "serde", "sha2 0.10.8", - "signature", + "signature 2.2.0", "subtle", "zeroize", ] @@ -3491,22 +3725,43 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.7", + "ff 0.12.1", + "generic-array", + "group 0.12.1", + "pem-rfc7468 0.6.0", + "pkcs8 0.9.0", + "rand_core 0.6.4", + "sec1 0.3.0", + "subtle", + "zeroize", +] + [[package]] name = "elliptic-curve" version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "base16ct", - "crypto-bigint", + "base16ct 0.2.0", + "crypto-bigint 0.5.2", "digest 0.10.7", "ff 0.13.0", "generic-array", - "group", - "pem-rfc7468", - "pkcs8", + "group 0.13.0", + "pem-rfc7468 0.7.0", + "pkcs8 0.10.2", "rand_core 0.6.4", - "sec1", + "sec1 0.7.3", "subtle", "zeroize", ] @@ -3753,11 +4008,11 @@ dependencies = [ "arrayvec 0.7.4", "bytes", "chrono", - "elliptic-curve", + "elliptic-curve 0.13.8", "ethabi", "generic-array", "hex", - "k256", + "k256 0.13.4", "num_enum", "open-fastrlp", "rand 0.8.5", @@ -3830,17 +4085,17 @@ dependencies = [ [[package]] name = "evm_rpc_types" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ed9ee7b89726f4a343208e9a89e9ad22fe7b4518b0d722973cc83274e7bf7f" +checksum = "fa134314bce7c35b9214710572fb7305edc7f4223c5bd03b5857ed08bbb05897" dependencies = [ "candid", "hex", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "num-bigint 0.4.6", "serde", "strum 0.26.3", - "thiserror 1.0.68", + "thiserror 2.0.11", "url", ] @@ -4008,6 +4263,21 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -4262,6 +4532,16 @@ dependencies = [ "wasi", ] +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + [[package]] name = "gimli" version = "0.26.2" @@ -4314,6 +4594,17 @@ dependencies = [ "smallvec", ] +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "group" version = "0.13.0" @@ -4369,6 +4660,20 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +[[package]] +name = "handlebars" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225" +dependencies = [ + "log", + "pest", + "pest_derive", + "serde", + "serde_json", + "thiserror 1.0.68", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -4931,10 +5236,10 @@ dependencies = [ "backoff", "cached 0.52.0", "candid", - "der", - "ecdsa", + "der 0.7.7", + "ecdsa 0.16.9", "ed25519-consensus", - "elliptic-curve", + "elliptic-curve 0.13.8", "futures-util", "hex", "http 1.2.0", @@ -4942,16 +5247,16 @@ dependencies = [ "ic-certification 3.0.2", "ic-transport-types 0.39.2", "ic-verify-bls-signature 0.5.0", - "k256", + "k256 0.13.4", "leb128", "p256", "pem 3.0.3", - "pkcs8", + "pkcs8 0.10.2", "rand 0.8.5", "rangemap", "reqwest 0.12.9", "ring 0.17.7", - "sec1", + "sec1 0.7.3", "serde", "serde_bytes", "serde_cbor", @@ -4959,7 +5264,7 @@ dependencies = [ "sha2 0.10.8", "simple_asn1", "stop-token", - "thiserror 2.0.3", + "thiserror 2.0.11", "time", "tokio", "tower-service", @@ -5015,7 +5320,7 @@ dependencies = [ "strum 0.26.3", "strum_macros 0.26.4", "systemstat", - "thiserror 2.0.3", + "thiserror 2.0.11", "tokio", "tokio-io-timeout", "tokio-rustls 0.26.0", @@ -5058,7 +5363,7 @@ source = "git+https://github.com/dfinity/ic-canister-sig-creation?rev=7f9e931954 dependencies = [ "candid", "hex", - "ic-cdk 0.17.0", + "ic-cdk 0.17.1", "ic-certification 3.0.2", "ic-representation-independent-hash", "lazy_static", @@ -5066,7 +5371,7 @@ dependencies = [ "serde_bytes", "serde_cbor", "sha2 0.10.8", - "thiserror 2.0.3", + "thiserror 2.0.11", ] [[package]] @@ -5097,25 +5402,12 @@ dependencies = [ [[package]] name = "ic-cdk" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8ecacd682fa05a985253592963306cb9799622d7b1cce4b1edb89c6ec85be1" -dependencies = [ - "candid", - "ic-cdk-macros 0.16.0", - "ic0 0.23.0", - "serde", - "serde_bytes", -] - -[[package]] -name = "ic-cdk" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2abdf9341da9f9f6b451a40609cb69645a05a8e9eb7784c16209f16f2c0f76f" +checksum = "122efbcb0af5280d408a75a57b7dc6e9d92893bf6ed9cc98fe4dcff51f18b67c" dependencies = [ "candid", - "ic-cdk-macros 0.17.0", + "ic-cdk-macros 0.17.1", "ic0 0.23.0", "serde", "serde_bytes", @@ -5131,7 +5423,7 @@ dependencies = [ "ic0 0.24.0-alpha.1", "serde", "serde_bytes", - "thiserror 2.0.3", + "thiserror 2.0.11", ] [[package]] @@ -5150,37 +5442,9 @@ dependencies = [ [[package]] name = "ic-cdk-macros" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fde5ca6ef1e69825c68916ff1bf7256b8f7ed69ac5ea3f1756f6e57f1503e27" -dependencies = [ - "candid", - "proc-macro2", - "quote", - "serde", - "serde_tokenstream 0.1.7", - "syn 1.0.109", -] - -[[package]] -name = "ic-cdk-macros" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4d857135deef20cc7ea8f3869a30cd9cfeb1392b3a81043790b2cd82adc3e0" -dependencies = [ - "candid", - "proc-macro2", - "quote", - "serde", - "serde_tokenstream 0.2.1", - "syn 2.0.87", -] - -[[package]] -name = "ic-cdk-macros" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8df41980e95dead28735ab0f748c75477b0c5eab37a09a5641c78ec406a1db0" +checksum = "c792bf0d1621c893ccf2bcdeac4ee70121103a03030a1827031a6b3c60488944" dependencies = [ "candid", "proc-macro2", @@ -5210,7 +5474,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb8fd812a9e26f6aa00594546f8fbf4d4853f39c3ba794c8ff11ecf86fd3c9e4" dependencies = [ "futures", - "ic-cdk 0.17.0", + "ic-cdk 0.17.1", "ic0 0.23.0", "serde", "serde_bytes", @@ -5307,6 +5571,31 @@ dependencies = [ "thiserror 1.0.68", ] +[[package]] +name = "ic-identity-hsm" +version = "0.39.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e294ee038eb647cd9cce78b5961533be7f883494e6ea1faece52459bce2d29e9" +dependencies = [ + "hex", + "ic-agent", + "pkcs11", + "sha2 0.10.8", + "simple_asn1", + "thiserror 2.0.11", +] + +[[package]] +name = "ic-management-canister-types" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadff40906491c8c61a3c886cce4ee02f48a4798684d8a10e4a14891a217a284" +dependencies = [ + "candid", + "serde", + "serde_bytes", +] + [[package]] name = "ic-metrics-encoder" version = "1.1.1" @@ -5409,7 +5698,7 @@ dependencies = [ "serde_cbor", "serde_repr", "sha2 0.10.8", - "thiserror 2.0.3", + "thiserror 2.0.11", ] [[package]] @@ -5519,7 +5808,7 @@ checksum = "22c65787944f32af084dffd0c68c1e544237b76e215654ddea8cd9f527dd8b69" dependencies = [ "digest 0.10.7", "ff 0.13.0", - "group", + "group 0.13.0", "pairing", "rand_core 0.6.4", "subtle", @@ -6126,6 +6415,19 @@ dependencies = [ "serde_json", ] +[[package]] +name = "k256" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +dependencies = [ + "cfg-if 1.0.0", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.8", + "sha3", +] + [[package]] name = "k256" version = "0.13.4" @@ -6133,11 +6435,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if 1.0.0", - "ecdsa", - "elliptic-curve", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", "once_cell", "sha2 0.10.8", - "signature", + "signature 2.2.0", ] [[package]] @@ -6148,6 +6450,7 @@ checksum = "19501afb943ae5806548bc3ebd7f3374153ca057a38f480ef30adfde5ef09755" dependencies = [ "base64 0.22.1", "chrono", + "schemars", "serde", "serde-value", "serde_json", @@ -6162,22 +6465,37 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "keyring" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd3d701d3de5b9c4b0d9d077f8c2c66f0388d75e96932ebbb7cdff8713d7f7c6" +dependencies = [ + "byteorder", + "dbus-secret-service", + "linux-keyutils", + "openssl", + "security-framework 3.0.1", + "windows-sys 0.59.0", +] + [[package]] name = "kube" -version = "0.93.1" +version = "0.94.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0365920075af1a2d23619c1ca801c492f2400157de42627f041a061716e76416" +checksum = "52ace78a62b361077505f2950bd48aa3e46596fb15350c9c993de15ddfa3cac5" dependencies = [ "k8s-openapi", "kube-client", "kube-core", + "kube-derive", ] [[package]] name = "kube-client" -version = "0.93.1" +version = "0.94.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d81336eb3a5b10a40c97a5a97ad66622e92bad942ce05ee789edd730aa4f8603" +checksum = "18ec0fcafd3add30b413b096a61d69b0a37f94d3f95b6f505a57ea3d27cec2a7" dependencies = [ "base64 0.22.1", "bytes", @@ -6213,19 +6531,34 @@ dependencies = [ [[package]] name = "kube-core" -version = "0.93.1" +version = "0.94.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cce373a74d787d439063cdefab0f3672860bd7bac01a38e39019177e764a0fe6" +checksum = "a50c095f051dada37740d883b6d47ad0430e95082140718073b773c8a70f231c" dependencies = [ "chrono", "form_urlencoded", "http 1.2.0", "k8s-openapi", + "schemars", "serde", + "serde-value", "serde_json", "thiserror 1.0.68", ] +[[package]] +name = "kube-derive" +version = "0.94.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7871f02c3c848b63fee3d2f2645bb4a3c0b68ee147badcddf1b0cf8fb5db87ad" +dependencies = [ + "darling 0.20.10", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.87", +] + [[package]] name = "lalrpop" version = "0.19.12" @@ -6386,6 +6719,16 @@ version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +[[package]] +name = "libdbus-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" +dependencies = [ + "cc", + "pkg-config", +] + [[package]] name = "libflate" version = "2.1.0" @@ -6421,6 +6764,16 @@ dependencies = [ "once_cell", ] +[[package]] +name = "libloading" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" +dependencies = [ + "cc", + "winapi 0.3.9", +] + [[package]] name = "libloading" version = "0.7.4" @@ -6517,6 +6870,16 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-keyutils" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761e49ec5fd8a5a463f9b84e877c373d888935b71c6be78f3767fe2ae6bed18e" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + [[package]] name = "linux-raw-sys" version = "0.4.13" @@ -6802,6 +7165,15 @@ dependencies = [ "libc", ] +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.6.5" @@ -6931,9 +7303,9 @@ dependencies = [ [[package]] name = "minreq" -version = "2.13.0" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36a8e50e917e18a37d500d27d40b7bc7d127e71c0c94fb2d83f43b4afd308390" +checksum = "da0c420feb01b9fb5061f8c8f452534361dd783756dcf38ec45191ce55e7a161" dependencies = [ "log", "serde", @@ -7222,6 +7594,20 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint 0.4.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational 0.4.2", + "num-traits", +] + [[package]] name = "num-bigint" version = "0.2.6" @@ -7262,6 +7648,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -7310,6 +7705,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint 0.4.6", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -7452,20 +7858,56 @@ dependencies = [ "thiserror 1.0.68", ] +[[package]] +name = "openssl" +version = "0.10.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" +dependencies = [ + "bitflags 2.6.0", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "openssl-probe" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "openssl-src" +version = "300.4.1+3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] @@ -7743,8 +8185,8 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ - "ecdsa", - "elliptic-curve", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", "primeorder", "sha2 0.10.8", ] @@ -7755,7 +8197,7 @@ version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" dependencies = [ - "group", + "group 0.13.0", ] [[package]] @@ -7844,12 +8286,32 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "487f2ccd1e17ce8c1bfab3a65c89525af41cfad4c8659021a1e9a2aacd73b89b" +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + [[package]] name = "pbkdf2" version = "0.12.2" @@ -7907,6 +8369,15 @@ dependencies = [ "serde", ] +[[package]] +name = "pem-rfc7468" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" +dependencies = [ + "base64ct", +] + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -8132,9 +8603,29 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" dependencies = [ - "der", - "pkcs8", - "spki", + "der 0.7.7", + "pkcs8 0.10.2", + "spki 0.7.3", +] + +[[package]] +name = "pkcs11" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aca6d67e4c8613bfe455599d0233d00735f85df2001f6bfd9bb7ac0496b10af" +dependencies = [ + "libloading 0.5.2", + "num-bigint 0.2.6", +] + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der 0.6.1", + "spki 0.6.0", ] [[package]] @@ -8143,8 +8634,8 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der", - "spki", + "der 0.7.7", + "spki 0.7.3", ] [[package]] @@ -8236,6 +8727,18 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "portable-atomic" version = "1.4.1" @@ -8387,7 +8890,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c2fcef82c0ec6eefcc179b978446c399b3cdf73c392c35604e399eee6df1ee3" dependencies = [ - "elliptic-curve", + "elliptic-curve 0.13.8", ] [[package]] @@ -8730,13 +9233,14 @@ dependencies = [ [[package]] name = "pulley-interpreter" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403a1a95f4c18a45c86c7bff13df00347afd0abcbf2e54af273c837339ffcf77" +checksum = "62d95f8575df49a2708398182f49a888cf9dc30210fb1fd2df87c889edcee75d" dependencies = [ "cranelift-bitset", "log", "sptr", + "wasmtime-math", ] [[package]] @@ -9333,6 +9837,17 @@ dependencies = [ "quick-error", ] +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac", + "zeroize", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -9477,11 +9992,11 @@ dependencies = [ "num-integer", "num-traits", "pkcs1", - "pkcs8", + "pkcs8 0.10.2", "rand_core 0.6.4", "sha2 0.10.8", - "signature", - "spki", + "signature 2.2.0", + "spki 0.7.3", "subtle", "zeroize", ] @@ -9684,7 +10199,7 @@ dependencies = [ "ring 0.17.7", "serde", "serde_json", - "thiserror 2.0.3", + "thiserror 2.0.11", "webpki-roots 0.26.1", "x509-parser", ] @@ -9698,7 +10213,7 @@ dependencies = [ "openssl-probe", "rustls-pemfile 1.0.3", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] @@ -9711,7 +10226,7 @@ dependencies = [ "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] @@ -9724,7 +10239,7 @@ dependencies = [ "rustls-pemfile 2.2.0", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] @@ -9757,7 +10272,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4c7dc240fec5517e6c4eab3310438636cfe6391dfc345ba013109909a90d136" dependencies = [ - "core-foundation", + "core-foundation 0.9.4", "core-foundation-sys", "jni", "log", @@ -9766,7 +10281,7 @@ dependencies = [ "rustls-native-certs 0.7.0", "rustls-platform-verifier-android", "rustls-webpki 0.102.8", - "security-framework", + "security-framework 2.11.1", "security-framework-sys", "webpki-root-certs", "windows-sys 0.52.0", @@ -9867,9 +10382,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.16" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" +checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" dependencies = [ "dyn-clone", "indexmap 2.2.6", @@ -9880,14 +10395,14 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.16" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" +checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 1.0.109", + "syn 2.0.87", ] [[package]] @@ -9941,16 +10456,30 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct 0.1.1", + "der 0.6.1", + "generic-array", + "pkcs8 0.9.0", + "subtle", + "zeroize", +] + [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct", - "der", + "base16ct 0.2.0", + "der 0.7.7", "generic-array", - "pkcs8", + "pkcs8 0.10.2", "subtle", "zeroize", ] @@ -9980,9 +10509,9 @@ dependencies = [ [[package]] name = "secp256k1" -version = "0.29.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" +checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" dependencies = [ "bitcoin_hashes 0.14.0", "rand 0.8.5", @@ -10034,13 +10563,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", - "core-foundation", + "core-foundation 0.9.4", "core-foundation-sys", "libc", "num-bigint 0.4.6", "security-framework-sys", ] +[[package]] +name = "security-framework" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + [[package]] name = "security-framework-sys" version = "2.12.0" @@ -10152,13 +10694,13 @@ dependencies = [ [[package]] name = "serde_derive_internals" -version = "0.26.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.87", ] [[package]] @@ -10403,6 +10945,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + [[package]] name = "shlex" version = "1.3.0" @@ -10439,6 +10987,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + [[package]] name = "signature" version = "2.2.0" @@ -10675,6 +11233,16 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + [[package]] name = "spki" version = "0.7.3" @@ -10682,7 +11250,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der", + "der 0.7.7", ] [[package]] @@ -10881,7 +11449,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e0e9bc48b3852f36a84f8d0da275d50cb3c2b88b59b9ec35fdd8b7fa239e37d" dependencies = [ "debugid", - "memmap2", + "memmap2 0.5.10", "stable_deref_trait", "uuid", ] @@ -10961,7 +11529,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -11020,9 +11588,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.16" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +checksum = "dc12939a1c9b9d391e0b7135f72fd30508b73450753e28341fed159317582a77" [[package]] name = "tarpc" @@ -11188,11 +11756,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.3" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" dependencies = [ - "thiserror-impl 2.0.3", + "thiserror-impl 2.0.11", ] [[package]] @@ -11208,9 +11776,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.3" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", @@ -11306,6 +11874,25 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-bip39" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" +dependencies = [ + "anyhow", + "hmac", + "once_cell", + "pbkdf2 0.11.0", + "rand 0.8.5", + "rustc-hash 1.1.0", + "sha2 0.10.8", + "thiserror 1.0.68", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -12545,9 +13132,9 @@ dependencies = [ [[package]] name = "wasmtime" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639ecae347b9a2227e453a7b7671e84370a0b61f47a15e0390fe9b7725e47b3" +checksum = "11976a250672556d1c4c04c6d5d7656ac9192ac9edc42a4587d6c21460010e69" dependencies = [ "anyhow", "bitflags 2.6.0", @@ -12557,7 +13144,6 @@ dependencies = [ "hashbrown 0.14.5", "indexmap 2.2.6", "libc", - "libm", "log", "mach2", "memfd", @@ -12581,6 +13167,7 @@ dependencies = [ "wasmtime-environ", "wasmtime-fiber", "wasmtime-jit-icache-coherence", + "wasmtime-math", "wasmtime-slab", "wasmtime-versioned-export-macros", "wasmtime-winch", @@ -12589,18 +13176,18 @@ dependencies = [ [[package]] name = "wasmtime-asm-macros" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882a18800471cfc063c8b3ccf75723784acc3fd534009ac09421f2fac2fcdcec" +checksum = "1f178b0d125201fbe9f75beaf849bd3e511891f9e45ba216a5b620802ccf64f2" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "wasmtime-component-macro" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5c0a77c9e1927c3d471f53cc13767c3d3438e5d5ffd394e3eb31c86445fd60" +checksum = "d74de6592ed945d0a602f71243982a304d5d02f1e501b638addf57f42d57dfaf" dependencies = [ "anyhow", "proc-macro2", @@ -12613,15 +13200,15 @@ dependencies = [ [[package]] name = "wasmtime-component-util" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43702ca98bf5162eca0573db691ed9ecd36d716f8c6688410fe26ec16b6f9bcb" +checksum = "707dc7b3c112ab5a366b30cfe2fb5b2f8e6a0f682f16df96a5ec582bfe6f056e" [[package]] name = "wasmtime-cranelift" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20070aa5b75080a8932ec328419faf841df2bc6ceb16b55b0df2b952098392a2" +checksum = "366be722674d4bf153290fbcbc4d7d16895cc82fb3e869f8d550ff768f9e9e87" dependencies = [ "anyhow", "cfg-if 1.0.0", @@ -12644,9 +13231,9 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2604ddb24879d4dc1dedcb7081d7a8e017259bce916fdae097a97db52cbaab80" +checksum = "cdadc1af7097347aa276a4f008929810f726b5b46946971c660b6d421e9994ad" dependencies = [ "anyhow", "cranelift-bitset", @@ -12667,9 +13254,9 @@ dependencies = [ [[package]] name = "wasmtime-fiber" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98593412d2b167ebe2b59d4a17a184978a72f976b53b3a0ec05629451079ac1d" +checksum = "ccba90d4119f081bca91190485650730a617be1fff5228f8c4757ce133d21117" dependencies = [ "anyhow", "cc", @@ -12682,9 +13269,9 @@ dependencies = [ [[package]] name = "wasmtime-jit-icache-coherence" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d40d7722b9e1fbeae135715710a8a2570b1e6cf72b74dd653962d89831c6c70d" +checksum = "ec5e8552e01692e6c2e5293171704fed8abdec79d1a6995a0870ab190e5747d1" dependencies = [ "anyhow", "cfg-if 1.0.0", @@ -12692,17 +13279,26 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "wasmtime-math" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29210ec2aa25e00f4d54605cedaf080f39ec01a872c5bd520ad04c67af1dde17" +dependencies = [ + "libm", +] + [[package]] name = "wasmtime-slab" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8579c335220b4ece9aa490a0e8b46de78cd342b195ab21ff981d095e14b52383" +checksum = "fcb5821a96fa04ac14bc7b158bb3d5cd7729a053db5a74dad396cd513a5e5ccf" [[package]] name = "wasmtime-versioned-export-macros" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7de0a56fb0a69b185968f2d7a9ba54750920a806470dff7ad8de91ac06d277e" +checksum = "86ff86db216dc0240462de40c8290887a613dddf9685508eb39479037ba97b5b" dependencies = [ "proc-macro2", "quote", @@ -12711,9 +13307,9 @@ dependencies = [ [[package]] name = "wasmtime-winch" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abd309943c443f5590d12f9aba9ba63c481091c955a0a14de0c2a9e0e3aaeca9" +checksum = "fdbabfb8f20502d5e1d81092b9ead3682ae59988487aafcd7567387b7a43cf8f" dependencies = [ "anyhow", "cranelift-codegen", @@ -12728,9 +13324,9 @@ dependencies = [ [[package]] name = "wasmtime-wit-bindgen" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969f83022dac3435d6469edb582ceed04cfe32aa44dc3ef16e5cb55574633df8" +checksum = "8358319c2dd1e4db79e3c1c5d3a5af84956615343f9f89f4e4996a36816e06e6" dependencies = [ "anyhow", "heck 0.5.0", @@ -12872,9 +13468,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -version = "28.0.0" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9110decc2983ed94de904804dcd979ba59cbabc78a94fec6b1d8468ec513d0f6" +checksum = "2f849ef2c5f46cb0a20af4b4487aaa239846e52e2c03f13fa3c784684552859c" dependencies = [ "anyhow", "cranelift-codegen", @@ -12882,6 +13478,7 @@ dependencies = [ "regalloc2", "smallvec", "target-lexicon", + "thiserror 1.0.68", "wasmparser 0.221.2", "wasmtime-cranelift", "wasmtime-environ", @@ -13237,10 +13834,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94" dependencies = [ "const-oid", - "der", + "der 0.7.7", "sha1", - "signature", - "spki", + "signature 2.2.0", + "spki 0.7.3", "tls_codec", ] @@ -13456,9 +14053,3 @@ dependencies = [ "cc", "pkg-config", ] - -[[patch.unused]] -name = "jsonrpc" -version = "0.12.1" -source = "git+https://github.com/apoelstra/rust-jsonrpc?rev=e42044d#e42044d8e0896317488dfbd65eb5563d76e937fe" - diff --git a/Cargo.lock b/Cargo.lock index 7b1fd601484..e158a510111 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -66,7 +66,7 @@ dependencies = [ "brotli 6.0.0", "bytes", "bytestring", - "derive_more 0.99.18", + "derive_more 0.99.19", "encoding_rs", "flate2", "futures-core", @@ -96,7 +96,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -183,7 +183,7 @@ dependencies = [ "bytestring", "cfg-if 1.0.0", "cookie", - "derive_more 0.99.18", + "derive_more 0.99.19", "encoding_rs", "futures-core", "futures-util", @@ -214,7 +214,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -257,13 +257,38 @@ dependencies = [ "generic-array", ] +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if 1.0.0", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-gcm" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831010a0f742e1209b3bcea8fab6a8e149051ba6099432c8cb2cc117dec3ead1" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "ghash", + "subtle", +] + [[package]] name = "ahash" version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", ] @@ -275,10 +300,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if 1.0.0", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -396,7 +421,7 @@ dependencies = [ "anyhow", "async-trait", "candid", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-cdk-timers", "ic-nns-constants", "ic-stable-structures", @@ -477,6 +502,17 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[package]] +name = "argon2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db4ce4441f99dbd377ca8a8f57b698c44d0d6e712d8329b5040da5a64aa1ce73" +dependencies = [ + "base64ct", + "blake2", + "password-hash", +] + [[package]] name = "arrayvec" version = "0.5.2" @@ -526,7 +562,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -568,7 +604,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "synstructure", ] @@ -580,7 +616,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -748,7 +784,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -759,13 +795,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.85" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -792,7 +828,7 @@ dependencies = [ "log", "rustls-pki-types", "thiserror 1.0.69", - "webpki-roots 0.26.7", + "webpki-roots 0.26.8", ] [[package]] @@ -820,7 +856,7 @@ checksum = "e12882f59de5360c748c4cbf569a042d5fb0eb515f7bea9c1f470b47f6ffbd73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -851,7 +887,7 @@ dependencies = [ "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "itoa", "matchit", @@ -929,7 +965,7 @@ dependencies = [ "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "pin-project-lite", "rustls 0.21.12", @@ -947,7 +983,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" dependencies = [ "futures-core", - "getrandom", + "getrandom 0.2.15", "instant", "pin-project-lite", "rand 0.8.5", @@ -987,6 +1023,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + [[package]] name = "base16ct" version = "0.2.0" @@ -1120,7 +1162,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1148,15 +1190,15 @@ dependencies = [ [[package]] name = "bip32" -version = "0.5.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa13fae8b6255872fd86f7faf4b41168661d7d78609f7bfe6771b85c6739a15b" +checksum = "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" dependencies = [ - "bs58", + "bs58 0.4.0", "hmac", - "k256", + "k256 0.11.6", "once_cell", - "pbkdf2", + "pbkdf2 0.11.0", "rand_core 0.6.4", "ripemd", "sha2 0.10.8", @@ -1164,6 +1206,25 @@ dependencies = [ "zeroize", ] +[[package]] +name = "bip32" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db40d3dfbeab4e031d78c844642fa0caa0b0db11ce1607ac9d2986dff1405c69" +dependencies = [ + "bs58 0.5.1", + "hmac", + "k256 0.13.4", + "once_cell", + "pbkdf2 0.12.2", + "rand_core 0.6.4", + "ripemd", + "secp256k1 0.27.0", + "sha2 0.10.8", + "subtle", + "zeroize", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -1356,6 +1417,15 @@ dependencies = [ "wyz", ] +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + [[package]] name = "block-buffer" version = "0.9.0" @@ -1407,7 +1477,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1442,6 +1512,15 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +dependencies = [ + "sha2 0.9.9", +] + [[package]] name = "bs58" version = "0.5.1" @@ -1497,7 +1576,7 @@ name = "build-info-common" version = "0.0.27" source = "git+https://github.com/dfinity-lab/build-info?rev=701a696844fba5c87df162fbbc1ccef96f27c9d7#701a696844fba5c87df162fbbc1ccef96f27c9d7" dependencies = [ - "derive_more 0.99.18", + "derive_more 0.99.19", "semver", "serde", ] @@ -1524,9 +1603,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" dependencies = [ "allocator-api2", ] @@ -1589,18 +1668,18 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" dependencies = [ "serde", ] [[package]] name = "bytesize" -version = "1.3.0" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" +checksum = "2d2c12f985c78475a6b8d629afd0c360260ef34cfef52efccdcfd31972f81c2e" [[package]] name = "bytestring" @@ -1613,9 +1692,9 @@ dependencies = [ [[package]] name = "bzip2-sys" -version = "0.1.11+1.0.8" +version = "0.1.12+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +checksum = "72ebc2f1a417f01e1da30ef264ee86ae31d2dcd2d603ea283d3c244a883ca2a9" dependencies = [ "cc", "libc", @@ -1677,7 +1756,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1692,8 +1771,8 @@ version = "0.9.0" dependencies = [ "candid", "futures", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "serde", "serde_json", ] @@ -1713,12 +1792,12 @@ version = "0.1.0" dependencies = [ "anyhow", "bytes", - "clap 4.5.27", + "clap 4.5.29", "futures-util", "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "once_cell", "pin-project-lite", "regex", @@ -1730,9 +1809,9 @@ dependencies = [ [[package]] name = "canbench-rs" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497d900e11ab1891dd9743dd45dbeaada540ce323aa1adc7fc0ce1da2c6e86ff" +checksum = "588701e2d05679b79603acca6a6f8b78fe0d21f5f7a9c06fe689f769ae797008" dependencies = [ "canbench-rs-macros", "candid", @@ -1742,9 +1821,9 @@ dependencies = [ [[package]] name = "canbench-rs-macros" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5509bcfe6eeb86f057d46fbf20a2ba6b6bf9a1099b053a8f491cd7a909dfa6" +checksum = "e05fe21a7dfc85c3be8e40edbbcb3fe23b4c070fac4741eff18129f1d0f11aa9" dependencies = [ "proc-macro2", "quote", @@ -1753,9 +1832,9 @@ dependencies = [ [[package]] name = "candid" -version = "0.10.12" +version = "0.10.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e129c4051c57daf943586e01ef72faae48b04a8f692d5f646febf17a264c38" +checksum = "a253bab4a9be502c82332b60cbeee6202ad0692834efeec95fae9f29db33d692" dependencies = [ "anyhow", "binread", @@ -1792,7 +1871,7 @@ dependencies = [ "lazy_static", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -1824,7 +1903,7 @@ dependencies = [ "dfn_json", "dfn_macro", "futures", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-state-machine-tests", "ic-test-utilities", "ic-types", @@ -1845,7 +1924,7 @@ dependencies = [ "ic-canister-client", "ic-config", "ic-crypto-sha2", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-registry-transport", "ic-replica-tests", "ic-state-machine-tests", @@ -1853,7 +1932,7 @@ dependencies = [ "on_wire", "rand 0.8.5", "tokio", - "wasmprinter 0.217.0", + "wasmprinter 0.217.1", "wat", ] @@ -1900,9 +1979,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.10" +version = "1.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13208fcbb66eaeffe09b99fffbe1af420f00a7b35aa99ad683dfc1aa76145229" +checksum = "c7777341816418c02e033934a09f20dc0ccaf65a5201ef8a450ae0105a573fda" dependencies = [ "jobserver", "libc", @@ -1952,7 +2031,7 @@ dependencies = [ "candid", "certificate_orchestrator_interface", "chacha20poly1305", - "clap 4.5.27", + "clap 4.5.29", "cloudflare 0.12.0 (git+https://github.com/dfinity/cloudflare-rs.git?rev=a6538a036926bd756986c9c0a5de356daef48881)", "flate2", "futures", @@ -1995,8 +2074,8 @@ dependencies = [ "certificate_orchestrator_interface", "cfg-if 1.0.0", "hex", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-cdk-timers", "ic-certified-map", "ic-stable-structures", @@ -2140,7 +2219,7 @@ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading", + "libloading 0.8.6", ] [[package]] @@ -2162,19 +2241,19 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.27" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" +checksum = "8acebd8ad879283633b343856142139f2da2317c96b05b4dd6181c61e2480184" dependencies = [ "clap_builder", - "clap_derive 4.5.24", + "clap_derive 4.5.28", ] [[package]] name = "clap_builder" -version = "4.5.27" +version = "4.5.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" +checksum = "f6ba32cbda51c7e1dfd49acc1457ba1a7dec5b64fe360e828acb13ca8dc9c2f9" dependencies = [ "anstream", "anstyle", @@ -2197,14 +2276,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.24" +version = "4.5.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" +checksum = "bf4ced95c6f4a675af3da73304b9ac4ed991640c36374e4b46795c49e17cf1ed" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -2239,7 +2318,7 @@ version = "0.9.0" dependencies = [ "candid", "futures", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "serde", ] @@ -2380,7 +2459,7 @@ name = "config" version = "1.0.0" dependencies = [ "anyhow", - "clap 4.5.27", + "clap 4.5.29", "config_types", "ic-types", "macaddr", @@ -2472,7 +2551,7 @@ dependencies = [ "ic-agent", "ic-base-types", "ic-canister-client", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nns-constants", "ic-protobuf", "ic-recovery", @@ -2482,7 +2561,7 @@ dependencies = [ "ic-types", "ic_consensus_system_test_utils", "ic_consensus_threshold_sig_system_test_utils", - "prost 0.13.4", + "prost 0.13.5", "serde", "serde_json", "slog", @@ -2501,7 +2580,7 @@ dependencies = [ "ic-base-types", "ic-config", "ic-limits", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nns-constants", "ic-nns-governance-api", "ic-registry-nns-data-provider", @@ -2532,7 +2611,7 @@ dependencies = [ "futures", "ic-agent", "ic-canister-client", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-common-test-keys", "ic-nns-common", "ic-registry-nns-data-provider", @@ -2552,7 +2631,7 @@ version = "0.9.0" dependencies = [ "anyhow", "canister-test", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nns-constants", "ic-registry-subnet-type", "ic-system-test-driver", @@ -2622,6 +2701,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -2711,27 +2810,27 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "cranelift-bforest" -version = "0.115.1" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c1d02b72b6c411c0a2e92b25ed791ad5d071184193c08a34aa0fdcdf000b72" +checksum = "e15d04a0ce86cb36ead88ad68cf693ffd6cda47052b9e0ac114bc47fd9cd23c4" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-bitset" -version = "0.115.1" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "720b93bd86ebbb23ebfb2db1ed44d54b2ecbdbb2d034d485bc64aa605ee787ab" +checksum = "7c6e3969a7ce267259ce244b7867c5d3bc9e65b0a87e81039588dfdeaede9f34" dependencies = [ "serde", "serde_derive", @@ -2739,9 +2838,9 @@ dependencies = [ [[package]] name = "cranelift-codegen" -version = "0.115.1" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aed3d2d9914d30b460eedd7fd507720203023997bef71452ce84873f9c93537c" +checksum = "2c22032c4cb42558371cf516bb47f26cdad1819d3475c133e93c49f50ebf304e" dependencies = [ "bumpalo", "cranelift-bforest", @@ -2755,7 +2854,7 @@ dependencies = [ "hashbrown 0.14.5", "log", "regalloc2", - "rustc-hash 2.1.0", + "rustc-hash 2.1.1", "serde", "smallvec", "target-lexicon", @@ -2763,33 +2862,33 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.115.1" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "888c188d32263ec9e048873ff0b68c700933600d553f4412417916828be25f8e" +checksum = "c904bc71c61b27fc57827f4a1379f29de64fe95653b620a3db77d59655eee0b8" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.115.1" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddd5f4114d04ce7e073dd74e2ad16541fc61970726fcc8b2d5644a154ee4127" +checksum = "40180f5497572f644ce88c255480981ae2ec1d7bb4d8e0c0136a13b87a2f2ceb" [[package]] name = "cranelift-control" -version = "0.115.1" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92cc4c98d6a4256a1600d93ccd3536f3e77da9b4ca2c279de786ac22876e67d6" +checksum = "26d132c6d0bd8a489563472afc171759da0707804a65ece7ceb15a8c6d7dd5ef" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.115.1" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "760af4b5e051b5f82097a27274b917e3751736369fa73660513488248d27f23d" +checksum = "4b2d0d9618275474fbf679dd018ac6e009acbd6ae6850f6a67be33fb3b00b323" dependencies = [ "cranelift-bitset", "serde", @@ -2798,9 +2897,9 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.115.1" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0bf77ec0f470621655ec7539860b5c620d4f91326654ab21b075b83900f8831" +checksum = "4fac41e16729107393174b0c9e3730fb072866100e1e64e80a1a963b2e484d57" dependencies = [ "cranelift-codegen", "log", @@ -2810,15 +2909,15 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.115.1" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b665d0a6932c421620be184f9fc7f7adaf1b0bc2fa77bb7ac5177c49abf645b" +checksum = "1ca20d576e5070044d0a72a9effc2deacf4d6aa650403189d8ea50126483944d" [[package]] name = "cranelift-native" -version = "0.115.1" +version = "0.116.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2e75d1bd43dfec10924798f15e6474f1dbf63b0024506551aa19394dbe72ab" +checksum = "b8dee82f3f1f2c4cba9177f1cc5e350fe98764379bcd29340caa7b01f85076c7" dependencies = [ "cranelift-codegen", "libc", @@ -2843,7 +2942,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.5.27", + "clap 4.5.29", "criterion-plot", "futures", "is-terminal", @@ -2946,7 +3045,7 @@ dependencies = [ "crossterm_winapi", "libc", "mio 0.8.11", - "parking_lot 0.12.3", + "parking_lot", "signal-hook", "signal-hook-mio", "winapi 0.3.9", @@ -2963,9 +3062,21 @@ dependencies = [ [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] [[package]] name = "crypto-bigint" @@ -3010,7 +3121,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3027,13 +3138,22 @@ dependencies = [ [[package]] name = "csv-core" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" dependencies = [ "memchr", ] +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + [[package]] name = "ctrlc" version = "3.4.5" @@ -3055,7 +3175,7 @@ dependencies = [ "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", - "group", + "group 0.13.0", "rand_core 0.6.4", "rustc_version", "subtle", @@ -3070,7 +3190,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3112,10 +3232,10 @@ dependencies = [ "futures", "ic-base-types", "ic-certified-map", - "ic-crypto-getrandom-for-wasm", "ic-crypto-tree-hash", + "ic-dummy-getrandom-for-wasm", "ic-ledger-core", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics-encoder", "ic-nervous-system-clients", "ic-nervous-system-common", @@ -3132,7 +3252,7 @@ dependencies = [ "lazy_static", "maplit", "on_wire", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "serde", "serde_bytes", @@ -3209,7 +3329,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3231,7 +3351,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3250,7 +3370,7 @@ dependencies = [ "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core 0.9.10", + "parking_lot_core", ] [[package]] @@ -3264,14 +3384,39 @@ dependencies = [ "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core 0.9.10", + "parking_lot_core", ] [[package]] name = "data-encoding" -version = "2.7.0" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" + +[[package]] +name = "dbus" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb21987b9fb1613058ba3843121dd18b163b254d8a6e797e144cbac14d96d1b" +dependencies = [ + "libc", + "libdbus-sys", + "winapi 0.3.9", +] + +[[package]] +name = "dbus-secret-service" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e60eed09d8c01d3cee5b7d30acb059b76614c918fa0f992e0dd6eeb10daad6f" +checksum = "b42a16374481d92aed73ae45b1f120207d8e71d24fb89f357fadbd8f946fd84b" +dependencies = [ + "dbus", + "futures-util", + "num", + "once_cell", + "openssl", + "rand 0.8.5", +] [[package]] name = "debugid" @@ -3289,6 +3434,17 @@ dependencies = [ "cargo_metadata", ] +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "pem-rfc7468 0.6.0", + "zeroize", +] + [[package]] name = "der" version = "0.7.9" @@ -3298,7 +3454,7 @@ dependencies = [ "const-oid", "der_derive", "flagset", - "pem-rfc7468", + "pem-rfc7468 0.7.0", "zeroize", ] @@ -3324,7 +3480,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3345,7 +3501,7 @@ checksum = "2cdc8d50f426189eef89dac62fabfa0abb27d5cc008f25bf4156a0203325becc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3356,20 +3512,20 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "derive_more" -version = "0.99.18" +version = "0.99.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" dependencies = [ "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3389,7 +3545,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3397,7 +3553,7 @@ name = "deterministic_ips" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.27", + "clap 4.5.29", "config_types", "ic-crypto-sha2", "macaddr", @@ -3409,7 +3565,7 @@ name = "dflate" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.27", + "clap 4.5.29", "libc", "tar", ] @@ -3483,7 +3639,65 @@ name = "dfn_protobuf" version = "0.9.0" dependencies = [ "on_wire", - "prost 0.13.4", + "prost 0.13.5", +] + +[[package]] +name = "dfx-core" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4be4fc6929580b0ef8ac3678c03f31b59ffb1aa0d90ab754842d40cfc5b4552" +dependencies = [ + "aes-gcm", + "argon2", + "backoff", + "bip32 0.4.0", + "byte-unit", + "bytes", + "candid", + "clap 4.5.29", + "dialoguer", + "directories-next", + "dunce", + "flate2", + "handlebars", + "hex", + "humantime-serde", + "ic-agent", + "ic-identity-hsm", + "ic-utils 0.39.3", + "itertools 0.10.5", + "k256 0.11.6", + "keyring", + "lazy_static", + "reqwest 0.12.12", + "ring 0.16.20", + "schemars", + "sec1 0.3.0", + "semver", + "serde", + "serde_json", + "sha2 0.10.8", + "slog", + "tar", + "tempfile", + "thiserror 1.0.69", + "time", + "tiny-bip39", + "url", +] + +[[package]] +name = "dialoguer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console 0.15.10", + "shell-words", + "tempfile", + "thiserror 1.0.69", + "zeroize", ] [[package]] @@ -3519,12 +3733,22 @@ dependencies = [ "subtle", ] +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + [[package]] name = "diroid" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.27", + "clap 4.5.29", "walkdir", ] @@ -3557,7 +3781,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3578,8 +3802,8 @@ version = "0.1.0" dependencies = [ "candid", "ic-base-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "serde", ] @@ -3608,11 +3832,29 @@ dependencies = [ "dtoa", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "dyn-clone" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +checksum = "feeef44e73baff3a26d371801df019877a9866a8c493d315ab00177843314f35" + +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] [[package]] name = "ecdsa" @@ -3620,12 +3862,12 @@ version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der", + "der 0.7.9", "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "signature 2.2.0", + "spki 0.7.3", ] [[package]] @@ -3633,9 +3875,9 @@ name = "ecdsa-canister" version = "0.1.0" dependencies = [ "candid", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", - "ic-management-canister-types", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", + "ic-management-canister-types-private", "serde", "serde_bytes", "serde_json", @@ -3647,8 +3889,8 @@ version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "pkcs8", - "signature", + "pkcs8 0.10.2", + "signature 2.2.0", ] [[package]] @@ -3678,7 +3920,7 @@ dependencies = [ "rand_core 0.6.4", "serde", "sha2 0.10.8", - "signature", + "signature 2.2.0", "subtle", "zeroize", ] @@ -3707,22 +3949,43 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.7", + "ff 0.12.1", + "generic-array", + "group 0.12.1", + "pem-rfc7468 0.6.0", + "pkcs8 0.9.0", + "rand_core 0.6.4", + "sec1 0.3.0", + "subtle", + "zeroize", +] + [[package]] name = "elliptic-curve" version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "base16ct", - "crypto-bigint", + "base16ct 0.2.0", + "crypto-bigint 0.5.5", "digest 0.10.7", - "ff", + "ff 0.13.0", "generic-array", - "group", - "pem-rfc7468", - "pkcs8", + "group 0.13.0", + "pem-rfc7468 0.7.0", + "pkcs8 0.10.2", "rand_core 0.6.4", - "sec1", + "sec1 0.7.3", "subtle", "zeroize", ] @@ -3802,7 +4065,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3815,7 +4078,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3865,7 +4128,7 @@ checksum = "3bf679796c0322556351f287a51b49e48f7c4986e727b5dd78c972d30e2e16cc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -3984,10 +4247,10 @@ dependencies = [ "bytes", "chrono", "const-hex", - "elliptic-curve", + "elliptic-curve 0.13.8", "ethabi", "generic-array", - "k256", + "k256 0.13.4", "num_enum", "open-fastrlp", "rand 0.8.5", @@ -4045,7 +4308,7 @@ dependencies = [ "candid", "evm_rpc_types", "ic-canister-log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "mockall", "serde", "thiserror 2.0.11", @@ -4054,17 +4317,17 @@ dependencies = [ [[package]] name = "evm_rpc_types" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ed9ee7b89726f4a343208e9a89e9ad22fe7b4518b0d722973cc83274e7bf7f" +checksum = "fa134314bce7c35b9214710572fb7305edc7f4223c5bd03b5857ed08bbb05897" dependencies = [ "candid", "hex", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "num-bigint 0.4.6", "serde", "strum", - "thiserror 1.0.69", + "thiserror 2.0.11", "url", ] @@ -4118,11 +4381,11 @@ dependencies = [ "futures", "ic-agent", "ic-base-types", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-config", "ic-crypto-sha2", "ic-cycles-account-manager", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nns-constants", "ic-registry-routing-table", "ic-registry-subnet-type", @@ -4188,6 +4451,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "ff" version = "0.13.0" @@ -4267,6 +4540,12 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + [[package]] name = "flagset" version = "0.4.6" @@ -4304,6 +4583,21 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -4331,9 +4625,9 @@ checksum = "eb540cf7bc4fe6df9d8f7f0c974cfd0dce8ed4e9e8884e73433b503ee78b4e7d" [[package]] name = "fqdn" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f66e93156d144bd3a9a970033d04c6fbfb4b641275d8eaa3ff83f5b9c232496" +checksum = "3e7cf4b6cb33615d9adab21d74fd820753c532ef7c15ff556e382abde22e4023" [[package]] name = "fragile" @@ -4438,7 +4732,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -4448,7 +4742,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" dependencies = [ "futures-io", - "rustls 0.23.21", + "rustls 0.23.23", "rustls-pki-types", ] @@ -4567,10 +4861,32 @@ dependencies = [ "cfg-if 1.0.0", "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "ghash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0d8a4362ccb29cb0b265253fb0a2728f592895ee6854fd9bc13f2ffda266ff1" +dependencies = [ + "opaque-debug", + "polyval", +] + [[package]] name = "gimli" version = "0.26.2" @@ -4611,7 +4927,7 @@ dependencies = [ "futures-timer", "no-std-compat", "nonzero_ext", - "parking_lot 0.12.3", + "parking_lot", "portable-atomic", "quanta", "rand 0.8.5", @@ -4619,13 +4935,24 @@ dependencies = [ "spinning_top", ] +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff", + "ff 0.13.0", "rand_core 0.6.4", "subtle", ] @@ -4635,7 +4962,7 @@ name = "guestos_tool" version = "1.0.0" dependencies = [ "anyhow", - "clap 4.5.27", + "clap 4.5.29", "config", "indoc", "itertools 0.12.1", @@ -4698,6 +5025,20 @@ dependencies = [ "crunchy", ] +[[package]] +name = "handlebars" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225" +dependencies = [ + "log", + "pest", + "pest_derive", + "serde", + "serde_json", + "thiserror 1.0.69", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -4875,9 +5216,9 @@ checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] name = "hickory-proto" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447afdcdb8afb9d0a852af6dc65d9b285ce720ed7a59e42a8bf2e931c67bc1b5" +checksum = "2ad3d6d98c648ed628df039541a5577bee1a7c83e9e16fe3dbedeea4cdfeb971" dependencies = [ "async-trait", "bytes", @@ -4907,9 +5248,9 @@ dependencies = [ [[package]] name = "hickory-resolver" -version = "0.24.2" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a2e2aba9c389ce5267d31cf1e4dace82390ae276b0b364ea55630b1fa1b44b4" +checksum = "dcf287bde7b776e85d7188e6e5db7cf410a2f9531fe82817eb87feed034c8d14" dependencies = [ "cfg-if 1.0.0", "futures-util", @@ -4917,7 +5258,7 @@ dependencies = [ "ipconfig", "lru-cache", "once_cell", - "parking_lot 0.12.3", + "parking_lot", "rand 0.8.5", "resolv-conf", "rustls 0.21.12", @@ -4972,7 +5313,7 @@ name = "hostos_tool" version = "1.0.0" dependencies = [ "anyhow", - "clap 4.5.27", + "clap 4.5.29", "config", "config_types", "deterministic_ips", @@ -5055,27 +5396,27 @@ name = "http_counter" version = "0.9.0" dependencies = [ "candid", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-certified-map", "serde", ] [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "httpbin-rs" version = "0.9.0" dependencies = [ "axum", - "clap 4.5.27", - "hyper 1.5.2", + "clap 4.5.29", + "hyper 1.6.0", "hyper-util", - "rustls 0.23.21", + "rustls 0.23.23", "rustls-pemfile 2.2.0", "serde_json", "tokio", @@ -5140,9 +5481,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -5169,7 +5510,7 @@ dependencies = [ "futures-util", "headers 0.4.0", "http 1.2.0", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-rustls 0.27.5", "hyper-util", "pin-project-lite", @@ -5201,16 +5542,16 @@ checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http 1.2.0", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "log", - "rustls 0.23.21", + "rustls 0.23.23", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", "tokio-rustls 0.26.1", "tower-service", - "webpki-roots 0.26.7", + "webpki-roots 0.26.8", ] [[package]] @@ -5221,7 +5562,7 @@ checksum = "51c227614c208f7e7c2e040526912604a1a957fe467c9c2f5b06c5d032337dab" dependencies = [ "async-socks5", "http 1.2.0", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "thiserror 1.0.69", "tokio", @@ -5234,7 +5575,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "pin-project-lite", "tokio", @@ -5252,7 +5593,7 @@ dependencies = [ "futures-util", "http 1.2.0", "http-body 1.0.1", - "hyper 1.5.2", + "hyper 1.6.0", "pin-project-lite", "socket2 0.5.8", "tokio", @@ -5316,8 +5657,8 @@ dependencies = [ name = "ic-adapter-metrics-service" version = "0.9.0" dependencies = [ - "prost 0.13.4", - "prost-build 0.13.4", + "prost 0.13.5", + "prost-build 0.13.5", "tonic", "tonic-build", ] @@ -5332,7 +5673,7 @@ dependencies = [ "base64 0.13.1", "candid", "chrono", - "clap 4.5.27", + "clap 4.5.29", "cycles-minting-canister", "futures", "hex", @@ -5345,7 +5686,7 @@ dependencies = [ "ic-crypto-utils-threshold-sig-der", "ic-http-utils", "ic-interfaces-registry", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-clients", "ic-nervous-system-common", "ic-nervous-system-common-test-keys", @@ -5381,7 +5722,7 @@ dependencies = [ "maplit", "pocket-ic", "pretty_assertions", - "prost 0.13.4", + "prost 0.13.5", "registry-canister", "serde", "serde_json", @@ -5414,27 +5755,27 @@ dependencies = [ "backoff", "cached 0.52.0", "candid", - "der", - "ecdsa", + "der 0.7.9", + "ecdsa 0.16.9", "ed25519-consensus", - "elliptic-curve", + "elliptic-curve 0.13.8", "futures-util", "hex", "http 1.2.0", "http-body 1.0.1", - "ic-certification 3.0.2", + "ic-certification 3.0.3", "ic-transport-types", "ic-verify-bls-signature 0.5.0", - "k256", + "k256 0.13.4", "leb128", "p256", "pem 3.0.4", - "pkcs8", + "pkcs8 0.10.2", "rand 0.8.5", "rangemap", "reqwest 0.12.12", "ring 0.17.8", - "sec1", + "sec1 0.7.3", "serde", "serde_bytes", "serde_cbor", @@ -5476,7 +5817,7 @@ dependencies = [ "mockall", "phantom_newtype", "prometheus", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "slog", "thiserror 2.0.11", @@ -5511,14 +5852,14 @@ version = "0.9.0" dependencies = [ "bincode", "byteorder", - "clap 4.5.27", + "clap 4.5.29", "criterion", "ic-config", "ic-crypto-test-utils-canister-threshold-sigs", "ic-interfaces", "ic-limits", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-protobuf", "ic-sys", @@ -5534,7 +5875,7 @@ dependencies = [ "lmdb-rkv-sys", "nix 0.24.3", "prometheus", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rocksdb", "serde", @@ -5554,7 +5895,7 @@ version = "0.9.0" dependencies = [ "anyhow", "chrono", - "clap 4.5.27", + "clap 4.5.29", "ic-config", "ic-crypto-utils-threshold-sig-der", "ic-logger", @@ -5594,7 +5935,7 @@ dependencies = [ "phantom_newtype", "proptest 1.6.0", "proptest-derive", - "prost 0.13.4", + "prost 0.13.5", "serde", "serde_cbor", "strum", @@ -5607,7 +5948,7 @@ name = "ic-base-types-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -5621,8 +5962,8 @@ dependencies = [ "hex", "ic-base-types", "ic-btc-interface", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-ckbtc-minter", "ic-config", "ic-state-machine-tests", @@ -5648,11 +5989,11 @@ dependencies = [ "base64 0.22.1", "bytes", "chacha20poly1305", - "clap 4.5.27", - "clap_derive 4.5.24", + "clap 4.5.29", + "clap_derive 4.5.28", "cloudflare 0.12.0 (git+https://github.com/cloudflare/cloudflare-rs.git?rev=f14720e42184ee176a97676e85ef2d2d85bc3aae)", "derive-new", - "fqdn 0.4.4", + "fqdn 0.4.5", "futures", "futures-util", "hickory-proto", @@ -5661,18 +6002,18 @@ dependencies = [ "http-body 1.0.1", "http-body-util", "humantime", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "instant-acme", "moka", "parse-size", "prometheus", - "prost 0.13.4", - "prost-types 0.13.4", + "prost 0.13.5", + "prost-types 0.13.5", "rand 0.8.5", "rcgen", "reqwest 0.12.12", - "rustls 0.23.21", + "rustls 0.23.23", "rustls-acme", "rustls-pemfile 2.2.0", "rustls-platform-verifier", @@ -5703,7 +6044,6 @@ dependencies = [ name = "ic-boundary" version = "0.9.0" dependencies = [ - "anonymization-client", "anyhow", "arc-swap", "async-scoped", @@ -5712,7 +6052,7 @@ dependencies = [ "axum-extra", "bytes", "candid", - "clap 4.5.27", + "clap 4.5.29", "criterion", "dashmap 6.1.0", "ethnum", @@ -5730,11 +6070,11 @@ dependencies = [ "ic-certification-test-utils", "ic-config", "ic-crypto", - "ic-crypto-ed25519", "ic-crypto-tree-hash", "ic-crypto-utils-basic-sig", "ic-crypto-utils-threshold-sig-der", "ic-crypto-utils-tls", + "ic-ed25519", "ic-interfaces", "ic-interfaces-registry", "ic-limits", @@ -5765,8 +6105,9 @@ dependencies = [ "rcgen", "regex", "reqwest 0.12.12", - "rustls 0.23.21", + "rustls 0.23.23", "rustls-pemfile 2.2.0", + "salt-sharing-api", "serde", "serde_bytes", "serde_cbor", @@ -5810,7 +6151,7 @@ dependencies = [ "ic-registry-subnet-type", "ic-system-test-driver", "indoc", - "k256", + "k256 0.13.4", "pem 1.1.1", "rand 0.8.5", "rand_chacha 0.3.1", @@ -5853,7 +6194,7 @@ dependencies = [ "ic-registry-routing-table", "ic-registry-subnet-type", "ic-system-test-driver", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "reqwest 0.12.12", "slog", @@ -5888,7 +6229,7 @@ dependencies = [ "bitcoin 0.32.5", "bitcoincore-rpc", "bitcoind", - "clap 4.5.27", + "clap 4.5.29", "criterion", "futures", "hashlink", @@ -5908,15 +6249,16 @@ dependencies = [ "ic-logger", "ic-metrics", "ic-test-utilities-logger", - "parking_lot 0.12.3", + "parking_lot", "primitive-types", "prometheus", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "serde", "serde_json", "slog", "slog-async", + "static_assertions", "tempfile", "thiserror 2.0.11", "tokio", @@ -5976,7 +6318,7 @@ dependencies = [ "ic-btc-interface", "ic-canister-log 0.2.0", "ic-canisters-http-types", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-metrics-assert", "ic-metrics-encoder", "ic-stable-structures", @@ -6022,7 +6364,7 @@ dependencies = [ "mockall", "prometheus", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "slog", "thiserror 2.0.11", ] @@ -6054,7 +6396,7 @@ dependencies = [ name = "ic-btc-service" version = "0.9.0" dependencies = [ - "prost 0.13.4", + "prost 0.13.5", "tonic", "tonic-build", ] @@ -6067,6 +6409,7 @@ dependencies = [ "csv", "hex", "proptest 0.9.6", + "rstest", ] [[package]] @@ -6077,30 +6420,30 @@ dependencies = [ "futures-util", "hex", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-rustls 0.27.5", "hyper-util", "ic-canister-client-sender", "ic-canonical-state", "ic-certification 0.9.0", "ic-certification-test-utils", - "ic-crypto-secp256k1", "ic-crypto-test-utils-reproducible-rng", "ic-crypto-test-utils-root-of-trust", "ic-crypto-test-utils-tls", "ic-crypto-tree-hash", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-protobuf", "ic-read-state-response-parser", + "ic-secp256k1", "ic-test-utilities", "ic-test-utilities-types", "ic-types", "ic-validator", "itertools 0.12.1", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rand_chacha 0.3.1", - "rustls 0.23.21", + "rustls 0.23.23", "serde", "serde_cbor", "tokio", @@ -6115,8 +6458,8 @@ name = "ic-canister-client-sender" version = "0.9.0" dependencies = [ "ic-base-types", - "ic-crypto-ed25519", - "ic-crypto-secp256k1", + "ic-ed25519", + "ic-secp256k1", "ic-types", "rand 0.8.5", "rand_chacha 0.3.1", @@ -6161,7 +6504,7 @@ dependencies = [ "ic-interfaces-state-manager", "ic-limits", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-registry-routing-table", "ic-registry-subnet-type", @@ -6203,7 +6546,7 @@ version = "0.9.0" dependencies = [ "by_address", "ic-canister-log 0.2.0", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-metrics-encoder", "maplit", "priority-queue", @@ -6219,7 +6562,7 @@ dependencies = [ "candid", "hex", "ic-cdk 0.17.1", - "ic-certification 3.0.2", + "ic-certification 3.0.3", "ic-representation-independent-hash", "lazy_static", "serde", @@ -6252,7 +6595,7 @@ dependencies = [ "ic-crypto-sha2", "ic-crypto-tree-hash", "ic-error-types", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-protobuf", "ic-registry-routing-table", "ic-registry-subnet-features", @@ -6308,12 +6651,12 @@ dependencies = [ [[package]] name = "ic-cbor" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5500d6e85bc2ca8ea8aaed16cb84811882589244831a2fd8eefe02e90b3006c6" +checksum = "a0efada960a6c9fb023f45ed95801b757a033dafba071e4f386c6c112ca186d9" dependencies = [ "candid", - "ic-certification 3.0.2", + "ic-certification 3.0.3", "leb128", "nom", "thiserror 1.0.69", @@ -6332,32 +6675,6 @@ dependencies = [ "serde_bytes", ] -[[package]] -name = "ic-cdk" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b1da6a25b045f9da3c9459c0cb2b0700ac368ee16382975a17185a23b9c18ab" -dependencies = [ - "candid", - "ic-cdk-macros 0.13.2", - "ic0 0.21.1", - "serde", - "serde_bytes", -] - -[[package]] -name = "ic-cdk" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8ecacd682fa05a985253592963306cb9799622d7b1cce4b1edb89c6ec85be1" -dependencies = [ - "candid", - "ic-cdk-macros 0.16.0", - "ic0 0.23.0", - "serde", - "serde_bytes", -] - [[package]] name = "ic-cdk" version = "0.17.1" @@ -6398,48 +6715,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ic-cdk-macros" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fde5ca6ef1e69825c68916ff1bf7256b8f7ed69ac5ea3f1756f6e57f1503e27" -dependencies = [ - "candid", - "proc-macro2", - "quote", - "serde", - "serde_tokenstream 0.1.7", - "syn 1.0.109", -] - -[[package]] -name = "ic-cdk-macros" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45800053d80a6df839a71aaea5797e723188c0b992618208ca3b941350c7355" -dependencies = [ - "candid", - "proc-macro2", - "quote", - "serde", - "serde_tokenstream 0.1.7", - "syn 1.0.109", -] - -[[package]] -name = "ic-cdk-macros" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4d857135deef20cc7ea8f3869a30cd9cfeb1392b3a81043790b2cd82adc3e0" -dependencies = [ - "candid", - "proc-macro2", - "quote", - "serde", - "serde_tokenstream 0.2.2", - "syn 2.0.96", -] - [[package]] name = "ic-cdk-macros" version = "0.17.1" @@ -6451,7 +6726,7 @@ dependencies = [ "quote", "serde", "serde_tokenstream 0.2.2", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -6464,18 +6739,18 @@ dependencies = [ "quote", "serde", "serde_tokenstream 0.2.2", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "ic-cdk-timers" -version = "0.7.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054727a3a1c486528b96349817d54290ff70df6addf417def456ea708a16f7fb" +checksum = "fb8fd812a9e26f6aa00594546f8fbf4d4853f39c3ba794c8ff11ecf86fd3c9e4" dependencies = [ "futures", - "ic-cdk 0.13.5", - "ic0 0.21.1", + "ic-cdk 0.17.1", + "ic0 0.23.0", "serde", "serde_bytes", "slotmap", @@ -6483,19 +6758,19 @@ dependencies = [ [[package]] name = "ic-certificate-verification" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2daec653eb7895b5549cdf58d871985711c03cf5e389f7800a970f4f42dc0897" +checksum = "546dfd75c4da975b9f1c55ef3da461321ab4313a66da653af321ed6dc7319b61" dependencies = [ "cached 0.54.0", "candid", "ic-cbor", - "ic-certification 3.0.2", + "ic-certification 3.0.3", "lazy_static", "leb128", "miracl_core_bls12381", "nom", - "parking_lot 0.12.3", + "parking_lot", "sha2 0.10.8", "thiserror 1.0.69", ] @@ -6524,9 +6799,9 @@ dependencies = [ [[package]] name = "ic-certification" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eae40f26fcac9c141cad54d9aa5f423efffde78ac371057c53d275ebbcad443" +checksum = "ffb40d73f9f8273dc6569a68859003bbd467c9dc6d53c6fd7d174742f857209d" dependencies = [ "hex", "serde", @@ -6593,9 +6868,9 @@ dependencies = [ "ciborium", "hex", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", - "ic-management-canister-types", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", + "ic-management-canister-types-private", "ic-metrics-encoder", "ic-stable-structures", "ic-state-machine-tests", @@ -6615,7 +6890,7 @@ dependencies = [ "async-trait", "bech32 0.9.1", "bitcoin 0.28.2", - "bs58", + "bs58 0.5.1", "candid", "candid_parser", "canister-test", @@ -6629,18 +6904,18 @@ dependencies = [ "ic-btc-interface", "ic-canister-log 0.2.0", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-config", - "ic-crypto-getrandom-for-wasm", - "ic-crypto-secp256k1", "ic-crypto-sha2", + "ic-dummy-getrandom-for-wasm", "ic-icrc1", "ic-icrc1-ledger", "ic-ledger-core", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics-assert", "ic-metrics-encoder", + "ic-secp256k1", "ic-stable-structures", "ic-state-machine-tests", "ic-test-utilities-load-wasm", @@ -6684,17 +6959,17 @@ dependencies = [ "ic-base-types", "ic-canister-log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-cdk-timers", "ic-cketh-test-utils", "ic-config", - "ic-crypto-secp256k1", "ic-crypto-test-utils-reproducible-rng", "ic-ethereum-types", "ic-ledger-suite-orchestrator-test-utils", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics-encoder", + "ic-secp256k1", "ic-sha3 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "ic-stable-structures", "ic-state-machine-tests", @@ -6736,14 +7011,14 @@ dependencies = [ "hex", "ic-base-types", "ic-canisters-http-types", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-cketh-minter", "ic-error-types", "ic-ethereum-types", "ic-icrc1-ledger", "ic-ledger-suite-orchestrator", "ic-ledger-suite-orchestrator-test-utils", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-state-machine-tests", "ic-test-utilities-load-wasm", "ic-types", @@ -6805,7 +7080,7 @@ dependencies = [ "ic-interfaces-state-manager-mocks", "ic-limits", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-messaging", "ic-metrics", "ic-protobuf", @@ -6832,7 +7107,7 @@ dependencies = [ "phantom_newtype", "prometheus", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rand_chacha 0.3.1", "rstest", @@ -6854,14 +7129,19 @@ dependencies = [ "ic-artifact-pool", "ic-consensus-mocks", "ic-consensus-utils", + "ic-crypto-temp-crypto", "ic-crypto-test-utils-ni-dkg", "ic-interfaces", "ic-interfaces-registry", + "ic-interfaces-registry-mocks", "ic-interfaces-state-manager", "ic-logger", + "ic-management-canister-types-private", "ic-metrics", "ic-protobuf", "ic-registry-client-helpers", + "ic-registry-keys", + "ic-registry-subnet-features", "ic-replicated-state", "ic-test-artifact-pool", "ic-test-utilities", @@ -6872,6 +7152,7 @@ dependencies = [ "ic-test-utilities-types", "ic-types", "prometheus", + "prost 0.13.5", "rayon", "slog", ] @@ -6898,7 +7179,7 @@ dependencies = [ "mockall", "phantom_newtype", "prometheus", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "slog", "tokio", @@ -6945,7 +7226,7 @@ dependencies = [ "ic-interfaces", "ic-interfaces-registry", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-protobuf", "ic-registry-client-helpers", @@ -6968,7 +7249,7 @@ dependencies = [ "assert_matches", "async-trait", "bincode", - "clap 4.5.27", + "clap 4.5.29", "criterion", "hex", "ic-adapter-metrics-server", @@ -6976,7 +7257,6 @@ dependencies = [ "ic-certification-test-utils", "ic-config", "ic-crypto-ecdsa-secp256r1", - "ic-crypto-ed25519", "ic-crypto-for-verification-only", "ic-crypto-interfaces-sig-verification", "ic-crypto-internal-basic-sig-der-utils", @@ -6984,6 +7264,7 @@ dependencies = [ "ic-crypto-internal-basic-sig-ecdsa-secp256r1", "ic-crypto-internal-basic-sig-ed25519", "ic-crypto-internal-basic-sig-rsa-pkcs1", + "ic-crypto-internal-bls12-381-vetkd", "ic-crypto-internal-csp", "ic-crypto-internal-csp-proptest-utils", "ic-crypto-internal-csp-test-utils", @@ -6997,7 +7278,6 @@ dependencies = [ "ic-crypto-internal-types", "ic-crypto-node-key-generation", "ic-crypto-node-key-validation", - "ic-crypto-secp256k1", "ic-crypto-sha2", "ic-crypto-standalone-sig-verifier", "ic-crypto-temp-crypto", @@ -7019,12 +7299,13 @@ dependencies = [ "ic-crypto-utils-basic-sig", "ic-crypto-utils-canister-threshold-sig", "ic-crypto-utils-tls", + "ic-ed25519", "ic-http-endpoints-async-utils", "ic-interfaces", "ic-interfaces-registry", "ic-interfaces-registry-mocks", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-protobuf", "ic-registry-client", @@ -7032,22 +7313,24 @@ dependencies = [ "ic-registry-client-helpers", "ic-registry-keys", "ic-registry-proto-data-provider", + "ic-secp256k1", "ic-test-utilities-in-memory-logger", "ic-test-utilities-registry", "ic-test-utilities-time", "ic-types", "ic-types-test-utils", - "k256", + "ic-vetkd-utils", + "k256 0.13.4", "maplit", "mockall", - "parking_lot 0.12.3", + "parking_lot", "proptest 1.6.0", "proptest-derive", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rand_chacha 0.3.1", "rsa", - "rustls 0.23.21", + "rustls 0.23.23", "serde", "sha2 0.10.8", "simple_asn1", @@ -7079,23 +7362,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ic-crypto-ed25519" -version = "0.9.0" -dependencies = [ - "curve25519-dalek", - "ed25519-dalek", - "hex", - "hex-literal", - "hkdf", - "pem 1.1.1", - "rand 0.8.5", - "rand_chacha 0.3.1", - "thiserror 2.0.11", - "wycheproof", - "zeroize", -] - [[package]] name = "ic-crypto-for-verification-only" version = "0.9.0" @@ -7112,13 +7378,6 @@ dependencies = [ "ic-types", ] -[[package]] -name = "ic-crypto-getrandom-for-wasm" -version = "0.9.0" -dependencies = [ - "getrandom", -] - [[package]] name = "ic-crypto-iccsa" version = "0.9.0" @@ -7167,10 +7426,10 @@ dependencies = [ "hex", "ic-crypto-internal-basic-sig-der-utils", "ic-crypto-internal-types", - "ic-crypto-secp256k1", "ic-crypto-secrets-containers", "ic-crypto-sha2", "ic-crypto-test-utils-reproducible-rng", + "ic-secp256k1", "ic-types", "rand 0.8.5", "serde", @@ -7211,13 +7470,13 @@ dependencies = [ "base64 0.13.1", "curve25519-dalek", "hex", - "ic-crypto-ed25519", "ic-crypto-internal-basic-sig-der-utils", "ic-crypto-internal-seed", "ic-crypto-internal-test-vectors", "ic-crypto-internal-types", "ic-crypto-secrets-containers", "ic-crypto-test-utils-reproducible-rng", + "ic-ed25519", "ic-protobuf", "ic-types", "num-bigint 0.4.6", @@ -7280,7 +7539,7 @@ dependencies = [ "ic-types", "num-bigint 0.4.6", "num-traits", - "pkcs8", + "pkcs8 0.10.2", "rsa", "serde", "serde_json", @@ -7316,7 +7575,6 @@ dependencies = [ "hex", "ic-crypto-internal-bls12-381-type", "ic-crypto-test-utils-reproducible-rng", - "ic-sha3 1.0.0", "rand 0.8.5", "rand_chacha 0.3.1", ] @@ -7367,7 +7625,7 @@ dependencies = [ "ic-crypto-utils-basic-sig", "ic-interfaces", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-protobuf", "ic-sys", @@ -7379,10 +7637,10 @@ dependencies = [ "lazy_static", "mockall", "num_cpus", - "parking_lot 0.12.3", + "parking_lot", "proptest 1.6.0", "proptest-derive", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rand_chacha 0.3.1", "rayon", @@ -7433,7 +7691,7 @@ name = "ic-crypto-internal-csp-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -7538,7 +7796,7 @@ dependencies = [ "ic-crypto-test-utils-reproducible-rng", "ic-types", "lazy_static", - "parking_lot 0.12.3", + "parking_lot", "proptest 1.6.0", "proptest-derive", "rand 0.8.5", @@ -7556,12 +7814,12 @@ name = "ic-crypto-internal-threshold-sig-canister-threshold-sig" version = "0.9.0" dependencies = [ "assert_matches", - "bip32", + "bip32 0.5.3", "criterion", "curve25519-dalek", "ed25519-dalek", "fe-derive", - "group", + "group 0.13.0", "hex", "hex-literal", "ic-crypto-internal-hmac", @@ -7572,7 +7830,7 @@ dependencies = [ "ic-crypto-sha2", "ic-crypto-test-utils-reproducible-rng", "ic-types", - "k256", + "k256 0.13.4", "lazy_static", "num-traits", "p256", @@ -7598,7 +7856,7 @@ dependencies = [ "ic-crypto-internal-threshold-sig-canister-threshold-sig", "ic-crypto-sha2", "ic-types", - "k256", + "k256 0.13.4", "p256", "rand 0.8.5", "secp256k1 0.22.2", @@ -7712,28 +7970,6 @@ dependencies = [ "strum_macros", ] -[[package]] -name = "ic-crypto-secp256k1" -version = "0.9.0" -dependencies = [ - "bip32", - "bitcoin 0.28.2", - "hex", - "hex-literal", - "hmac", - "k256", - "lazy_static", - "num-bigint 0.4.6", - "pem 1.1.1", - "rand 0.8.5", - "rand_chacha 0.3.1", - "secp256k1 0.22.2", - "sha2 0.10.8", - "simple_asn1", - "wycheproof", - "zeroize", -] - [[package]] name = "ic-crypto-secrets-containers" version = "0.9.0" @@ -7808,7 +8044,7 @@ dependencies = [ "ic-types-test-utils", "rand 0.8.5", "rand_chacha 0.3.1", - "rustls 0.23.21", + "rustls 0.23.23", "tempfile", "tokio", ] @@ -7826,8 +8062,8 @@ dependencies = [ name = "ic-crypto-test-utils" version = "0.9.0" dependencies = [ - "ic-crypto-ed25519", "ic-crypto-internal-csp-test-utils", + "ic-ed25519", "ic-interfaces-registry", "ic-registry-client-fake", "ic-registry-proto-data-provider", @@ -8006,10 +8242,10 @@ dependencies = [ "ic-registry-keys", "ic-registry-proto-data-provider", "ic-types", - "pkcs8", + "pkcs8 0.10.2", "rand 0.8.5", - "rustls 0.23.21", - "signature", + "rustls 0.23.23", + "signature 2.2.0", "time", "tokio", "tokio-rustls 0.26.1", @@ -8044,7 +8280,7 @@ dependencies = [ "ic-types", "json5", "maplit", - "rustls 0.23.21", + "rustls 0.23.23", "serde", "thiserror 2.0.11", "x509-parser", @@ -8057,7 +8293,7 @@ dependencies = [ "ic-base-types", "ic-crypto-tls-interfaces", "mockall", - "rustls 0.23.21", + "rustls 0.23.23", ] [[package]] @@ -8073,7 +8309,7 @@ dependencies = [ "ic-protobuf", "maplit", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "serde", "serde_bytes", @@ -8100,7 +8336,7 @@ dependencies = [ "assert_matches", "hex", "ic-base-types", - "ic-crypto-ed25519", + "ic-ed25519", "ic-protobuf", ] @@ -8171,7 +8407,7 @@ dependencies = [ "ic-registry-keys", "ic-registry-nns-data-provider", "ic-types", - "prost 0.13.4", + "prost 0.13.5", "reqwest 0.12.12", "tokio", ] @@ -8186,7 +8422,7 @@ dependencies = [ "ic-interfaces", "ic-limits", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nns-constants", "ic-registry-subnet-type", "ic-replicated-state", @@ -8218,7 +8454,7 @@ dependencies = [ "ic-execution-environment", "ic-interfaces", "ic-interfaces-state-manager", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-messaging", "ic-metrics", "ic-protobuf", @@ -8242,7 +8478,7 @@ dependencies = [ name = "ic-drun" version = "0.9.0" dependencies = [ - "clap 4.5.27", + "clap 4.5.29", "futures", "hex", "ic-canister-sandbox-backend-lib", @@ -8254,7 +8490,7 @@ dependencies = [ "ic-http-endpoints-metrics", "ic-interfaces", "ic-interfaces-state-manager", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-messaging", "ic-metrics", "ic-protobuf", @@ -8275,7 +8511,31 @@ dependencies = [ "slog-term", "tokio", "tower 0.5.2", - "wasmparser 0.217.0", + "wasmparser 0.217.1", +] + +[[package]] +name = "ic-dummy-getrandom-for-wasm" +version = "0.1.0" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "ic-ed25519" +version = "0.2.0" +dependencies = [ + "curve25519-dalek", + "ed25519-dalek", + "hex", + "hex-literal", + "hkdf", + "pem 1.1.1", + "rand 0.8.5", + "rand_chacha 0.3.1", + "thiserror 2.0.11", + "wycheproof", + "zeroize", ] [[package]] @@ -8287,7 +8547,7 @@ dependencies = [ "bincode", "candid", "canister-test", - "clap 4.5.27", + "clap 4.5.29", "criterion", "embedders_bench", "ic-base-types", @@ -8333,9 +8593,9 @@ dependencies = [ "slog", "slog-term", "tempfile", - "wasm-encoder 0.217.0", - "wasmparser 0.217.0", - "wasmprinter 0.217.0", + "wasm-encoder 0.217.1", + "wasmparser 0.217.1", + "wasmprinter 0.217.1", "wasmtime", "wasmtime-environ", "wast 212.0.0", @@ -8394,7 +8654,7 @@ dependencies = [ "ic-interfaces-state-manager-mocks", "ic-limits", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-nns-constants", "ic-query-stats", @@ -8427,7 +8687,7 @@ dependencies = [ "maplit", "memory_tracker", "more-asserts", - "num-rational", + "num-rational 0.2.4", "num-traits", "phantom_newtype", "prometheus", @@ -8446,7 +8706,7 @@ dependencies = [ "tokio", "tower 0.5.2", "tracing", - "wasmparser 0.217.0", + "wasmparser 0.217.1", "wat", ] @@ -8466,7 +8726,7 @@ dependencies = [ "anyhow", "assert_cmd", "assert_matches", - "clap 4.5.27", + "clap 4.5.29", "ic-crypto-test-utils-reproducible-rng", "ic-sys", "maplit", @@ -8478,14 +8738,14 @@ dependencies = [ [[package]] name = "ic-http-certification" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479941fca8e68c2267cddf686d34ed6fb491168667ff259c08a3d65d28bd26d2" +checksum = "3d1a65b0ffb568e954750067f660e254f4564394f5c064a88e0e93b2eea4a532" dependencies = [ "base64 0.22.1", "candid", "http 1.2.0", - "ic-certification 3.0.2", + "ic-certification 3.0.3", "ic-representation-independent-hash", "serde", "serde_cbor", @@ -8503,7 +8763,7 @@ dependencies = [ "bytes", "futures", "futures-util", - "hyper 1.5.2", + "hyper 1.6.0", "rand 0.8.5", "slog", "tokio", @@ -8545,7 +8805,7 @@ dependencies = [ "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "ic-canister-client", "ic-canister-client-sender", @@ -8591,11 +8851,11 @@ dependencies = [ "pretty_assertions", "prometheus", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "reqwest 0.12.12", "rstest", - "rustls 0.23.21", + "rustls 0.23.23", "serde", "serde_bytes", "serde_cbor", @@ -8619,7 +8879,7 @@ dependencies = [ "axum", "bytes", "crossbeam-channel", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "ic-config", "ic-crypto-tls-interfaces", @@ -8641,7 +8901,7 @@ dependencies = [ "ic-types", "maplit", "prometheus", - "prost 0.13.4", + "prost 0.13.5", "reqwest 0.12.12", "serde", "serde_json", @@ -8698,11 +8958,11 @@ dependencies = [ "async-stream", "byte-unit", "bytes", - "clap 4.5.27", + "clap 4.5.29", "futures", "http 1.2.0", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-rustls 0.27.5", "hyper-socks2", "hyper-util", @@ -8713,11 +8973,11 @@ dependencies = [ "ic-logger", "ic-metrics", "once_cell", - "parking_lot 0.12.3", + "parking_lot", "prometheus", "rand 0.8.5", "rstest", - "rustls 0.23.21", + "rustls 0.23.23", "rustls-pemfile 2.2.0", "serde", "serde_json", @@ -8747,7 +9007,7 @@ dependencies = [ "ic-interfaces", "ic-interfaces-adapter-client", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-registry-subnet-type", "ic-test-utilities-time", @@ -8801,7 +9061,7 @@ dependencies = [ name = "ic-https-outcalls-service" version = "0.9.0" dependencies = [ - "prost 0.13.4", + "prost 0.13.5", "tonic", "tonic-build", ] @@ -8817,8 +9077,8 @@ dependencies = [ "ic-base-types", "ic-canister-log 0.2.0", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-cdk-timers", "ic-icrc1-index-ng", "ic-ledger-canister-core", @@ -8847,13 +9107,13 @@ dependencies = [ "candid", "hex", "ic-base-types", - "ic-crypto-ed25519", - "ic-crypto-secp256k1", + "ic-ed25519", "ic-icp-rosetta-runner", "ic-ledger-test-utils", "ic-nns-governance-api", "ic-rosetta-api", "ic-rosetta-test-utils", + "ic-secp256k1", "icp-ledger", "icrc-ledger-types", "num-bigint 0.4.6", @@ -8888,7 +9148,7 @@ dependencies = [ "axum", "candid", "ciborium", - "clap 4.5.27", + "clap 4.5.29", "futures", "hex", "ic-agent", @@ -8945,14 +9205,14 @@ version = "0.1.0" dependencies = [ "anyhow", "candid", - "clap 4.5.27", + "clap 4.5.29", "hex", "ic-agent", - "ic-crypto-ed25519", - "ic-crypto-secp256k1", + "ic-ed25519", "ic-icrc-rosetta", "ic-icrc-rosetta-runner", "ic-rosetta-api", + "ic-secp256k1", "icrc-ledger-types", "num-bigint 0.4.6", "pocket-ic", @@ -9021,8 +9281,8 @@ dependencies = [ "ciborium", "ic-base-types", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-icrc1", "ic-icrc1-tokens-u256", "ic-icrc1-tokens-u64", @@ -9049,8 +9309,8 @@ dependencies = [ "ic-canister-log 0.2.0", "ic-canister-profiler", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-cdk-timers", "ic-crypto-sha2", "ic-icrc1", @@ -9093,10 +9353,10 @@ dependencies = [ "ic-base-types", "ic-canister-log 0.2.0", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-cdk-timers", - "ic-certification 3.0.2", + "ic-certification 3.0.3", "ic-crypto-tree-hash", "ic-icrc1", "ic-icrc1-test-utils", @@ -9126,12 +9386,12 @@ version = "0.9.0" dependencies = [ "candid", "ic-agent", - "ic-crypto-ed25519", - "ic-crypto-secp256k1", "ic-crypto-test-utils-reproducible-rng", + "ic-ed25519", "ic-icrc1", "ic-ledger-core", "ic-ledger-hash-of", + "ic-secp256k1", "ic-types", "icrc-ledger-types", "num-traits", @@ -9175,6 +9435,20 @@ dependencies = [ "serde", ] +[[package]] +name = "ic-identity-hsm" +version = "0.39.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e294ee038eb647cd9cce78b5961533be7f883494e6ea1faece52459bce2d29e9" +dependencies = [ + "hex", + "ic-agent", + "pkcs11", + "sha2 0.10.8", + "simple_asn1", + "thiserror 2.0.11", +] + [[package]] name = "ic-image-upgrader" version = "0.9.0" @@ -9203,7 +9477,7 @@ dependencies = [ "ic-interfaces-state-manager-mocks", "ic-limits", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-registry-client", "ic-registry-client-helpers", @@ -9236,7 +9510,7 @@ dependencies = [ "ic-crypto-internal-csp-proptest-utils", "ic-error-types", "ic-interfaces-state-manager", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-protobuf", "ic-registry-provisional-whitelist", "ic-registry-subnet-type", @@ -9245,7 +9519,7 @@ dependencies = [ "ic-wasm-types", "phantom_newtype", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "serde", "strum", "strum_macros", @@ -9292,7 +9566,7 @@ name = "ic-interfaces-registry" version = "0.9.0" dependencies = [ "ic-types", - "prost 0.13.4", + "prost 0.13.5", "serde", ] @@ -9381,7 +9655,7 @@ dependencies = [ "ic-ledger-core", "ic-ledger-hash-of", "ic-limits", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-utils 0.9.0", "serde", ] @@ -9424,15 +9698,15 @@ dependencies = [ "ic-base-types", "ic-canister-log 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-crypto-sha2", "ic-crypto-test-utils-reproducible-rng", "ic-ethereum-types", "ic-icrc1-index-ng", "ic-icrc1-ledger", "ic-ledger-suite-orchestrator-test-utils", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics-encoder", "ic-stable-structures", "ic-state-machine-tests", @@ -9460,10 +9734,10 @@ dependencies = [ "candid", "ic-base-types", "ic-canisters-http-types", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-icrc1-ledger", "ic-ledger-suite-orchestrator", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics-assert", "ic-state-machine-tests", "ic-test-utilities-load-wasm", @@ -9498,7 +9772,7 @@ dependencies = [ "ic-ledger-canister-core", "ic-ledger-core", "ic-ledger-hash-of", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-registry-subnet-type", "ic-rosetta-test-utils", "ic-state-machine-tests", @@ -9588,7 +9862,7 @@ dependencies = [ "assert_matches", "candid", "candid_parser", - "clap 4.5.27", + "clap 4.5.29", "futures", "hex", "maplit", @@ -9603,7 +9877,7 @@ dependencies = [ ] [[package]] -name = "ic-management-canister-types" +name = "ic-management-canister-types-private" version = "0.9.0" dependencies = [ "arbitrary", @@ -9643,8 +9917,8 @@ dependencies = [ "candid", "dfn_candid", "dfn_core", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "serde", ] @@ -9659,10 +9933,10 @@ dependencies = [ "ic-base-types", "ic-certification-version", "ic-config", - "ic-crypto-ed25519", "ic-crypto-test-utils-ni-dkg", "ic-crypto-utils-threshold-sig-der", "ic-cycles-account-manager", + "ic-ed25519", "ic-error-types", "ic-interfaces", "ic-interfaces-certified-stream-store", @@ -9671,7 +9945,7 @@ dependencies = [ "ic-interfaces-state-manager-mocks", "ic-limits", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-protobuf", "ic-query-stats", @@ -9725,7 +9999,7 @@ dependencies = [ "ic-adapter-metrics-client", "ic-logger", "libc", - "parking_lot 0.12.3", + "parking_lot", "procfs 0.9.1", "prometheus", "slog", @@ -9755,7 +10029,7 @@ name = "ic-metrics-tool" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.27", + "clap 4.5.29", ] [[package]] @@ -9775,9 +10049,11 @@ dependencies = [ "ic-sns-root", "ic-sns-swap", "ic-sns-wasm", + "itertools 0.12.1", "pocket-ic", "registry-canister", "serde", + "serde_cbor", "tempfile", "thiserror 2.0.11", "tokio", @@ -9811,7 +10087,7 @@ dependencies = [ "ic-base-types", "ic-error-types", "ic-ledger-core", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-common", "ic-nervous-system-proxied-canister-calls-tracker", "ic-nervous-system-runtime", @@ -9862,7 +10138,7 @@ dependencies = [ "num-traits", "priority-queue", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "rust_decimal", "serde", "serde_bytes", @@ -9971,7 +10247,7 @@ dependencies = [ name = "ic-nervous-system-instruction-stats" version = "0.0.1" dependencies = [ - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-metrics-encoder", "ic-nervous-system-histogram", "itertools 0.12.1", @@ -9983,7 +10259,7 @@ name = "ic-nervous-system-instruction-stats-update-attribute" version = "0.0.1" dependencies = [ "candid", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "quote", "syn 1.0.109", ] @@ -10003,8 +10279,9 @@ dependencies = [ "ic-icrc1", "ic-icrc1-index-ng", "ic-icrc1-tokens-u64", + "ic-interfaces-registry", "ic-ledger-core", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-agent", "ic-nervous-system-clients", "ic-nervous-system-common", @@ -10023,9 +10300,11 @@ dependencies = [ "ic-nns-test-utils-macros", "ic-protobuf", "ic-registry-keys", + "ic-registry-proto-data-provider", "ic-registry-routing-table", "ic-registry-subnet-type", "ic-registry-transport", + "ic-sns-cli", "ic-sns-governance", "ic-sns-governance-api", "ic-sns-init", @@ -10046,13 +10325,15 @@ dependencies = [ "maplit", "num-traits", "pocket-ic", - "prost 0.13.4", + "prost 0.13.5", "registry-canister", "rust_decimal", "rust_decimal_macros", "rustc-hash 1.1.0", "serde", + "tempfile", "tokio", + "url", "xrc-mock", ] @@ -10077,7 +10358,7 @@ version = "0.0.1" dependencies = [ "candid", "canister-test", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-cdk-timers", "ic-config", "ic-nervous-system-temporary", @@ -10097,7 +10378,7 @@ dependencies = [ "ic-base-types", "ic-nervous-system-proto-protobuf-generator", "ic-test-utilities-compare-dirs", - "prost 0.13.4", + "prost 0.13.5", "rust_decimal", "serde", "tempfile", @@ -10108,7 +10389,7 @@ name = "ic-nervous-system-proto-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -10127,9 +10408,9 @@ version = "0.9.0" dependencies = [ "candid", "dfn_core", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-crypto-sha2", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-clients", "ic-nervous-system-runtime", "serde", @@ -10145,7 +10426,7 @@ dependencies = [ "dfn_candid", "dfn_core", "ic-base-types", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", ] [[package]] @@ -10242,7 +10523,7 @@ dependencies = [ "lazy_static", "num-traits", "on_wire", - "prost 0.13.4", + "prost 0.13.5", "serde", "serde_bytes", "sha2 0.10.8", @@ -10254,7 +10535,7 @@ name = "ic-nns-common-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -10281,19 +10562,18 @@ dependencies = [ "criterion", "csv", "cycles-minting-canister", - "dfn_http_metrics", "dyn-clone", "futures", "ic-base-types", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-cdk-timers", "ic-config", - "ic-crypto-getrandom-for-wasm", "ic-crypto-sha2", + "ic-dummy-getrandom-for-wasm", "ic-ledger-core", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics-encoder", "ic-nervous-system-canisters", "ic-nervous-system-clients", @@ -10337,7 +10617,7 @@ dependencies = [ "pretty_assertions", "prometheus-parse", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rand_chacha 0.3.1", "registry-canister", @@ -10376,7 +10656,7 @@ dependencies = [ "ic-utils 0.9.0", "icp-ledger", "itertools 0.12.1", - "prost 0.13.4", + "prost 0.13.5", "serde", "serde_bytes", "strum", @@ -10404,7 +10684,7 @@ name = "ic-nns-governance-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -10421,9 +10701,8 @@ dependencies = [ "hex", "hex-literal", "ic-base-types", - "ic-crypto-getrandom-for-wasm", - "ic-crypto-secp256k1", "ic-crypto-sha2", + "ic-dummy-getrandom-for-wasm", "ic-nervous-system-common", "ic-nervous-system-common-build-metadata", "ic-nns-common", @@ -10433,10 +10712,11 @@ dependencies = [ "ic-nns-gtc-protobuf-generator", "ic-nns-test-utils", "ic-nns-test-utils-macros", + "ic-secp256k1", "ic-test-utilities-compare-dirs", "icp-ledger", "lazy_static", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "serde", "sha3", @@ -10452,7 +10732,7 @@ name = "ic-nns-gtc-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -10478,10 +10758,10 @@ dependencies = [ "hex", "ic-base-types", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-crypto-sha2", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics-encoder", "ic-nervous-system-clients", "ic-nervous-system-common", @@ -10506,7 +10786,7 @@ dependencies = [ "maplit", "on_wire", "pretty_assertions", - "prost 0.13.4", + "prost 0.13.5", "registry-canister", "serde", "serde_bytes", @@ -10521,7 +10801,7 @@ dependencies = [ "async-trait", "candid", "ic-base-types", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-nervous-system-clients", "ic-nns-constants", "serde", @@ -10532,7 +10812,7 @@ name = "ic-nns-handler-root-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -10541,7 +10821,7 @@ version = "0.9.0" dependencies = [ "candid", "canister-test", - "clap 4.5.27", + "clap 4.5.29", "ic-base-types", "ic-canister-client", "ic-interfaces-registry", @@ -10555,7 +10835,7 @@ dependencies = [ "ic-sys", "ic-test-identity", "icp-ledger", - "prost 0.13.4", + "prost 0.13.5", "tempfile", "tokio", "url", @@ -10582,18 +10862,18 @@ dependencies = [ "ic-canister-client-sender", "ic-canisters-http-types", "ic-cbor", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-cdk-timers", "ic-certificate-verification", - "ic-certification 3.0.2", + "ic-certification 3.0.3", "ic-config", "ic-crypto", "ic-crypto-sha2", "ic-error-types", "ic-ledger-core", "ic-limits", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-clients", "ic-nervous-system-common", "ic-nervous-system-common-test-keys", @@ -10638,7 +10918,7 @@ dependencies = [ "pocket-ic", "pretty_assertions", "prometheus-parse", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "registry-canister", "rustc-hash 1.1.0", @@ -10660,7 +10940,6 @@ dependencies = [ "canister-test", "cycles-minting-canister", "dfn_candid", - "dfn_core", "dfn_http", "dfn_json", "dfn_protobuf", @@ -10678,7 +10957,7 @@ dependencies = [ "ic-crypto-test-utils-reproducible-rng", "ic-crypto-utils-ni-dkg", "ic-icrc1", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-clients", "ic-nervous-system-common", "ic-nervous-system-common-test-keys", @@ -10714,7 +10993,7 @@ dependencies = [ "num-traits", "on_wire", "prometheus-parse", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "registry-canister", "serde", @@ -10781,7 +11060,7 @@ dependencies = [ "quinn", "quinn-udp", "rcgen", - "rustls 0.23.21", + "rustls 0.23.23", "serde", "slog", "tempfile", @@ -10830,7 +11109,7 @@ dependencies = [ "anyhow", "assert_matches", "base64 0.13.1", - "clap 4.5.27", + "clap 4.5.29", "fs_extra", "ic-config", "ic-crypto-node-key-generation", @@ -10842,7 +11121,7 @@ dependencies = [ "ic-interfaces-state-manager", "ic-limits", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-protobuf", "ic-registry-client", @@ -10859,7 +11138,7 @@ dependencies = [ "json5", "maplit", "pretty_assertions", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "reqwest 0.12.12", "serde", @@ -10882,7 +11161,7 @@ dependencies = [ "ic-protobuf-generator", "ic-test-utilities-compare-dirs", "maplit", - "prost 0.13.4", + "prost 0.13.5", "serde", "serde_json", "slog", @@ -10894,7 +11173,7 @@ name = "ic-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -10943,10 +11222,10 @@ dependencies = [ "ic-types-test-utils", "phantom_newtype", "prometheus", - "prost 0.13.4", + "prost 0.13.5", "quinn", "rstest", - "rustls 0.23.21", + "rustls 0.23.23", "slog", "socket2 0.5.8", "static_assertions", @@ -10978,7 +11257,7 @@ name = "ic-recovery" version = "0.9.0" dependencies = [ "base64 0.13.1", - "clap 4.5.27", + "clap 4.5.29", "futures", "hex", "ic-artifact-pool", @@ -10990,7 +11269,7 @@ dependencies = [ "ic-http-utils", "ic-interfaces", "ic-interfaces-registry", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-protobuf", "ic-registry-client", @@ -11007,7 +11286,7 @@ dependencies = [ "ic-test-utilities-tmpdir", "ic-test-utilities-types", "ic-types", - "prost 0.13.4", + "prost 0.13.5", "reqwest 0.12.12", "serde", "serde_cbor", @@ -11028,7 +11307,7 @@ version = "0.9.0" dependencies = [ "anyhow", "base64 0.13.1", - "clap 4.5.27", + "clap 4.5.29", "ic-base-types", "ic-crypto-sha2", "ic-crypto-utils-threshold-sig-der", @@ -11042,7 +11321,7 @@ dependencies = [ "ic-registry-provisional-whitelist", "ic-registry-subnet-type", "ic-types", - "prost 0.13.4", + "prost 0.13.5", "serde", "serde_json", "tempfile", @@ -11065,7 +11344,7 @@ dependencies = [ name = "ic-registry-canister-client" version = "0.9.0" dependencies = [ - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-interfaces-registry", "ic-registry-keys", "ic-types", @@ -11077,7 +11356,7 @@ version = "0.9.0" dependencies = [ "anyhow", "candid", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-interfaces-registry", "ic-nns-common", "ic-nns-constants", @@ -11122,7 +11401,7 @@ dependencies = [ "ic-base-types", "ic-interfaces-registry", "ic-limits", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-protobuf", "ic-registry-client-fake", "ic-registry-common-proto", @@ -11142,7 +11421,7 @@ version = "0.9.0" dependencies = [ "ic-registry-common-proto-generator", "ic-test-utilities-compare-dirs", - "prost 0.13.4", + "prost 0.13.5", "tempfile", ] @@ -11151,7 +11430,7 @@ name = "ic-registry-common-proto-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -11160,7 +11439,7 @@ version = "0.9.0" dependencies = [ "candid", "ic-base-types", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-types", "rand 0.8.5", "serde", @@ -11196,7 +11475,7 @@ dependencies = [ "ic-registry-local-store-artifacts", "ic-sys", "ic-types", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "tempfile", ] @@ -11219,7 +11498,7 @@ dependencies = [ "ic-registry-transport", "ic-types", "leb128", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "serde", "tree-deserializer", @@ -11270,7 +11549,7 @@ dependencies = [ name = "ic-registry-replicator" version = "0.9.0" dependencies = [ - "clap 4.5.27", + "clap 4.5.29", "ic-config", "ic-crypto-utils-threshold-sig-der", "ic-http-endpoints-metrics", @@ -11286,7 +11565,7 @@ dependencies = [ "ic-registry-routing-table", "ic-types", "prometheus", - "prost 0.13.4", + "prost 0.13.5", "slog", "tempfile", "tokio", @@ -11310,7 +11589,7 @@ name = "ic-registry-subnet-features" version = "0.9.0" dependencies = [ "candid", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-protobuf", "serde", ] @@ -11337,7 +11616,7 @@ dependencies = [ "ic-registry-keys", "ic-registry-transport-protobuf-generator", "ic-test-utilities-compare-dirs", - "prost 0.13.4", + "prost 0.13.5", "serde", "tempfile", ] @@ -11347,7 +11626,7 @@ name = "ic-registry-transport-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -11355,7 +11634,7 @@ name = "ic-replay" version = "0.9.0" dependencies = [ "candid", - "clap 4.5.27", + "clap 4.5.29", "hex", "ic-artifact-pool", "ic-canister-client", @@ -11391,7 +11670,7 @@ dependencies = [ "ic-test-utilities-types", "ic-types", "icp-ledger", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "serde", "serde_json", @@ -11409,7 +11688,7 @@ version = "0.9.0" dependencies = [ "assert_cmd", "canister-test", - "clap 4.5.27", + "clap 4.5.29", "criterion", "hex", "ic-artifact-pool", @@ -11433,7 +11712,7 @@ dependencies = [ "ic-interfaces-registry-mocks", "ic-interfaces-state-manager", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-messaging", "ic-metrics", "ic-pprof", @@ -11526,7 +11805,7 @@ dependencies = [ "ic-interfaces", "ic-interfaces-registry", "ic-interfaces-state-manager", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-prep", "ic-protobuf", @@ -11546,7 +11825,7 @@ dependencies = [ "ic-types", "ic-utils 0.9.0", "maplit", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "slog", "slog-scope", @@ -11573,14 +11852,14 @@ dependencies = [ "ic-btc-replica-types", "ic-certification-version", "ic-config", - "ic-crypto-ed25519", "ic-crypto-sha2", "ic-crypto-test-utils-keys", + "ic-ed25519", "ic-error-types", "ic-interfaces", "ic-limits", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-protobuf", "ic-registry-routing-table", @@ -11602,10 +11881,11 @@ dependencies = [ "libc", "maplit", "nix 0.24.3", + "num-traits", "phantom_newtype", "prometheus", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rand_chacha 0.3.1", "rayon", @@ -11623,9 +11903,9 @@ dependencies = [ [[package]] name = "ic-representation-independent-hash" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3643f12824280580d31e47d380f1be23abee29944a1430c3ed22b164ac8e68db" +checksum = "c2800ba4910f21d9e1cb7b6ecbbbb0f76074bd2e127b4688c57d0936206caa6e" dependencies = [ "leb128", "sha2 0.10.8", @@ -11633,9 +11913,9 @@ dependencies = [ [[package]] name = "ic-response-verification" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b97514fada84797baf61a6a29f1c71695798c2628cb6013d97a5dd6ecc26df7" +checksum = "9dda1e3e44089054b2dd05c49467cda769d08df7862c4235c3d8869f8a3f9f19" dependencies = [ "base64 0.22.1", "candid", @@ -11644,7 +11924,7 @@ dependencies = [ "http 1.2.0", "ic-cbor", "ic-certificate-verification", - "ic-certification 3.0.2", + "ic-certification 3.0.3", "ic-http-certification", "ic-representation-independent-hash", "leb128", @@ -11665,17 +11945,17 @@ dependencies = [ "async-trait", "base64 0.13.1", "candid", - "clap 4.5.27", + "clap 4.5.29", "dfn_candid", "dfn_protobuf", "futures", "hex", "ic-agent", "ic-base-types", - "ic-crypto-ed25519", "ic-crypto-sha2", "ic-crypto-tree-hash", "ic-crypto-utils-threshold-sig-der", + "ic-ed25519", "ic-icp-rosetta-client", "ic-icp-rosetta-runner", "ic-icrc1", @@ -11707,7 +11987,7 @@ dependencies = [ "pocket-ic", "prometheus", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rand_chacha 0.3.1", "registry-canister", @@ -11755,6 +12035,28 @@ dependencies = [ "url", ] +[[package]] +name = "ic-secp256k1" +version = "0.1.0" +dependencies = [ + "bip32 0.5.3", + "bitcoin 0.28.2", + "hex", + "hex-literal", + "hmac", + "k256 0.13.4", + "lazy_static", + "num-bigint 0.4.6", + "pem 1.1.1", + "rand 0.8.5", + "rand_chacha 0.3.1", + "secp256k1 0.22.2", + "sha2 0.10.8", + "simple_asn1", + "wycheproof", + "zeroize", +] + [[package]] name = "ic-sender-canister" version = "0.9.0" @@ -11762,7 +12064,7 @@ dependencies = [ "candid", "candid_parser", "futures", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "serde", ] @@ -11790,7 +12092,7 @@ dependencies = [ "assert_matches", "hex", "ic-canister-sig-creation", - "ic-certification 3.0.2", + "ic-certification 3.0.3", "ic-crypto-internal-types", "ic-crypto-test-utils-canister-sigs", "ic-crypto-test-utils-reproducible-rng", @@ -11837,14 +12139,15 @@ dependencies = [ "base64 0.13.1", "candid", "candid-utils", - "clap 4.5.27", + "clap 4.5.29", "cycles-minting-canister", + "dfx-core", "futures", "hex", "ic-agent", "ic-base-types", "ic-crypto-sha2", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-agent", "ic-nervous-system-common", "ic-nervous-system-common-test-keys", @@ -11869,6 +12172,7 @@ dependencies = [ "tempfile", "thiserror 2.0.11", "tokio", + "url", ] [[package]] @@ -11883,7 +12187,7 @@ dependencies = [ "canbench-rs", "candid", "candid_parser", - "clap 4.5.27", + "clap 4.5.29", "comparable", "futures", "hex", @@ -11892,13 +12196,13 @@ dependencies = [ "ic-canister-log 0.2.0", "ic-canister-profiler", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-cdk-timers", "ic-crypto-sha2", "ic-icrc1-ledger", "ic-ledger-core", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics-encoder", "ic-nervous-system-canisters", "ic-nervous-system-clients", @@ -11931,13 +12235,14 @@ dependencies = [ "icp-ledger", "icrc-ledger-client", "icrc-ledger-types", + "itertools 0.12.1", "lazy_static", "maplit", "num-traits", "pretty_assertions", "proptest 1.6.0", - "prost 0.13.4", - "prost-build 0.13.4", + "prost 0.13.5", + "prost-build 0.13.5", "rand 0.8.5", "rand_chacha 0.3.1", "rust_decimal", @@ -11958,7 +12263,7 @@ version = "0.9.0" dependencies = [ "bytes", "candid", - "clap 4.5.27", + "clap 4.5.29", "comparable", "ic-base-types", "ic-nervous-system-proto", @@ -11968,7 +12273,7 @@ dependencies = [ "ic-utils 0.9.0", "icp-ledger", "itertools 0.12.1", - "prost 0.13.4", + "prost 0.13.5", "serde", "serde_bytes", "strum", @@ -12002,7 +12307,7 @@ name = "ic-sns-governance-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -12014,7 +12319,7 @@ dependencies = [ "cycles-minting-canister", "futures", "ic-base-types", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-nervous-system-common", "ic-nervous-system-initial-supply", "ic-nervous-system-runtime", @@ -12055,7 +12360,7 @@ dependencies = [ "lazy_static", "maplit", "num-traits", - "prost 0.13.4", + "prost 0.13.5", "serde", "serde_yaml", "tempfile", @@ -12066,7 +12371,7 @@ name = "ic-sns-init-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -12089,7 +12394,7 @@ dependencies = [ "ic-icrc1-ledger", "ic-ledger-canister-core", "ic-ledger-core", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-clients", "ic-nervous-system-common", "ic-nervous-system-common-test-keys", @@ -12122,7 +12427,7 @@ dependencies = [ "pretty-bytes", "pretty_assertions", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rust_decimal", "rust_decimal_macros", @@ -12146,10 +12451,10 @@ dependencies = [ "ic-base-types", "ic-canister-log 0.2.0", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-cdk-timers", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics-encoder", "ic-nervous-system-clients", "ic-nervous-system-common", @@ -12162,7 +12467,7 @@ dependencies = [ "ic-test-utilities-compare-dirs", "icrc-ledger-types", "maplit", - "prost 0.13.4", + "prost 0.13.5", "serde", "tempfile", "tokio", @@ -12173,7 +12478,7 @@ name = "ic-sns-root-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -12192,8 +12497,8 @@ dependencies = [ "ic-base-types", "ic-canister-log 0.2.0", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-cdk-timers", "ic-ledger-core", "ic-metrics-encoder", @@ -12217,7 +12522,7 @@ dependencies = [ "maplit", "pretty_assertions", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "rust_decimal", "rust_decimal_macros", "serde", @@ -12236,7 +12541,7 @@ dependencies = [ "ic-base-types", "ic-nervous-system-proto", "ic-utils 0.9.0", - "prost 0.13.4", + "prost 0.13.5", "serde", "serde_bytes", ] @@ -12246,7 +12551,7 @@ name = "ic-sns-swap-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -12268,7 +12573,7 @@ dependencies = [ "ic-icrc1-ledger", "ic-ledger-canister-core", "ic-ledger-core", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-clients", "ic-nervous-system-common", "ic-nervous-system-common-test-keys", @@ -12291,7 +12596,7 @@ dependencies = [ "maplit", "num-traits", "on_wire", - "prost 0.13.4", + "prost 0.13.5", "tokio", ] @@ -12303,18 +12608,16 @@ dependencies = [ "candid", "candid_parser", "canister-test", - "dfn_candid", - "dfn_core", - "dfn_http_metrics", "futures", "hex", "ic-base-types", - "ic-cdk 0.16.0", + "ic-canisters-http-types", + "ic-cdk 0.17.1", "ic-crypto-sha2", "ic-icrc1", "ic-icrc1-ledger", "ic-interfaces-registry", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics-encoder", "ic-nervous-system-clients", "ic-nervous-system-common", @@ -12342,7 +12645,7 @@ dependencies = [ "icrc-ledger-types", "maplit", "pretty_assertions", - "prost 0.13.4", + "prost 0.13.5", "registry-canister", "serde", "serde_bytes", @@ -12356,7 +12659,7 @@ name = "ic-sns-wasm-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -12373,10 +12676,10 @@ name = "ic-starter" version = "0.9.0" dependencies = [ "anyhow", - "clap 4.5.27", + "clap 4.5.29", "ic-config", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-prep", "ic-protobuf", "ic-registry-provisional-whitelist", @@ -12398,7 +12701,7 @@ dependencies = [ "ic-config", "ic-interfaces", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-protobuf", "ic-replicated-state", @@ -12414,7 +12717,7 @@ dependencies = [ "libc", "prometheus", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "scoped_threadpool", "slog", ] @@ -12425,7 +12728,7 @@ version = "0.9.0" dependencies = [ "candid", "ciborium", - "clap 4.5.27", + "clap 4.5.29", "hex", "ic-artifact-pool", "ic-base-types", @@ -12434,14 +12737,13 @@ dependencies = [ "ic-config", "ic-consensus", "ic-consensus-utils", - "ic-crypto-ed25519", "ic-crypto-iccsa", "ic-crypto-interfaces-sig-verification", - "ic-crypto-secp256k1", "ic-crypto-test-utils-ni-dkg", "ic-crypto-tree-hash", "ic-crypto-utils-threshold-sig-der", "ic-cycles-account-manager", + "ic-ed25519", "ic-error-types", "ic-execution-environment", "ic-http-endpoints-public", @@ -12453,7 +12755,7 @@ dependencies = [ "ic-interfaces-state-manager", "ic-limits", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-messaging", "ic-metrics", "ic-protobuf", @@ -12466,6 +12768,7 @@ dependencies = [ "ic-registry-subnet-features", "ic-registry-subnet-type", "ic-replicated-state", + "ic-secp256k1", "ic-state-layout", "ic-state-manager", "ic-test-state-machine-client", @@ -12518,7 +12821,7 @@ dependencies = [ "ic-interfaces-certified-stream-store", "ic-interfaces-state-manager", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-protobuf", "ic-registry-routing-table", @@ -12543,10 +12846,10 @@ dependencies = [ "ic-wasm-types", "maplit", "nix 0.24.3", - "parking_lot 0.12.3", + "parking_lot", "prometheus", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rand_chacha 0.3.1", "scoped_threadpool", @@ -12582,7 +12885,7 @@ dependencies = [ "ic-types-test-utils", "mockall", "prometheus", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "slog", "thiserror 2.0.11", @@ -12597,7 +12900,7 @@ dependencies = [ name = "ic-state-tool" version = "0.9.0" dependencies = [ - "clap 4.5.27", + "clap 4.5.29", "hex", "ic-config", "ic-logger", @@ -12612,7 +12915,7 @@ dependencies = [ "ic-sys", "ic-types", "ic-utils 0.9.0", - "prost 0.13.4", + "prost 0.13.5", "slog", "slog-term", "tempfile", @@ -12622,7 +12925,7 @@ dependencies = [ name = "ic-subnet-splitting" version = "0.9.0" dependencies = [ - "clap 4.5.27", + "clap 4.5.29", "hex", "ic-agent", "ic-base-types", @@ -12658,7 +12961,7 @@ dependencies = [ "libc", "nix 0.24.3", "phantom_newtype", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "tempfile", "thiserror 2.0.11", @@ -12680,7 +12983,7 @@ dependencies = [ "ic-interfaces", "ic-limits", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nns-constants", "ic-registry-routing-table", "ic-registry-subnet-features", @@ -12718,7 +13021,7 @@ dependencies = [ "candid", "canister-test", "chrono", - "clap 4.5.27", + "clap 4.5.29", "config_types", "crossbeam-channel", "cycles-minting-canister", @@ -12731,14 +13034,14 @@ dependencies = [ "http 1.2.0", "humantime", "humantime-serde", - "hyper 1.5.2", + "hyper 1.6.0", "ic-agent", "ic-artifact-pool", "ic-base-types", "ic-btc-interface", "ic-canister-client", "ic-canister-client-sender", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-certification 0.9.0", "ic-config", "ic-crypto-sha2", @@ -12753,7 +13056,7 @@ dependencies = [ "ic-interfaces-registry", "ic-ledger-core", "ic-limits", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-message", "ic-nervous-system-clients", "ic-nervous-system-common", @@ -12802,7 +13105,7 @@ dependencies = [ "icrc-ledger-types", "itertools 0.12.1", "json5", - "k256", + "k256 0.13.4", "k8s-openapi", "kube", "lazy_static", @@ -12817,7 +13120,7 @@ dependencies = [ "pem 1.1.1", "phantom_newtype", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rand_chacha 0.3.1", "rayon", @@ -12829,6 +13132,7 @@ dependencies = [ "rosetta-core", "rsa", "rust_decimal", + "schemars", "serde", "serde_bytes", "serde_cbor", @@ -12882,7 +13186,7 @@ name = "ic-test-identity" version = "0.9.0" dependencies = [ "ic-canister-client-sender", - "ic-crypto-ed25519", + "ic-ed25519", "ic-types", "lazy_static", "rand 0.8.5", @@ -12938,7 +13242,7 @@ dependencies = [ "ic-universal-canister", "lazy_static", "nix 0.24.3", - "parking_lot 0.12.3", + "parking_lot", "rand 0.8.5", "rusty-fork 0.3.0", "serde", @@ -12948,7 +13252,7 @@ dependencies = [ "tempfile", "tokio", "tower 0.5.2", - "wasmprinter 0.217.0", + "wasmprinter 0.217.1", "wat", ] @@ -12969,7 +13273,7 @@ dependencies = [ "ic-types", "mockall", "phantom_newtype", - "prost 0.13.4", + "prost 0.13.5", "serde", ] @@ -13009,7 +13313,7 @@ dependencies = [ "ic-interfaces-state-manager", "ic-limits", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-query-stats", "ic-registry-provisional-whitelist", @@ -13039,7 +13343,7 @@ dependencies = [ "ic-config", "ic-logger", "ic-protobuf", - "parking_lot 0.12.3", + "parking_lot", "serde_json", "slog", "slog-async", @@ -13083,6 +13387,7 @@ dependencies = [ "ic-interfaces", "ic-interfaces-registry", "ic-limits", + "ic-management-canister-types-private", "ic-protobuf", "ic-registry-client-fake", "ic-registry-keys", @@ -13098,7 +13403,7 @@ version = "0.9.0" dependencies = [ "assert_matches", "ic-protobuf", - "prost 0.13.4", + "prost 0.13.5", "serde", "serde_cbor", "serde_json", @@ -13111,7 +13416,7 @@ dependencies = [ "ic-base-types", "ic-btc-replica-types", "ic-interfaces", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-registry-routing-table", "ic-registry-subnet-features", "ic-registry-subnet-type", @@ -13147,7 +13452,7 @@ version = "0.9.0" dependencies = [ "bincode", "ic-canister-client-sender", - "ic-crypto-ed25519", + "ic-ed25519", "ic-types", "ic-types-test-utils", "rand 0.8.5", @@ -13173,7 +13478,7 @@ dependencies = [ "ic-ckbtc-minter", "ic-config", "ic-icrc1-ledger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-common-test-keys", "ic-nns-common", "ic-nns-constants", @@ -13189,7 +13494,7 @@ dependencies = [ "icp-ledger", "icrc-ledger-agent", "icrc-ledger-types", - "k256", + "k256 0.13.4", "rand 0.8.5", "rand_chacha 0.3.1", "registry-canister", @@ -13216,7 +13521,7 @@ dependencies = [ "ic-icrc1-index-ng", "ic-icrc1-ledger", "ic-ledger-suite-orchestrator", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-clients", "ic-nervous-system-common-test-keys", "ic-nervous-system-root", @@ -13277,7 +13582,7 @@ checksum = "979ee7bee5a67150a4c090fb012c93c294a528b4a867bad9a15cc6d01cb4227f" dependencies = [ "candid", "hex", - "ic-certification 3.0.2", + "ic-certification 3.0.3", "leb128", "serde", "serde_bytes", @@ -13308,7 +13613,7 @@ dependencies = [ "ic-error-types", "ic-exhaustive-derive", "ic-limits", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-protobuf", "ic-types-test-utils", "ic-utils 0.9.0", @@ -13320,7 +13625,7 @@ dependencies = [ "pretty_assertions", "proptest 1.6.0", "proptest-derive", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rand_chacha 0.3.1", "rusty-fork 0.3.0", @@ -13496,7 +13801,7 @@ dependencies = [ "base64 0.13.1", "hex", "ic-canister-client-sender", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-certification-test-utils", "ic-crypto-interfaces-sig-verification", "ic-crypto-standalone-sig-verifier", @@ -13522,8 +13827,8 @@ dependencies = [ "build-info-build", "candid", "canister-test", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-state-machine-tests", "ic-types", "ic-validator-ingress-message", @@ -13561,7 +13866,7 @@ dependencies = [ name = "ic-vetkd-utils" version = "0.1.0" dependencies = [ - "getrandom", + "getrandom 0.2.15", "hex", "ic_bls12_381", "lazy_static", @@ -13583,7 +13888,7 @@ checksum = "19fabaeecfe37f24b433c62489242fc54503d98d4cc8d0f9ef7544dfdfc0ddcb" dependencies = [ "anyhow", "candid", - "clap 4.5.27", + "clap 4.5.29", "libflate", "rustc-demangle", "serde", @@ -13596,9 +13901,9 @@ dependencies = [ name = "ic-wasm-transform" version = "0.9.0" dependencies = [ - "wasm-encoder 0.217.0", - "wasmparser 0.217.0", - "wasmprinter 0.217.0", + "wasm-encoder 0.217.1", + "wasmparser 0.217.1", + "wasmprinter 0.217.1", "wat", ] @@ -13623,7 +13928,7 @@ dependencies = [ "byte-unit", "candid", "chrono", - "clap 4.5.27", + "clap 4.5.29", "console 0.11.3", "futures", "hex", @@ -13632,7 +13937,7 @@ dependencies = [ "ic-config", "ic-crypto-sha2", "ic-http-endpoints-metrics", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-test-identity", "ic-types", @@ -13655,7 +13960,7 @@ dependencies = [ name = "ic-xnet-hyper" version = "0.9.0" dependencies = [ - "hyper 1.5.2", + "hyper 1.6.0", "hyper-rustls 0.27.5", "hyper-util", "ic-crypto-tls-interfaces", @@ -13673,7 +13978,7 @@ dependencies = [ "async-trait", "axum", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "ic-base-types", "ic-canonical-state", @@ -13771,8 +14076,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22c65787944f32af084dffd0c68c1e544237b76e215654ddea8cd9f527dd8b69" dependencies = [ "digest 0.10.7", - "ff", - "group", + "ff 0.13.0", + "group 0.13.0", "pairing", "rand_core 0.6.4", "subtle", @@ -13803,12 +14108,13 @@ dependencies = [ "ic-registry-subnet-type", "ic-system-test-driver", "itertools 0.12.1", - "k256", + "k256 0.13.4", "rand 0.8.5", "rand_chacha 0.3.1", "rate-limits-api", "regex", "registry-canister", + "salt-sharing-api", "slog", "tokio", "wat", @@ -13856,7 +14162,7 @@ dependencies = [ "ic-canister-client", "ic-config", "ic-http-utils", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-common-test-keys", "ic-nns-common", "ic-nns-constants", @@ -13870,7 +14176,7 @@ dependencies = [ "ic_consensus_threshold_sig_system_test_utils", "leb128", "openssh-keys", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "registry-canister", "reqwest 0.12.12", @@ -13894,7 +14200,7 @@ dependencies = [ "ic-agent", "ic-base-types", "ic-crypto-test-utils-reproducible-rng", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nns-constants", "ic-nns-governance-api", "ic-recovery", @@ -13908,7 +14214,7 @@ dependencies = [ "ic_consensus_system_test_catch_up_test_common", "ic_consensus_system_test_liveness_test_common", "ic_consensus_system_test_utils", - "k256", + "k256 0.13.4", "rand 0.8.5", "rand_chacha 0.3.1", "registry-canister", @@ -13934,7 +14240,7 @@ dependencies = [ "ic-canister-client", "ic-config", "ic-limits", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-message", "ic-nervous-system-common-test-keys", "ic-nns-common", @@ -13946,7 +14252,7 @@ dependencies = [ "ic-system-test-driver", "ic-types", "ic-types-test-utils", - "k256", + "k256 0.13.4", "registry-canister", "serde", "sha2 0.10.8", @@ -13968,7 +14274,7 @@ dependencies = [ "ic-types", "ic-universal-canister", "ic_consensus_system_test_utils", - "k256", + "k256 0.13.4", "rand 0.8.5", "reqwest 0.12.12", "serde_bytes", @@ -13995,7 +14301,7 @@ dependencies = [ name = "icp-config" version = "0.9.0" dependencies = [ - "clap 4.5.27", + "clap 4.5.29", "eyre", "ic-config", "ic-replicated-state", @@ -14021,7 +14327,7 @@ dependencies = [ "ic-base-types", "ic-canister-client-sender", "ic-canisters-http-types", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-crypto-sha2", "ic-icp-index", "ic-ledger-canister-core", @@ -14041,7 +14347,7 @@ dependencies = [ "on_wire", "pocket-ic", "proptest 1.6.0", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rand_chacha 0.3.1", "serde", @@ -14098,7 +14404,7 @@ dependencies = [ "hex", "ic-agent", "ic-cbor", - "ic-certification 3.0.2", + "ic-certification 3.0.3", "icrc-ledger-types", "leb128", ] @@ -14119,7 +14425,7 @@ version = "0.1.2" dependencies = [ "async-trait", "candid", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "icrc-ledger-client", ] @@ -14285,7 +14591,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -14377,7 +14683,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -14410,9 +14716,9 @@ dependencies = [ [[package]] name = "indicatif" -version = "0.17.9" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" dependencies = [ "console 0.15.10", "number_prefix", @@ -14452,7 +14758,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "692eda1cc790750b9f5a5e3921ef9c117fd5498b97cfacbc910693e5b29002dc" dependencies = [ "ahash 0.8.11", - "clap 4.5.27", + "clap 4.5.29", "crossbeam-channel", "crossbeam-utils", "dashmap 6.1.0", @@ -14472,7 +14778,7 @@ name = "inject-files" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.27", + "clap 4.5.29", "partition_tools", "tempfile", "tokio", @@ -14489,13 +14795,14 @@ dependencies = [ [[package]] name = "insta" -version = "1.42.0" +version = "1.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513e4067e16e69ed1db5ab56048ed65db32d10ba5fc1217f5393f8f17d8b5a5" +checksum = "71c1b125e30d93896b365e156c33dadfffab45ee8400afcbba4752f59de08a86" dependencies = [ "console 0.15.10", "linked-hash-map", "once_cell", + "pin-project", "similar", ] @@ -14520,7 +14827,7 @@ dependencies = [ "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-rustls 0.27.5", "hyper-util", "ring 0.17.8", @@ -14571,9 +14878,9 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f187290c0ed3dfe3f7c85bedddd320949b68fc86ca0ceb71adfb05b3dc3af2a" +checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" dependencies = [ "hermit-abi 0.4.0", "libc", @@ -14625,9 +14932,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] @@ -14737,6 +15044,19 @@ dependencies = [ "serde_json", ] +[[package]] +name = "k256" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +dependencies = [ + "cfg-if 1.0.0", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.8", + "sha3", +] + [[package]] name = "k256" version = "0.13.4" @@ -14744,11 +15064,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if 1.0.0", - "ecdsa", - "elliptic-curve", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", "once_cell", "sha2 0.10.8", - "signature", + "signature 2.2.0", ] [[package]] @@ -14759,6 +15079,7 @@ checksum = "19501afb943ae5806548bc3ebd7f3374153ca057a38f480ef30adfde5ef09755" dependencies = [ "base64 0.22.1", "chrono", + "schemars", "serde", "serde-value", "serde_json", @@ -14773,22 +15094,39 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "keyring" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f8fe839464d4e4b37d756d7e910063696af79a7e877282cb1825e4ec5f10833" +dependencies = [ + "byteorder", + "dbus-secret-service", + "linux-keyutils", + "log", + "openssl", + "security-framework 2.11.1", + "security-framework 3.2.0", + "windows-sys 0.59.0", +] + [[package]] name = "kube" -version = "0.93.1" +version = "0.94.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0365920075af1a2d23619c1ca801c492f2400157de42627f041a061716e76416" +checksum = "52ace78a62b361077505f2950bd48aa3e46596fb15350c9c993de15ddfa3cac5" dependencies = [ "k8s-openapi", "kube-client", "kube-core", + "kube-derive", ] [[package]] name = "kube-client" -version = "0.93.1" +version = "0.94.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d81336eb3a5b10a40c97a5a97ad66622e92bad942ce05ee789edd730aa4f8603" +checksum = "18ec0fcafd3add30b413b096a61d69b0a37f94d3f95b6f505a57ea3d27cec2a7" dependencies = [ "base64 0.22.1", "bytes", @@ -14799,7 +15137,7 @@ dependencies = [ "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-http-proxy", "hyper-rustls 0.27.5", "hyper-timeout", @@ -14808,7 +15146,7 @@ dependencies = [ "k8s-openapi", "kube-core", "pem 3.0.4", - "rustls 0.23.21", + "rustls 0.23.23", "rustls-pemfile 2.2.0", "secrecy", "serde", @@ -14824,19 +15162,34 @@ dependencies = [ [[package]] name = "kube-core" -version = "0.93.1" +version = "0.94.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cce373a74d787d439063cdefab0f3672860bd7bac01a38e39019177e764a0fe6" +checksum = "a50c095f051dada37740d883b6d47ad0430e95082140718073b773c8a70f231c" dependencies = [ "chrono", "form_urlencoded", "http 1.2.0", "k8s-openapi", + "schemars", "serde", + "serde-value", "serde_json", "thiserror 1.0.69", ] +[[package]] +name = "kube-derive" +version = "0.94.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7871f02c3c848b63fee3d2f2645bb4a3c0b68ee147badcddf1b0cf8fb5db87ad" +dependencies = [ + "darling 0.20.10", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.98", +] + [[package]] name = "kv_store" version = "0.9.0" @@ -14844,8 +15197,8 @@ dependencies = [ "base64 0.13.1", "candid", "flate2", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-certified-map", "serde", "serde_cbor", @@ -14865,7 +15218,7 @@ dependencies = [ "is-terminal", "itertools 0.10.5", "lalrpop-util 0.19.12", - "petgraph", + "petgraph 0.6.5", "regex", "regex-syntax 0.6.29", "string_cache", @@ -14885,7 +15238,7 @@ dependencies = [ "ena", "itertools 0.11.0", "lalrpop-util 0.20.2", - "petgraph", + "petgraph 0.6.5", "pico-args", "regex", "regex-syntax 0.8.5", @@ -14924,7 +15277,7 @@ checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" name = "launch-single-vm" version = "0.1.0" dependencies = [ - "clap 4.5.27", + "clap 4.5.29", "ic-prep", "ic-registry-subnet-type", "ic-system-test-driver", @@ -14959,6 +15312,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "ledger-archive-node-canister" version = "0.9.0" @@ -14972,7 +15331,7 @@ dependencies = [ "dfn_protobuf", "ic-base-types", "ic-canisters-http-types", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-ledger-canister-core", "ic-ledger-core", "ic-ledger-test-utils", @@ -15001,7 +15360,7 @@ dependencies = [ "ic-agent", "ic-base-types", "ic-canister-log 0.2.0", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-cdk-timers", "ic-error-types", "ic-icrc1", @@ -15033,7 +15392,7 @@ name = "ledger-canister-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -15106,6 +15465,16 @@ version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +[[package]] +name = "libdbus-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06085512b750d640299b79be4bad3d2fa90a9c00b1fd9e1b46364f66f0485c72" +dependencies = [ + "cc", + "pkg-config", +] + [[package]] name = "libflate" version = "2.1.0" @@ -15130,6 +15499,16 @@ dependencies = [ "rle-decode-fast", ] +[[package]] +name = "libloading" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" +dependencies = [ + "cc", + "winapi 0.3.9", +] + [[package]] name = "libloading" version = "0.8.6" @@ -15165,7 +15544,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.8.0", "libc", - "redox_syscall 0.5.8", + "redox_syscall", ] [[package]] @@ -15195,9 +15574,9 @@ dependencies = [ [[package]] name = "libssh2-sys" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" +checksum = "220e4f05ad4a218192533b300327f5150e809b54c4ec83b5a1d91833601811b9" dependencies = [ "cc", "libc", @@ -15244,7 +15623,7 @@ dependencies = [ "ic-nns-common", "ic-nns-constants", "ic-nns-test-utils", - "wasmprinter 0.217.0", + "wasmprinter 0.217.1", ] [[package]] @@ -15253,6 +15632,16 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-keyutils" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "761e49ec5fd8a5a463f9b84e877c373d888935b71c6be78f3767fe2ae6bed18e" +dependencies = [ + "bitflags 2.8.0", + "libc", +] + [[package]] name = "linux-raw-sys" version = "0.4.15" @@ -15296,8 +15685,8 @@ name = "load-simulator" version = "0.1.0" dependencies = [ "candid", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-cdk-timers", ] @@ -15382,7 +15771,7 @@ dependencies = [ "proc-macro2", "quote", "regex-syntax 0.6.29", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -15607,8 +15996,10 @@ dependencies = [ "ic-types", "lazy_static", "libc", + "memmap2", "nix 0.24.3", "proptest 1.6.0", + "rayon", "slog", "tempfile", ] @@ -15641,7 +16032,7 @@ dependencies = [ "dfn_candid", "ic-agent", "ic-base-types", - "ic-cdk 0.16.0", + "ic-cdk 0.18.0-alpha.1", "ic-registry-subnet-type", "ic-system-test-driver", "ic-types", @@ -15715,18 +16106,18 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" dependencies = [ "adler2", ] [[package]] name = "minreq" -version = "2.13.0" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36a8e50e917e18a37d500d27d40b7bc7d127e71c0c94fb2d83f43b4afd308390" +checksum = "da0c420feb01b9fb5061f8c8f452534361dd783756dcf38ec45191ce55e7a161" dependencies = [ "log", "serde", @@ -15741,7 +16132,7 @@ checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.48.0", ] @@ -15753,7 +16144,7 @@ checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -15786,7 +16177,7 @@ dependencies = [ "cfg-if 1.0.0", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -15802,7 +16193,7 @@ dependencies = [ "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "log", "rand 0.8.5", @@ -15826,7 +16217,7 @@ dependencies = [ "event-listener 5.4.0", "futures-util", "loom", - "parking_lot 0.12.3", + "parking_lot", "portable-atomic", "rustc_version", "smallvec", @@ -15922,6 +16313,7 @@ dependencies = [ "ic-types", "ic_consensus_system_test_utils", "slog", + "url", ] [[package]] @@ -15954,9 +16346,9 @@ dependencies = [ "dfn_candid", "ic-agent", "ic-base-types", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-limits", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-networking-subnet-update-workload", "ic-nns-governance-api", "ic-prep", @@ -15974,6 +16366,8 @@ dependencies = [ "rand_chacha 0.3.1", "registry-canister", "reqwest 0.12.12", + "serde", + "serde_json", "slog", "tokio", "url", @@ -15990,7 +16384,7 @@ name = "nft_exporter" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.27", + "clap 4.5.29", "serde", "serde_json", ] @@ -16079,7 +16473,7 @@ dependencies = [ "ic-ledger-core", "ic-limits", "ic-mainnet-nns-recovery", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-nervous-system-clients", "ic-nervous-system-common-test-keys", "ic-nns-common", @@ -16098,7 +16492,7 @@ dependencies = [ "nns_dapp", "num-traits", "on_wire", - "prost 0.13.4", + "prost 0.13.5", "registry-canister", "reqwest 0.12.12", "serde_cbor", @@ -16148,7 +16542,7 @@ dependencies = [ "ic-system-test-driver", "ic_consensus_system_test_utils", "indoc", - "k256", + "k256 0.13.4", "registry-canister", "slog", "tokio", @@ -16203,6 +16597,20 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint 0.4.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational 0.4.2", + "num-traits", +] + [[package]] name = "num-bigint" version = "0.2.6" @@ -16243,6 +16651,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -16291,6 +16708,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint 0.4.6", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -16329,7 +16757,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -16374,9 +16802,9 @@ version = "0.9.0" [[package]] name = "once_cell" -version = "1.20.2" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "oorandom" @@ -16428,20 +16856,56 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "openssl" +version = "0.10.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61cfb4e166a8bb8c9b55c500bc2308550148ece889be90f609377e58140f42c6" +dependencies = [ + "bitflags 2.8.0", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-src" +version = "300.4.2+3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "168ce4e058f975fe43e89d9ccf78ca668601887ae736090aacc23ae353c298e2" +dependencies = [ + "cc", +] [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "8b22d5b84be05a8d6947c7cb71f7c849aa0f112acd4bf51c2a7c1c988ac0a9dc" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] @@ -16492,7 +16956,7 @@ dependencies = [ "opentelemetry 0.27.1", "opentelemetry-proto", "opentelemetry_sdk 0.27.1", - "prost 0.13.4", + "prost 0.13.5", "thiserror 1.0.69", "tokio", "tonic", @@ -16520,7 +16984,7 @@ checksum = "a6e05acbfada5ec79023c85368af14abd0b307c015e9064d249b2a950ef459a6" dependencies = [ "opentelemetry 0.27.1", "opentelemetry_sdk 0.27.1", - "prost 0.13.4", + "prost 0.13.5", "tonic", ] @@ -16621,13 +17085,13 @@ dependencies = [ "async-trait", "backoff", "candid", - "clap 4.5.27", + "clap 4.5.29", "env-file-reader", "exec", "get_if_addrs", "hex", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-rustls 0.27.5", "hyper-util", "ic-canister-client", @@ -16649,7 +17113,7 @@ dependencies = [ "ic-interfaces", "ic-interfaces-registry", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-nns-constants", "ic-protobuf", @@ -16675,7 +17139,7 @@ dependencies = [ "mockall", "nix 0.24.3", "prometheus", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "serde", "serde_cbor", @@ -16757,8 +17221,8 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" dependencies = [ - "ecdsa", - "elliptic-curve", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", "primeorder", "sha2 0.10.8", ] @@ -16769,33 +17233,35 @@ version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" dependencies = [ - "group", + "group 0.13.0", ] [[package]] name = "parity-scale-codec" -version = "3.6.12" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" dependencies = [ "arrayvec 0.7.6", "bitvec", "byte-slice-cast", + "const_format", "impl-trait-for-tuples", "parity-scale-codec-derive", + "rustversion", "serde", ] [[package]] name = "parity-scale-codec-derive" -version = "3.6.12" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.98", ] [[package]] @@ -16804,17 +17270,6 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.6", -] - [[package]] name = "parking_lot" version = "0.12.3" @@ -16822,21 +17277,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", - "parking_lot_core 0.9.10", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall 0.2.16", - "smallvec", - "winapi 0.3.9", + "parking_lot_core", ] [[package]] @@ -16847,7 +17288,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if 1.0.0", "libc", - "redox_syscall 0.5.8", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] @@ -16872,12 +17313,32 @@ dependencies = [ "which 6.0.3", ] +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "paste" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + [[package]] name = "pbkdf2" version = "0.12.2" @@ -16935,6 +17396,15 @@ dependencies = [ "serde", ] +[[package]] +name = "pem-rfc7468" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" +dependencies = [ + "base64ct", +] + [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -16981,7 +17451,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -17001,17 +17471,27 @@ version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8151168a80801131f6e0e79d6c84fa337ccd2493c99e59de027354c3e6fca0b" dependencies = [ - "pest", - "pest_meta", + "pest", + "pest_meta", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset 0.4.2", + "indexmap 2.7.1", ] [[package]] name = "petgraph" -version = "0.6.5" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" dependencies = [ - "fixedbitset", + "fixedbitset 0.5.7", "indexmap 2.7.1", ] @@ -17085,7 +17565,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -17114,22 +17594,22 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2ec53ad785f4d35dac0adea7f7dc6f1bb277ad84a680c7afefeae05d1f5916" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -17172,9 +17652,29 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" dependencies = [ - "der", - "pkcs8", - "spki", + "der 0.7.9", + "pkcs8 0.10.2", + "spki 0.7.3", +] + +[[package]] +name = "pkcs11" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aca6d67e4c8613bfe455599d0233d00735f85df2001f6bfd9bb7ac0496b10af" +dependencies = [ + "libloading 0.5.2", + "num-bigint 0.2.6", +] + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der 0.6.1", + "spki 0.6.0", ] [[package]] @@ -17183,8 +17683,8 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der", - "spki", + "der 0.7.9", + "spki 0.7.3", ] [[package]] @@ -17244,11 +17744,11 @@ dependencies = [ "ed25519-dalek", "flate2", "hex", - "ic-cdk 0.16.0", - "ic-certification 3.0.2", + "ic-cdk 0.17.1", + "ic-certification 3.0.3", "ic-error-types", "ic-transport-types", - "k256", + "k256 0.13.4", "lazy_static", "reqwest 0.12.12", "schemars", @@ -17285,7 +17785,7 @@ dependencies = [ "bitcoincore-rpc", "bytes", "candid", - "clap 4.5.27", + "clap 4.5.29", "ctrlc", "flate2", "form_urlencoded", @@ -17294,7 +17794,7 @@ dependencies = [ "hex", "http 1.2.0", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "ic-agent", "ic-bn-lib", @@ -17302,12 +17802,12 @@ dependencies = [ "ic-btc-adapter", "ic-btc-interface", "ic-canister-sandbox-backend-lib", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-config", - "ic-crypto-ed25519", "ic-crypto-iccsa", "ic-crypto-sha2", "ic-crypto-utils-threshold-sig-der", + "ic-ed25519", "ic-error-types", "ic-http-endpoints-public", "ic-http-gateway", @@ -17319,7 +17819,7 @@ dependencies = [ "ic-interfaces-registry", "ic-interfaces-state-manager", "ic-logger", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics", "ic-nns-constants", "ic-protobuf", @@ -17367,7 +17867,7 @@ name = "pocket-ic-test-canister" version = "0.9.0" dependencies = [ "candid", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "serde", "serde_bytes", ] @@ -17398,6 +17898,18 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "polyval" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + [[package]] name = "portable-atomic" version = "1.10.0" @@ -17438,7 +17950,7 @@ dependencies = [ "log", "nix 0.26.4", "once_cell", - "parking_lot 0.12.3", + "parking_lot", "prost 0.12.6", "prost-build 0.12.6", "prost-derive 0.12.6", @@ -17455,7 +17967,7 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -17544,7 +18056,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -17553,7 +18065,7 @@ version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" dependencies = [ - "elliptic-curve", + "elliptic-curve 0.13.8", ] [[package]] @@ -17677,7 +18189,7 @@ dependencies = [ "lazy_static", "libc", "memchr", - "parking_lot 0.12.3", + "parking_lot", "procfs 0.16.0", "protobuf", "thiserror 1.0.69", @@ -17743,7 +18255,7 @@ checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -17758,12 +18270,12 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c0fef6c4230e4ccf618a35c59d7ede15dea37de8427500f50aff708806e42ec" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" dependencies = [ "bytes", - "prost-derive 0.13.4", + "prost-derive 0.13.5", ] [[package]] @@ -17778,32 +18290,32 @@ dependencies = [ "log", "multimap", "once_cell", - "petgraph", + "petgraph 0.6.5", "prettyplease", "prost 0.12.6", "prost-types 0.12.6", "regex", - "syn 2.0.96", + "syn 2.0.98", "tempfile", ] [[package]] name = "prost-build" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" +checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" dependencies = [ "heck 0.5.0", - "itertools 0.13.0", + "itertools 0.14.0", "log", "multimap", "once_cell", - "petgraph", + "petgraph 0.7.1", "prettyplease", - "prost 0.13.4", - "prost-types 0.13.4", + "prost 0.13.5", + "prost-types 0.13.5", "regex", - "syn 2.0.96", + "syn 2.0.98", "tempfile", ] @@ -17817,20 +18329,20 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "prost-derive" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -17844,11 +18356,11 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2f1e56baa61e93533aebc21af4d2134b70f66275e0fcdf3cbe43d77ff7e8fc" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" dependencies = [ - "prost 0.13.4", + "prost 0.13.5", ] [[package]] @@ -17862,9 +18374,9 @@ name = "proxy_canister" version = "0.1.0" dependencies = [ "candid", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", - "ic-management-canister-types", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", + "ic-management-canister-types-private", "serde", ] @@ -17915,13 +18427,14 @@ dependencies = [ [[package]] name = "pulley-interpreter" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8324e531de91a3c25021a30fb7862d39cc516b61fbb801176acb5ff279ea887b" +checksum = "62d95f8575df49a2708398182f49a888cf9dc30210fb1fd2df87c889edcee75d" dependencies = [ "cranelift-bitset", "log", "sptr", + "wasmtime-math", ] [[package]] @@ -17934,7 +18447,7 @@ dependencies = [ "libc", "once_cell", "raw-cpuid", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "web-sys", "winapi 0.3.9", ] @@ -17973,8 +18486,8 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.1.0", - "rustls 0.23.21", + "rustc-hash 2.1.1", + "rustls 0.23.23", "socket2 0.5.8", "thiserror 2.0.11", "tokio", @@ -17988,11 +18501,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", - "getrandom", + "getrandom 0.2.15", "rand 0.8.5", "ring 0.17.8", - "rustc-hash 2.1.0", - "rustls 0.23.21", + "rustc-hash 2.1.1", + "rustls 0.23.23", "rustls-pki-types", "slab", "thiserror 2.0.11", @@ -18060,6 +18573,17 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.0", + "zerocopy 0.8.17", +] + [[package]] name = "rand_chacha" version = "0.1.1" @@ -18080,6 +18604,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.0", +] + [[package]] name = "rand_core" version = "0.3.1" @@ -18101,7 +18635,17 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b08f3c9802962f7e1b25113931d94f43ed9725bebc59db9d0c3e9a23b67e15ff" +dependencies = [ + "getrandom 0.3.1", + "zerocopy 0.8.17", ] [[package]] @@ -18242,9 +18786,9 @@ version = "0.9.0" dependencies = [ "anyhow", "candid", - "clap 4.5.27", + "clap 4.5.29", "ic-agent", - "k256", + "k256 0.13.4", "rate-limits-api", "regex", "serde", @@ -18279,11 +18823,11 @@ dependencies = [ "anyhow", "candid", "candid_parser", - "getrandom", + "getrandom 0.2.15", "ic-canister-log 0.2.0", "ic-canisters-http-types", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-cdk-timers", "ic-nns-constants", "ic-stable-structures", @@ -18307,7 +18851,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c1bb13e2dcfa2232ac6887157aad8d9b3fe4ca57f7c8d4938ff5ea9be742300" dependencies = [ "clocksource", - "parking_lot 0.12.3", + "parking_lot", "thiserror 1.0.69", ] @@ -18363,15 +18907,6 @@ dependencies = [ "rand_core 0.3.1", ] -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.5.8" @@ -18387,7 +18922,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.15", "libredox", "thiserror 1.0.69", ] @@ -18402,7 +18937,7 @@ dependencies = [ "bumpalo", "hashbrown 0.15.2", "log", - "rustc-hash 2.1.0", + "rustc-hash 2.1.1", "smallvec", ] @@ -18476,10 +19011,10 @@ dependencies = [ "dfn_core", "dfn_http_metrics", "futures", - "getrandom", + "getrandom 0.2.15", "ic-base-types", "ic-canister-client-sender", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-certified-map", "ic-config", "ic-crypto-node-key-generation", @@ -18491,7 +19026,7 @@ dependencies = [ "ic-crypto-utils-basic-sig", "ic-crypto-utils-ni-dkg", "ic-interfaces-registry", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-metrics-encoder", "ic-nervous-system-canisters", "ic-nervous-system-clients", @@ -18515,6 +19050,7 @@ dependencies = [ "ic-registry-subnet-type", "ic-registry-transport", "ic-replica-tests", + "ic-stable-structures", "ic-test-utilities", "ic-test-utilities-compare-dirs", "ic-test-utilities-types", @@ -18527,7 +19063,7 @@ dependencies = [ "leb128", "maplit", "on_wire", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "rand_distr", "registry-canister-protobuf-generator", @@ -18543,7 +19079,7 @@ name = "registry-canister-protobuf-generator" version = "0.9.0" dependencies = [ "ic-utils-rustfmt", - "prost-build 0.13.4", + "prost-build 0.13.5", ] [[package]] @@ -18572,6 +19108,8 @@ version = "0.9.0" dependencies = [ "anyhow", "candid", + "chrono", + "clap 4.5.29", "colored", "futures", "ic-agent", @@ -18586,6 +19124,7 @@ dependencies = [ "serde_json", "tempfile", "tokio", + "url", ] [[package]] @@ -18656,7 +19195,7 @@ dependencies = [ "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-rustls 0.27.5", "hyper-util", "ipnet", @@ -18668,7 +19207,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.21", + "rustls 0.23.23", "rustls-native-certs 0.8.1", "rustls-pemfile 2.2.0", "rustls-pki-types", @@ -18687,7 +19226,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 0.26.7", + "webpki-roots 0.26.8", "windows-registry", ] @@ -18716,11 +19255,22 @@ name = "response-payload-test" version = "0.9.0" dependencies = [ "candid", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "serde", ] +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac", + "zeroize", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -18763,7 +19313,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if 1.0.0", - "getrandom", + "getrandom 0.2.15", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -18863,8 +19413,8 @@ dependencies = [ "candid", "hex", "ic-agent", - "ic-crypto-ed25519", - "ic-crypto-secp256k1", + "ic-ed25519", + "ic-secp256k1", "ic-types", "icp-ledger", "icrc-ledger-types", @@ -18936,7 +19486,7 @@ dependencies = [ "icp-ledger", "lazy_static", "on_wire", - "prost 0.13.4", + "prost 0.13.5", "rand 0.8.5", "reqwest 0.12.12", "rosetta-core", @@ -18959,11 +19509,11 @@ dependencies = [ "num-integer", "num-traits", "pkcs1", - "pkcs8", + "pkcs8 0.10.2", "rand_core 0.6.4", "sha2 0.10.8", - "signature", - "spki", + "signature 2.2.0", + "spki 0.7.3", "subtle", "zeroize", ] @@ -18993,7 +19543,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.96", + "syn 2.0.98", "unicode-ident", ] @@ -19035,7 +19585,7 @@ dependencies = [ "dfn_macro", "ic-canister-client-sender", "ic-error-types", - "ic-management-canister-types", + "ic-management-canister-types-private", "ic-test-identity", "ic-test-utilities", "ic-types", @@ -19086,9 +19636,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustc-hex" @@ -19155,9 +19705,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.21" +version = "0.23.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" dependencies = [ "brotli 7.0.0", "brotli-decompressor", @@ -19192,7 +19742,7 @@ dependencies = [ "serde", "serde_json", "thiserror 2.0.11", - "webpki-roots 0.26.7", + "webpki-roots 0.26.8", "x509-parser", ] @@ -19241,9 +19791,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" dependencies = [ "web-time", ] @@ -19259,7 +19809,7 @@ dependencies = [ "jni", "log", "once_cell", - "rustls 0.23.21", + "rustls 0.23.23", "rustls-native-certs 0.7.3", "rustls-platform-verifier-android", "rustls-webpki 0.102.8", @@ -19328,9 +19878,38 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" + +[[package]] +name = "salt-sharing-api" +version = "0.9.0" +dependencies = [ + "candid", + "serde", +] + +[[package]] +name = "salt_sharing" +version = "0.9.0" +dependencies = [ + "candid", + "candid_parser", + "ic-canister-log 0.2.0", + "ic-canisters-http-types", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", + "ic-cdk-timers", + "ic-nns-constants", + "ic-stable-structures", + "prometheus", + "salt-sharing-api", + "serde", + "serde_cbor", + "serde_json", + "time", +] [[package]] name = "same-file" @@ -19362,7 +19941,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -19396,7 +19975,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -19466,16 +20045,30 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct 0.1.1", + "der 0.6.1", + "generic-array", + "pkcs8 0.9.0", + "subtle", + "zeroize", +] + [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct", - "der", + "base16ct 0.2.0", + "der 0.7.9", "generic-array", - "pkcs8", + "pkcs8 0.10.2", "subtle", "zeroize", ] @@ -19596,7 +20189,7 @@ checksum = "4eb30575f3638fc8f6815f448d50cb1a2e255b0897985c8c59f4d37b72a07b06" dependencies = [ "bitflags 2.8.0", "cssparser", - "derive_more 0.99.18", + "derive_more 0.99.19", "fxhash", "log", "new_debug_unreachable", @@ -19684,7 +20277,7 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -19695,14 +20288,14 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "serde_json" -version = "1.0.137" +version = "1.0.138" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" +checksum = "d434192e7da787e94a6ea7e9670b26a036d0ca41e0b7efb2676dd32bae872949" dependencies = [ "itoa", "memchr", @@ -19751,7 +20344,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -19774,7 +20367,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -19836,7 +20429,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -19866,7 +20459,7 @@ name = "setupos-disable-checks" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.27", + "clap 4.5.29", "indoc", "linux_kernel_command_line", "partition_tools", @@ -19880,7 +20473,7 @@ name = "setupos-inject-configuration" version = "0.1.0" dependencies = [ "anyhow", - "clap 4.5.27", + "clap 4.5.29", "config", "partition_tools", "serde", @@ -19896,7 +20489,7 @@ name = "setupos_tool" version = "1.0.0" dependencies = [ "anyhow", - "clap 4.5.27", + "clap 4.5.29", "config", "config_types", "deterministic_ips", @@ -19958,6 +20551,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + [[package]] name = "shlex" version = "1.3.0" @@ -19994,6 +20593,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + [[package]] name = "signature" version = "2.2.0" @@ -20189,7 +20798,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -20300,6 +20909,16 @@ dependencies = [ "lock_api", ] +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + [[package]] name = "spki" version = "0.7.3" @@ -20307,7 +20926,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der", + "der 0.7.9", ] [[package]] @@ -20318,14 +20937,14 @@ checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" [[package]] name = "ssh2" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7fe461910559f6d5604c3731d00d2aafc4a83d1665922e280f42f9a168d5455" +checksum = "2f84d13b3b8a0d4e91a2629911e951db1bb8671512f5c09d7d4ba34500ba68c8" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.8.0", "libc", "libssh2-sys", - "parking_lot 0.11.2", + "parking_lot", ] [[package]] @@ -20346,17 +20965,17 @@ name = "stable_structures" version = "0.9.0" dependencies = [ "candid", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-stable-structures", "serde", ] [[package]] name = "stacker" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799c883d55abdb5e98af1a7b3f23b9b6de8ecada0ecac058672d7635eb48ca7b" +checksum = "1d08feb8f695b465baed819b03c128dc23f57a694510ab1f06c77f763975685e" dependencies = [ "cc", "cfg-if 1.0.0", @@ -20371,9 +20990,9 @@ version = "0.9.0" dependencies = [ "candid", "canister-test", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", - "ic-management-canister-types", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", + "ic-management-canister-types-private", "ic-state-machine-tests", "ic-test-utilities", "ic-types", @@ -20410,26 +21029,25 @@ checksum = "9091b6114800a5f2141aee1d1b9d6ca3592ac062dc5decb3764ec5895a47b4eb" [[package]] name = "string_cache" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +checksum = "938d512196766101d333398efde81bc1f37b00cb42c2f8350e5df639f040bbbe" dependencies = [ "new_debug_unreachable", - "once_cell", - "parking_lot 0.12.3", - "phf_shared 0.10.0", + "parking_lot", + "phf_shared 0.11.3", "precomputed-hash", "serde", ] [[package]] name = "string_cache_codegen" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +checksum = "244292f3441c89febe5b5bdfbb6863aeaf4f64da810ea3050fd927b27b8d92ce" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", + "phf_generator 0.11.3", + "phf_shared 0.11.3", "proc-macro2", "quote", ] @@ -20455,7 +21073,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.2.0", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -20467,7 +21085,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.3.0", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -20478,7 +21096,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -20489,7 +21107,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -20511,7 +21129,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -20539,9 +21157,9 @@ checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" [[package]] name = "symbolic-common" -version = "12.13.3" +version = "12.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13a4dfe4bbeef59c1f32fc7524ae7c95b9e1de5e79a43ce1604e181081d71b0c" +checksum = "b6189977df1d6ec30c920647919d76f29fb8d8f25e8952e835b0fcda25e8f792" dependencies = [ "debugid", "memmap2", @@ -20551,9 +21169,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.13.3" +version = "12.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cf6a95abff97de4d7ff3473f33cacd38f1ddccad5c1feab435d6760300e3b6" +checksum = "d234917f7986498e7f62061438cee724bafb483fe84cfbe2486f68dce48240d7" dependencies = [ "rustc-demangle", "symbolic-common", @@ -20572,9 +21190,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.96" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -20626,7 +21244,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -20657,7 +21275,7 @@ dependencies = [ "anyhow", "async-trait", "axum", - "clap 4.5.27", + "clap 4.5.29", "http 1.2.0", "itertools 0.12.1", "reqwest 0.12.12", @@ -20688,7 +21306,7 @@ dependencies = [ "canister-test", "dfn_candid", "futures", - "ic-cdk 0.16.0", + "ic-cdk 0.17.1", "ic-system-test-driver", "slog", "xnet-test", @@ -20725,9 +21343,9 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.16" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" [[package]] name = "tarpc" @@ -20766,13 +21384,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.15.0" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +checksum = "38c246215d7d24f48ae091a2902398798e05d978b24315d6efbc00ede9a8bb91" dependencies = [ "cfg-if 1.0.0", "fastrand", - "getrandom", + "getrandom 0.3.1", "once_cell", "rustix", "windows-sys 0.59.0", @@ -20843,7 +21461,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta 0.2.0", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -20855,7 +21473,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta 0.3.0", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -20945,7 +21563,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -20956,7 +21574,7 @@ checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -21048,6 +21666,25 @@ dependencies = [ "time-core", ] +[[package]] +name = "tiny-bip39" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62cc94d358b5a1e84a5cb9109f559aa3c4d634d2b1b4de3d0fa4adc7c78e2861" +dependencies = [ + "anyhow", + "hmac", + "once_cell", + "pbkdf2 0.11.0", + "rand 0.8.5", + "rustc-hash 1.1.0", + "sha2 0.10.8", + "thiserror 1.0.69", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + [[package]] name = "tiny-keccak" version = "2.0.2" @@ -21116,9 +21753,9 @@ dependencies = [ [[package]] name = "tls_codec" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e78c9c330f8c85b2bae7c8368f2739157db9991235123aa1b15ef9502bfb6a" +checksum = "0de2e01245e2bb89d6f05801c564fa27624dbd7b1846859876c7dad82e90bf6b" dependencies = [ "tls_codec_derive", "zeroize", @@ -21126,13 +21763,13 @@ dependencies = [ [[package]] name = "tls_codec_derive" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" +checksum = "2d2e76690929402faae40aebdda620a2c0e25dd6d3b9afe48867dfd95991f4bd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -21145,7 +21782,7 @@ dependencies = [ "bytes", "libc", "mio 1.0.3", - "parking_lot 0.12.3", + "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2 0.5.8", @@ -21171,7 +21808,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -21213,7 +21850,7 @@ version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ - "rustls 0.23.21", + "rustls 0.23.23", "tokio", ] @@ -21306,9 +21943,9 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ "indexmap 2.7.1", "toml_datetime", @@ -21330,12 +21967,12 @@ dependencies = [ "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", - "prost 0.13.4", + "prost 0.13.5", "socket2 0.5.8", "tokio", "tokio-stream", @@ -21353,10 +21990,10 @@ checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" dependencies = [ "prettyplease", "proc-macro2", - "prost-build 0.13.4", - "prost-types 0.13.4", + "prost-build 0.13.5", + "prost-types 0.13.5", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -21527,7 +22164,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -21703,7 +22340,7 @@ dependencies = [ "ipconfig", "lazy_static", "lru-cache", - "parking_lot 0.12.3", + "parking_lot", "resolv-conf", "smallvec", "thiserror 1.0.69", @@ -21739,22 +22376,17 @@ dependencies = [ [[package]] name = "turmoil" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b20f35a8264406dd5afac69a541665e860e52fec3dcec4091a0e2a3ce7f2b75" +checksum = "3f4bf3407e4cded7fa5c1f8083ccc0f38fb58c2640ea3c45dacd26ee8b15a91d" dependencies = [ "bytes", - "futures", - "indexmap 1.9.3", + "indexmap 2.7.1", "rand 0.8.5", "rand_distr", "scoped-tls", "tokio", - "tokio-stream", - "tokio-test", - "tokio-util", "tracing", - "tracing-subscriber", ] [[package]] @@ -21789,11 +22421,11 @@ dependencies = [ [[package]] name = "ulid" -version = "1.1.4" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f294bff79170ed1c5633812aff1e565c35d993a36e757f9bc0accf5eec4e6045" +checksum = "ab82fc73182c29b02e2926a6df32f2241dbadb5cfc111fd595515b3598f46bb3" dependencies = [ - "rand 0.8.5", + "rand 0.9.0", "web-time", ] @@ -21817,9 +22449,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "a210d160f08b701c8721ba1c726c11662f877ea6b7094007e1ca9a1041945034" [[package]] name = "unicode-normalization" @@ -21959,11 +22591,11 @@ dependencies = [ [[package]] name = "uuid" -version = "1.12.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" +checksum = "ced87ca4be083373936a67f8de945faa23b6b42384bd5b64434850802c6dccd0" dependencies = [ - "getrandom", + "getrandom 0.3.1", "serde", ] @@ -22018,7 +22650,7 @@ dependencies = [ name = "vsock_guest" version = "1.0.0" dependencies = [ - "clap 4.5.27", + "clap 4.5.29", "vsock_lib", ] @@ -22054,9 +22686,9 @@ dependencies = [ [[package]] name = "wait-timeout" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" dependencies = [ "libc", ] @@ -22145,6 +22777,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.100" @@ -22167,7 +22808,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "wasm-bindgen-shared", ] @@ -22202,7 +22843,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -22227,32 +22868,32 @@ dependencies = [ [[package]] name = "wasm-encoder" -version = "0.217.0" +version = "0.217.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b88b0814c9a2b323a9b46c687e726996c255ac8b64aa237dd11c81ed4854760" +checksum = "10961fd76db420582926af70816dd205019d8152d9e51e1b939125dd1639f854" dependencies = [ "leb128", - "wasmparser 0.217.0", + "wasmparser 0.217.1", ] [[package]] name = "wasm-encoder" -version = "0.221.2" +version = "0.221.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17a3bd88f2155da63a1f2fcb8a56377a24f0b6dfed12733bb5f544e86f690c5" +checksum = "dc8444fe4920de80a4fe5ab564fff2ae58b6b73166b89751f8c6c93509da32e5" dependencies = [ "leb128", - "wasmparser 0.221.2", + "wasmparser 0.221.3", ] [[package]] name = "wasm-encoder" -version = "0.224.0" +version = "0.225.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7249cf8cb0c6b9cb42bce90c0a5feb276fbf963fa385ff3d818ab3d90818ed6" +checksum = "6f7eac0445cac73bcf09e6a97f83248d64356dccf9f2b100199769b6b42464e5" dependencies = [ - "leb128", - "wasmparser 0.224.0", + "leb128fmt", + "wasmparser 0.225.0", ] [[package]] @@ -22284,9 +22925,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.217.0" +version = "0.217.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca917a21307d3adf2b9857b94dd05ebf8496bdcff4437a9b9fb3899d3e6c74e7" +checksum = "65a5a0689975b9fd93c02f5400cfd9669858b99607e54e7b892c6080cba598bb" dependencies = [ "ahash 0.8.11", "bitflags 2.8.0", @@ -22298,9 +22939,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.221.2" +version = "0.221.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9845c470a2e10b61dd42c385839cdd6496363ed63b5c9e420b5488b77bd22083" +checksum = "d06bfa36ab3ac2be0dee563380147a5b81ba10dd8885d7fbbc9eb574be67d185" dependencies = [ "bitflags 2.8.0", "hashbrown 0.15.2", @@ -22311,9 +22952,9 @@ dependencies = [ [[package]] name = "wasmparser" -version = "0.224.0" +version = "0.225.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65881a664fdd43646b647bb27bf186ab09c05bf56779d40aed4c6dce47d423f5" +checksum = "36e5456165f81e64cb9908a0fe9b9d852c2c74582aa3fe2be3c2da57f937d3ae" dependencies = [ "bitflags 2.8.0", "indexmap 2.7.1", @@ -22322,31 +22963,31 @@ dependencies = [ [[package]] name = "wasmprinter" -version = "0.217.0" +version = "0.217.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dc568b3e0d47e8f96ea547c90790cfa783f0205160c40de894a427114185ce" +checksum = "324c6782d7b81c01625335d252653b26ea68e835ddb4aef4cb1ed3ea40ae3a49" dependencies = [ "anyhow", "termcolor", - "wasmparser 0.217.0", + "wasmparser 0.217.1", ] [[package]] name = "wasmprinter" -version = "0.221.2" +version = "0.221.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a80742ff1b9e6d8c231ac7c7247782c6fc5bce503af760bca071811e5fc9ee56" +checksum = "7343c42a97f2926c7819ff81b64012092ae954c5d83ddd30c9fcdefd97d0b283" dependencies = [ "anyhow", "termcolor", - "wasmparser 0.221.2", + "wasmparser 0.221.3", ] [[package]] name = "wasmtime" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd30973c65eceb0f37dfcc430d83abd5eb24015fdfcab6912f52949287e04f0" +checksum = "11976a250672556d1c4c04c6d5d7656ac9192ac9edc42a4587d6c21460010e69" dependencies = [ "anyhow", "bitflags 2.8.0", @@ -22356,7 +22997,6 @@ dependencies = [ "hashbrown 0.14.5", "indexmap 2.7.1", "libc", - "libm", "log", "mach2", "memfd", @@ -22373,13 +23013,14 @@ dependencies = [ "smallvec", "sptr", "target-lexicon", - "wasmparser 0.221.2", + "wasmparser 0.221.3", "wasmtime-asm-macros", "wasmtime-component-macro", "wasmtime-cranelift", "wasmtime-environ", "wasmtime-fiber", "wasmtime-jit-icache-coherence", + "wasmtime-math", "wasmtime-slab", "wasmtime-versioned-export-macros", "wasmtime-winch", @@ -22388,23 +23029,23 @@ dependencies = [ [[package]] name = "wasmtime-asm-macros" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c21dd30d1f3f93ee390ac1a7ec304ecdbfdab6390e1add41a1f52727b0992b" +checksum = "1f178b0d125201fbe9f75beaf849bd3e511891f9e45ba216a5b620802ccf64f2" dependencies = [ "cfg-if 1.0.0", ] [[package]] name = "wasmtime-component-macro" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f948a6ef3119d52c9f12936970de28ddf3f9bea04bc65571f4a92d2e5ab38f4" +checksum = "d74de6592ed945d0a602f71243982a304d5d02f1e501b638addf57f42d57dfaf" dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "wasmtime-component-util", "wasmtime-wit-bindgen", "wit-parser", @@ -22412,15 +23053,15 @@ dependencies = [ [[package]] name = "wasmtime-component-util" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9275aa01ceaaa2fa6c0ecaa5267518d80b9d6e9ae7c7ea42f4c6e073e6a69ef" +checksum = "707dc7b3c112ab5a366b30cfe2fb5b2f8e6a0f682f16df96a5ec582bfe6f056e" [[package]] name = "wasmtime-cranelift" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0701a44a323267aae4499672dae422b266cee3135a23b640972ec8c0e10a44a2" +checksum = "366be722674d4bf153290fbcbc4d7d16895cc82fb3e869f8d550ff768f9e9e87" dependencies = [ "anyhow", "cfg-if 1.0.0", @@ -22436,16 +23077,16 @@ dependencies = [ "smallvec", "target-lexicon", "thiserror 1.0.69", - "wasmparser 0.221.2", + "wasmparser 0.221.3", "wasmtime-environ", "wasmtime-versioned-export-macros", ] [[package]] name = "wasmtime-environ" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "264c968c1b81d340355ece2be0bc31a10f567ccb6ce08512c3b7d10e26f3cbe5" +checksum = "cdadc1af7097347aa276a4f008929810f726b5b46946971c660b6d421e9994ad" dependencies = [ "anyhow", "cranelift-bitset", @@ -22459,16 +23100,16 @@ dependencies = [ "serde_derive", "smallvec", "target-lexicon", - "wasm-encoder 0.221.2", - "wasmparser 0.221.2", - "wasmprinter 0.221.2", + "wasm-encoder 0.221.3", + "wasmparser 0.221.3", + "wasmprinter 0.221.3", ] [[package]] name = "wasmtime-fiber" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78505221fd5bd7b07b4e1fa2804edea49dc231e626ad6861adc8f531812973e6" +checksum = "ccba90d4119f081bca91190485650730a617be1fff5228f8c4757ce133d21117" dependencies = [ "anyhow", "cc", @@ -22481,9 +23122,9 @@ dependencies = [ [[package]] name = "wasmtime-jit-icache-coherence" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bedb677ca1b549d98f95e9e1f9251b460090d99a2c196a0614228c064bf2e59" +checksum = "ec5e8552e01692e6c2e5293171704fed8abdec79d1a6995a0870ab190e5747d1" dependencies = [ "anyhow", "cfg-if 1.0.0", @@ -22491,35 +23132,44 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "wasmtime-math" +version = "29.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29210ec2aa25e00f4d54605cedaf080f39ec01a872c5bd520ad04c67af1dde17" +dependencies = [ + "libm", +] + [[package]] name = "wasmtime-slab" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "564905638c132c275d365c1fa074f0b499790568f43148d29de84ccecfb5cb31" +checksum = "fcb5821a96fa04ac14bc7b158bb3d5cd7729a053db5a74dad396cd513a5e5ccf" [[package]] name = "wasmtime-versioned-export-macros" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e91092e6cf77390eeccee273846a9327f3e8f91c3c6280f60f37809f0e62d29" +checksum = "86ff86db216dc0240462de40c8290887a613dddf9685508eb39479037ba97b5b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] name = "wasmtime-winch" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b111d909dc604c741bd8ac2f4af373eaa5c68c34b5717271bcb687688212cef8" +checksum = "fdbabfb8f20502d5e1d81092b9ead3682ae59988487aafcd7567387b7a43cf8f" dependencies = [ "anyhow", "cranelift-codegen", "gimli 0.31.1", "object", "target-lexicon", - "wasmparser 0.221.2", + "wasmparser 0.221.3", "wasmtime-cranelift", "wasmtime-environ", "winch-codegen", @@ -22527,9 +23177,9 @@ dependencies = [ [[package]] name = "wasmtime-wit-bindgen" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f38f7a5eb2f06f53fe943e7fb8bf4197f7cf279f1bc52c0ce56e9d3ffd750a4" +checksum = "8358319c2dd1e4db79e3c1c5d3a5af84956615343f9f89f4e4996a36816e06e6" dependencies = [ "anyhow", "heck 0.5.0", @@ -22552,24 +23202,24 @@ dependencies = [ [[package]] name = "wast" -version = "224.0.0" +version = "225.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d722a51e62b669d17e5a9f6bc8ec210178b37d869114355aa46989686c5c6391" +checksum = "c61496027ff707f9fa9e0b22c34ec163eb7adb1070df565e32a9180a76e4300b" dependencies = [ "bumpalo", - "leb128", + "leb128fmt", "memchr", "unicode-width 0.2.0", - "wasm-encoder 0.224.0", + "wasm-encoder 0.225.0", ] [[package]] name = "wat" -version = "1.224.0" +version = "1.225.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71dece6a7dd5bcbcf8d256606c7fb3faa36286d46bf3f98185407719a5ceede2" +checksum = "89e72a33942234fd0794bcdac30e43b448de3187512414267678e511c6755f11" dependencies = [ - "wast 224.0.0", + "wast 225.0.0", ] [[package]] @@ -22594,9 +23244,9 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "0.26.7" +version = "0.26.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cd5da49bdf1f30054cfe0b8ce2958b8fbeb67c4d82c8967a598af481bef255c" +checksum = "09aed61f5e8d2c18344b3faa33a4c837855fe56642757754775548fee21386c4" dependencies = [ "rustls-pki-types", ] @@ -22609,9 +23259,9 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "0.26.7" +version = "0.26.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" dependencies = [ "rustls-pki-types", ] @@ -22697,9 +23347,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -version = "28.0.1" +version = "29.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6232f40a795be2ce10fc761ed3b403825126a60d12491ac556ea104a932fd18a" +checksum = "2f849ef2c5f46cb0a20af4b4487aaa239846e52e2c03f13fa3c784684552859c" dependencies = [ "anyhow", "cranelift-codegen", @@ -22707,7 +23357,8 @@ dependencies = [ "regalloc2", "smallvec", "target-lexicon", - "wasmparser 0.221.2", + "thiserror 1.0.69", + "wasmparser 0.221.3", "wasmtime-cranelift", "wasmtime-environ", ] @@ -22752,7 +23403,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -22763,7 +23414,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -22946,9 +23597,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.24" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8d71a593cc5c42ad7876e2c1fda56f314f3754c084128833e64f1345ff8a03a" +checksum = "59690dea168f2198d1a3b0cac23b8063efcd11012f10ae4698f284808c8ef603" dependencies = [ "memchr", ] @@ -22969,11 +23620,20 @@ version = "0.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.8.0", +] + [[package]] name = "wit-parser" -version = "0.221.2" +version = "0.221.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbe1538eea6ea5ddbe5defd0dc82539ad7ba751e1631e9185d24a931f0a5adc8" +checksum = "896112579ed56b4a538b07a3d16e562d101ff6265c46b515ce0c701eef16b2ac" dependencies = [ "anyhow", "id-arena", @@ -22984,7 +23644,7 @@ dependencies = [ "serde_derive", "serde_json", "unicode-xid", - "wasmparser 0.221.2", + "wasmparser 0.221.3", ] [[package]] @@ -23038,10 +23698,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94" dependencies = [ "const-oid", - "der", + "der 0.7.9", "sha1", - "signature", - "spki", + "signature 2.2.0", + "spki 0.7.3", "tls_codec", ] @@ -23094,8 +23754,8 @@ version = "0.9.0" dependencies = [ "candid", "futures", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.18.0-alpha.1", + "ic-cdk-macros 0.18.0-alpha.1", "rand 0.8.5", "rand_pcg 0.3.1", "serde", @@ -23107,8 +23767,8 @@ name = "xrc-mock" version = "0.9.0" dependencies = [ "candid", - "ic-cdk 0.16.0", - "ic-cdk-macros 0.9.0", + "ic-cdk 0.17.1", + "ic-cdk-macros 0.17.1", "ic-xrc-types", "serde", ] @@ -23163,7 +23823,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "synstructure", ] @@ -23174,7 +23834,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa91407dacce3a68c56de03abe2760159582b846c6a4acd2f456618087f12713" +dependencies = [ + "zerocopy-derive 0.8.17", ] [[package]] @@ -23185,7 +23854,18 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06718a168365cad3d5ff0bb133aad346959a2074bd4a85c121255a11304a8626" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", ] [[package]] @@ -23205,7 +23885,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", "synstructure", ] @@ -23226,7 +23906,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -23248,7 +23928,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.96", + "syn 2.0.98", ] [[package]] @@ -23278,8 +23958,3 @@ dependencies = [ "cc", "pkg-config", ] - -[[patch.unused]] -name = "jsonrpc" -version = "0.12.1" -source = "git+https://github.com/apoelstra/rust-jsonrpc?rev=e42044d#e42044d8e0896317488dfbd65eb5563d76e937fe" diff --git a/Cargo.toml b/Cargo.toml index b71047a052f..4d1b0b97846 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,8 +6,11 @@ members = [ "packages/icrc-ledger-client", "packages/icrc-ledger-client-cdk", "packages/icrc-ledger-types", + "packages/ic-dummy-getrandom-for-wasm", + "packages/ic-ed25519", "packages/ic-ethereum-types", "packages/ic-metrics-assert", + "packages/ic-secp256k1", "packages/ic-sha3", "packages/ic-ledger-hash-of", "packages/ic-signature-verification", @@ -37,6 +40,8 @@ members = [ "rs/boundary_node/rate_limits", "rs/boundary_node/rate_limits/api", "rs/boundary_node/rate_limits/canister_client", + "rs/boundary_node/salt_sharing", + "rs/boundary_node/salt_sharing/api", "rs/boundary_node/systemd_journal_gatewayd_shim", "rs/canister_client", "rs/canister_client/read_state_response_parser", @@ -63,7 +68,6 @@ members = [ "rs/criterion_time", "rs/crypto", "rs/crypto/ecdsa_secp256r1", - "rs/crypto/ed25519", "rs/crypto/for_verification_only", "rs/crypto/iccsa", "rs/crypto/internal/crypto_lib/basic_sig/der_utils", @@ -79,7 +83,6 @@ members = [ "rs/crypto/internal/crypto_lib/multi_sig/bls12_381", "rs/crypto/internal/crypto_lib/seed", "rs/crypto/internal/crypto_lib/sha2", - "rs/crypto/secp256k1", "rs/crypto/secrets_containers", "rs/crypto/internal/crypto_lib/threshold_sig/bls12_381", "rs/crypto/internal/crypto_lib/threshold_sig/canister_threshold_sig", @@ -94,7 +97,6 @@ members = [ "rs/crypto/internal/test_vectors", "rs/crypto/node_key_generation", "rs/crypto/node_key_validation", - "rs/crypto/getrandom_for_wasm", "rs/crypto/prng", "rs/crypto/sha2", "rs/crypto/utils/canister_threshold_sig", @@ -487,11 +489,6 @@ opt-level = 3 [profile.dev.package.p256] opt-level = 3 -[patch.crates-io] -# Current jsonrpc version (0.12.1) does not support ipv6 addressing. When new version is -# released this can be removed. -jsonrpc = { git = "https://github.com/apoelstra/rust-jsonrpc", rev = "e42044d" } - [workspace.dependencies] actix-web = "4.9.0" actix-rt = "2.10.0" @@ -522,7 +519,7 @@ chrono = { version = "0.4.38", default-features = false, features = [ "serde", ] } ciborium = "0.2.1" -clap = { version = "4.5.18", features = ["derive", "string"] } +clap = { version = "4.5.20", features = ["derive", "string"] } # cloudflare v0.12 is broken, master is partly fixed but unreleased yet. # see: # - https://github.com/cloudflare/cloudflare-rs/issues/222 @@ -534,6 +531,7 @@ curve25519-dalek = { version = "4.1.3", features = [ "group", "precomputed-tables", ] } +dfx-core = { version = "0.1.3" } ed25519-dalek = { version = "2.1.1", features = [ "std", "zeroize", @@ -567,13 +565,14 @@ ic-bn-lib = { git = "https://github.com/dfinity/ic-bn-lib", rev = "d74a6527fbaf8 ic-btc-interface = "0.2.2" ic-canister-sig-creation = { git = "https://github.com/dfinity/ic-canister-sig-creation", rev = "7f9e931954637526295269155881207f6c832d6d" } ic-cbor = "3" -ic-cdk = "0.16.0" -ic-cdk-macros = "0.9.0" -ic-cdk-timers = "0.7.0" +ic-cdk = "0.17.1" +ic-cdk-macros = "0.17.0" +ic-cdk-timers = "0.11.0" ic-certificate-verification = "3" ic-certification = "3" ic-http-certification = "3" ic-http-gateway = "0.1" +ic-management-canister-types = "0.1.0" ic-response-verification = "3" ic-sha3 = "1.0.0" ic-stable-structures = "0.6.5" @@ -601,7 +600,8 @@ k256 = { version = "0.13.4", default-features = false, features = [ "std", ] } # kube is used by our test driver -kube = { version = "0.93.1" } +k8s-openapi = { version = "0.22.0", features = ["v1_28", "schemars"] } +kube = { version = "0.94.0", features = ["client", "derive"] } lazy_static = "1.4.0" leb128 = "0.2.5" libc = "0.2.158" @@ -609,6 +609,7 @@ libflate = "2.1.0" libnss = "0.5.0" local-ip-address = "0.5.6" macaddr = "1.0" +memmap2 = "0.9.5" minicbor = { version = "0.19.1", features = ["alloc", "derive"] } minicbor-derive = "0.13.0" mockall = "0.13.0" @@ -679,6 +680,7 @@ rustls = { version = "0.23.18", default-features = false, features = [ "std", "brotli", ] } +schemars = { version = "0.8.21", features = ["derive"] } serde = { version = "1.0.203", features = ["derive"] } serde_bytes = "0.11.15" serde_cbor = "0.11.2" diff --git a/MODULE.bazel b/MODULE.bazel index d0e9fbe3a2d..dc08205f892 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -846,6 +846,11 @@ http_file( http_file( name = "pocket-ic-mainnet-gz", + # Calculate this hash using: + # git checkout $revision + # ci/container/container-run.sh + # bazel build //publish/binaries:pocket-ic.gz + # sha256sum bazel-bin/publish/binaries/pocket-ic.gz sha256 = "0935ee6ece312719aae4eabddec2dfc6af34d5edbddf4d3af53bccd1b3636044", url = "https://download.dfinity.systems/ic/172f8c78653c93ad101af75b94251439b4ccf098/binaries/x86_64-linux/pocket-ic.gz", ) diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index af1a4a161e3..9ff3af23086 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -19,6 +19,7 @@ canisters( "ledger": "ledger-canister_notify-method.wasm.gz", "ledger_v1": "ledger-canister_notify-method.wasm.gz", "ledger_v2": "ledger-canister_notify-method.wasm.gz", + "ledger_v3": "ledger-canister_notify-method.wasm.gz", "archive": "ledger-archive-node-canister.wasm.gz", "index": "ic-icp-index-canister.wasm.gz", "root": "root-canister.wasm.gz", @@ -55,6 +56,7 @@ canisters( "ledger": "mainnet_icp_ledger_canister", "ledger_v1": "mainnet_icp_ledger_canister-v1", "ledger_v2": "mainnet_icp_ledger_canister-v2", + "ledger_v3": "mainnet_icp_ledger_canister-v3", "archive": "mainnet_icp_ledger-archive-node-canister", "index": "mainnet_icp_index_canister", "root": "mainnet_nns_root-canister", diff --git a/bazel/canbench.bzl b/bazel/canbench.bzl index 6a570c8e666..f07def08aca 100644 --- a/bazel/canbench.bzl +++ b/bazel/canbench.bzl @@ -5,7 +5,7 @@ This module defines functions to run benchmarks using canbench. load("@rules_rust//rust:defs.bzl", "rust_binary") load("//bazel:canisters.bzl", "wasm_rust_binary_rule") -def rust_canbench(name, results_file, add_test = False, opt = "3", **kwargs): +def rust_canbench(name, results_file, add_test = False, opt = "3", noise_threshold = None, **kwargs): """ Run a Rust benchmark using canbench. This creates 2 executable rules: :${name} for running the benchmark and :${name}_update for @@ -17,6 +17,8 @@ def rust_canbench(name, results_file, add_test = False, opt = "3", **kwargs): add_test: If True add an additional :${name}_test rule that fails if canbench benchmark fails. opt: The optimization level to use for the rust_binary compilation. **kwargs: Additional arguments to pass to rust_binary. + noise_threshold: The noise threshold to use for the benchmark. If None, the default value from + canbench is used. """ rust_binary( @@ -50,6 +52,9 @@ def rust_canbench(name, results_file, add_test = False, opt = "3", **kwargs): "WORKSPACE": "$(rootpath //:WORKSPACE.bazel)", } + if noise_threshold: + env["NOISE_THRESHOLD"] = str(noise_threshold) + native.sh_binary( name = name, testonly = True, diff --git a/bazel/canbench.sh b/bazel/canbench.sh index f47c6216275..3dddd90528f 100755 --- a/bazel/canbench.sh +++ b/bazel/canbench.sh @@ -9,6 +9,8 @@ # - updated if --update is specified. # - used for comparison if it's not empty. # - WASM_PATH: Path to the wasm file to be benchmarked. +# - NOISE_THRESHOLD: The noise threshold in percentage. If the difference between the current +# benchmark and the results file is above this threshold, the benchmark test will fail. set -eEuo pipefail @@ -28,8 +30,6 @@ if [ -s "${REPO_RESULTS_PATH}" ]; then echo " ${REPO_RESULTS_PATH}" >>${CANBENCH_YML} fi -echo ${RUNFILES} - if [ $# -eq 0 ]; then # Runs the benchmark without updating the results file. ${CANBENCH_BIN} --no-runtime-integrity-check --runtime-path ${POCKET_IC_BIN} @@ -43,8 +43,9 @@ elif [ "$1" = "--update" ]; then cp "${RUNFILES}/canbench_results.yml" "${REPO_RESULTS_PATH}" fi else + NOISE_THRESHOLD_ARG="${NOISE_THRESHOLD:+--noise-threshold ${NOISE_THRESHOLD}}" # Runs the benchmark test that fails if the diffs are new or above the threshold. - ${CANBENCH_BIN} --no-runtime-integrity-check --runtime-path ${POCKET_IC_BIN} >$CANBENCH_OUTPUT + ${CANBENCH_BIN} --no-runtime-integrity-check --runtime-path ${POCKET_IC_BIN} ${NOISE_THRESHOLD_ARG} >$CANBENCH_OUTPUT if grep -q "(regress\|(improved by \|(new)" "$CANBENCH_OUTPUT"; then cat "$CANBENCH_OUTPUT" echo "**\`$REPO_RESULTS_PATH\` is not up to date ❌** diff --git a/bazel/cargo.config b/bazel/cargo.config index 3be12b67d05..aa9c5e6ec5c 100644 --- a/bazel/cargo.config +++ b/bazel/cargo.config @@ -1,4 +1 @@ [patch.crates-io] -# Current jsonrpc version (0.12.1) does not support ipv6 addressing. When new version is -# released this can be removed. -jsonrpc = { git = "https://github.com/apoelstra/rust-jsonrpc", rev = "e42044d" } diff --git a/bazel/conf/.bazelrc.build b/bazel/conf/.bazelrc.build index 998576ff820..4bad56e69af 100644 --- a/bazel/conf/.bazelrc.build +++ b/bazel/conf/.bazelrc.build @@ -43,13 +43,13 @@ build --workspace_status_command=$(pwd)/bazel/workspace_status.sh build --experimental_repository_downloader_retries=3 # https://bazel.build/reference/command-line-reference#flag--experimental_repository_downloader_retries -build --flag_alias=ic_version=//bazel:ic_version -build --flag_alias=ic_version_rc_only=//bazel:ic_version_rc_only -build --flag_alias=release_build=//bazel:release_build -build --flag_alias=s3_endpoint=//ci/src/artifacts:s3_endpoint -build --flag_alias=s3_upload=//ci/src/artifacts:s3_upload -build --flag_alias=k8s=//rs/tests:k8s -build --flag_alias=timeout_value=//bazel:timeout_value +common --flag_alias=ic_version=//bazel:ic_version +common --flag_alias=ic_version_rc_only=//bazel:ic_version_rc_only +common --flag_alias=release_build=//bazel:release_build +common --flag_alias=s3_endpoint=//ci/src/artifacts:s3_endpoint +common --flag_alias=s3_upload=//ci/src/artifacts:s3_upload +common --flag_alias=k8s=//rs/tests:k8s +common --flag_alias=timeout_value=//bazel:timeout_value # Exclude system tests by default # https://github.com/bazelbuild/bazel/issues/8439 diff --git a/bazel/conf/.bazelrc.internal b/bazel/conf/.bazelrc.internal index fc1cd1aafbe..216fd4b161f 100644 --- a/bazel/conf/.bazelrc.internal +++ b/bazel/conf/.bazelrc.internal @@ -3,7 +3,6 @@ # Build event upload configuration build:bes --bes_results_url=https://dash.idx.dfinity.network/invocation/ build:bes --bes_backend=bes.idx.dfinity.network -build:bes --bes_upload_mode=wait_for_upload_complete build:bes --bes_timeout=180s # Default is no timeout. build:bes --remote_build_event_upload=minimal diff --git a/bazel/external_crates.bzl b/bazel/external_crates.bzl index faee354defd..c432618ad84 100644 --- a/bazel/external_crates.bzl +++ b/bazel/external_crates.bzl @@ -332,10 +332,10 @@ def external_crates_repository(name, cargo_lockfile, lockfile, sanitizers_enable default_features = False, ), "canbench": crate.spec( - version = "^0.1.8", + version = "^0.1.9", ), "canbench-rs": crate.spec( - version = "^0.1.8", + version = "^0.1.9", ), "candid": crate.spec( version = "^0.10.13", @@ -380,7 +380,7 @@ def external_crates_repository(name, cargo_lockfile, lockfile, sanitizers_enable ), "cloudflare": crate.spec( git = "https://github.com/dfinity/cloudflare-rs.git", - rev = "a6538a036926bd756986c9c0a5de356daef48881", + rev = "8b011d170d9d61eaad77bb9645371f6219285104", default_features = False, features = [ "rustls-tls", @@ -434,6 +434,9 @@ def external_crates_repository(name, cargo_lockfile, lockfile, sanitizers_enable "dashmap": crate.spec( version = "^5.3.4", ), + "dfx-core": crate.spec( + version = "^0.1.3", + ), "dyn-clone": crate.spec( version = "^1.0.14", ), @@ -462,7 +465,7 @@ def external_crates_repository(name, cargo_lockfile, lockfile, sanitizers_enable features = ["serde"], ), "evm_rpc_types": crate.spec( - version = "^1.2.0", + version = "^1.3.0", ), "exec": crate.spec( version = "^0.3.1", @@ -588,13 +591,13 @@ def external_crates_repository(name, cargo_lockfile, lockfile, sanitizers_enable version = "3.0.2", ), "ic-cdk": crate.spec( - version = "^0.16.0", + version = "^0.17.0", ), "ic-cdk-timers": crate.spec( version = "^0.11.0", ), "ic-cdk-macros": crate.spec( - version = "^0.9.0", + version = "^0.17.0", ), "ic-cdk-macros-next": crate.spec( package = "ic-cdk-macros", @@ -624,6 +627,9 @@ def external_crates_repository(name, cargo_lockfile, lockfile, sanitizers_enable "ic-metrics-encoder": crate.spec( version = "^1.1.1", ), + "ic-management-canister-types": crate.spec( + version = "0.1.0", + ), "ic_principal": crate.spec( version = "^0.1.1", default_features = False, @@ -729,11 +735,16 @@ def external_crates_repository(name, cargo_lockfile, lockfile, sanitizers_enable "k8s-openapi": crate.spec( version = "^0.22.0", features = [ - "v1_24", + "v1_28", + "schemars", ], ), "kube": crate.spec( - version = "^0.93.1", + version = "^0.94.0", + features = [ + "client", + "derive", + ], ), "lazy_static": crate.spec( version = "^1.4.0", @@ -776,6 +787,9 @@ def external_crates_repository(name, cargo_lockfile, lockfile, sanitizers_enable "macaddr": crate.spec( version = "^1.0", ), + "memmap2": crate.spec( + version = "^0.9.5", + ), "mach2": crate.spec( # Wasmtime depends on 0.4.2 but specifies 0.4.1. # Enforce 0.4.2 using a dummy dependency until @@ -1117,7 +1131,10 @@ def external_crates_repository(name, cargo_lockfile, lockfile, sanitizers_enable version = "^0.3.0", ), "schemars": crate.spec( - version = "^0.8.16", + version = "^0.8.21", + features = [ + "derive", + ], ), "scoped_threadpool": crate.spec( version = "^0.1.9", @@ -1447,7 +1464,7 @@ def external_crates_repository(name, cargo_lockfile, lockfile, sanitizers_enable version = "^0.217.0", ), "wasmtime": crate.spec( - version = "^28.0.0", + version = "^29.0.0", default_features = False, features = [ "cranelift", @@ -1458,7 +1475,7 @@ def external_crates_repository(name, cargo_lockfile, lockfile, sanitizers_enable ], ), "wasmtime-environ": crate.spec( - version = "^28.0.0", + version = "^29.0.0", ), "wast": crate.spec( version = "^212.0.0", diff --git a/bazel/ic_version_or_git_sha.sh b/bazel/ic_version_or_git_sha.sh index 86bc193ee95..bae19f41502 100755 --- a/bazel/ic_version_or_git_sha.sh +++ b/bazel/ic_version_or_git_sha.sh @@ -17,9 +17,6 @@ while read -r k v; do COMMIT_SHA) VERSION="$v" ;; - GIT_TREE_STATUS) - GIT_TREE_STATUS="$v" - ;; BUILD_TIMESTAMP) BUILD_TIMESTAMP="$v" ;; diff --git a/bazel/workspace_status.sh b/bazel/workspace_status.sh index 94481b8903b..3e18bf05e1f 100755 --- a/bazel/workspace_status.sh +++ b/bazel/workspace_status.sh @@ -2,36 +2,25 @@ set -euo pipefail -function remove_url_credentials() { - sed -Ee 's#//[^:]*:[^@]*@#//#' -} - -repo_url=$(git config --get remote.origin.url | remove_url_credentials) -echo "REPO_URL $repo_url" - +# Used by ic_version_or_git_sha commit_sha=$(git rev-parse HEAD) echo "COMMIT_SHA $commit_sha" -git_branch=$(git rev-parse --abbrev-ref HEAD) -echo "GIT_BRANCH $git_branch" - +# Used by ic_version_or_git_sha git_tree_status=$(git diff-index --quiet HEAD -- && echo 'Clean' || echo 'Modified') echo "GIT_TREE_STATUS $git_tree_status" -WORKSPACE_ROOT="$(git rev-parse --show-toplevel)" -echo "STABLE_WORKSPACE_ROOT ${WORKSPACE_ROOT}" - +# Used to read credentials for S3 upload echo "HOME ${HOME}" -test -n "${CI_RUN_ID:-}" && echo "CI_RUN_ID ${CI_RUN_ID}" -test -n "${CI_JOB_NAME:-}" && echo "CI_JOB_NAME ${CI_JOB_NAME}" -test -n "${CI_RUNNER_TAGS:-}" && echo "CI_RUNNER_TAGS ${CI_RUNNER_TAGS}" - +# Used as farm metadata +test -n "${CI_JOB_NAME:-}" && echo "STABLE_FARM_JOB_NAME ${CI_JOB_NAME}" if [[ -n "${USER:-}" ]]; then - echo "USER ${USER}" + echo "STABLE_FARM_USER ${USER}" elif [[ -n "${HOSTUSER:-}" ]]; then - echo "USER ${HOSTUSER}" + echo "STABLE_FARM_USER ${HOSTUSER}" fi # Generate a file that changes every time bazel runs. It can be used as dependency for targets we want to always rebuild. -date '+%s' >"${WORKSPACE_ROOT}/bazel-timestamp.txt" +workspace_root="$(git rev-parse --show-toplevel)" +date '+%s' >"$workspace_root/bazel-timestamp.txt" diff --git a/bin/.gitignore b/bin/.gitignore deleted file mode 100644 index 2078d0d0768..00000000000 --- a/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -checksum.txt \ No newline at end of file diff --git a/bin/dotbootstrap.sh b/bin/dotbootstrap.sh deleted file mode 100755 index 33691106fc8..00000000000 --- a/bin/dotbootstrap.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh -curl --proto =https --tlsv1.2 -sSf https://sh.rustup.rs -echo "scp -r jplevyak@jplevyak.homeip.net:.vim ~/.vim" diff --git a/bin/ict b/bin/ict index 9f3dfb12e04..a7ee61f4d86 100755 --- a/bin/ict +++ b/bin/ict @@ -1,62 +1,24 @@ #!/usr/bin/env bash -set -Eou pipefail +set -eou pipefail -GREEN="\x1b[32m" -RED="\x1b[31m" -BOLD="\x1b[1m" -NC="\x1b[0m" +# convenience wrapper around 'ict' binary -CURRENT_SCRIPT_DIR=$(dirname "${BASH_SOURCE[0]}") -ICT_DIR="${CURRENT_SCRIPT_DIR}/../rs/tests/ict" -CHECKSUM_FILE="${CURRENT_SCRIPT_DIR}/checksum.txt" # holds the resulting hash of all files in the ict directory -BAZEL_ICT_TARGET="//rs/tests/ict:ict" -# Path to this binary is hard coded, as getting it from Bazel is a bit slow (~0.5 sec) for a good interactivity. -ICT_BIN="$CURRENT_SCRIPT_DIR/../bazel-out/k8-opt/bin/rs/tests/ict/ict_/ict" +ICT_TARGET="//rs/tests/ict" -if [ "$(hostname)" != "devenv-container" ]; then - echo -e "${BOLD}${RED}This script can only be executed within a devenv-container. Make sure you first executed:\n/ic$ ./ci/container/container-run.sh${NC}" +ICT_BUILD_CMD='bazel build "$ICT_TARGET"' +GIT_TOPLEVEL=$(git rev-parse --show-toplevel) + +# Bazel 8 has a '--quiet' flag to suppress "info" output: +# https://github.com/bazelbuild/bazel/issues/4867 +# +# Once we support bazel 8, we can simply run 'bazel --quiet run ...' +# +# Until then, we perform the build separately and pipe the output +# to /dev/null +if ! eval "$ICT_BUILD_CMD" &> /dev/null ; then + echo "could not build $ICT_TARGET" + echo "try running: $ICT_BUILD_CMD" exit 1 fi -compile_ict() { - bazel build $BAZEL_ICT_TARGET --config=local >/dev/null 2>&1 - CODE="$?" - if [ "${CODE}" != "0" ]; then - echo -e "${BOLD}${RED}ict compilation failed with code=${CODE}${NC}" - echo "Try running the build manually: bazel build ${BAZEL_ICT_TARGET}" - exit 1 - fi -} - -# Check if Bazel server is already running. If not print a message for user and start Bazel. -pgrep -fi bazel >/dev/null >&1 -CODE="$?" -if [ "${CODE}" != "0" ]; then - echo -e "${BOLD}${GREEN}Starting Bazel server ...${NC}" - bazel >/dev/null 2>&1 - CODE="$?" - if [ "${CODE}" != "0" ]; then - echo -e "${BOLD}${RED}Failed to start Bazel server${NC}" - echo "Try starting Bazel manually: $ bazel" - exit 1 - fi -fi -# Check whether ict binary exists/up-to-date. If not compile/recompile + handle errors. -# Take all files in the ict/* for checksum computation. -checksum=$(find ${ICT_DIR} -type f -exec sha256sum {} \; | sort -z | sha1sum | head -c 40) -compile_msg="" -if [ ! -f "$ICT_BIN" ]; then - compile_msg="Compiling ict binary ..." -else - if [ ! -f "${CHECKSUM_FILE}" ] || [ $(<$CHECKSUM_FILE) != "$checksum" ]; then - compile_msg="ict source file/s changed, recompiling ict ..." - fi -fi -if [ ! -z "${compile_msg}" ]; then - echo -e "${BOLD}${GREEN}${compile_msg}${NC}" - compile_ict - # write checksum into a file - echo ${checksum} >${CHECKSUM_FILE} -fi -# Invoke binary with the arguments. -"$ICT_BIN" "$@" +"$GIT_TOPLEVEL"/bazel-bin/rs/tests/ict/ict_/ict "$@" diff --git a/ci/bazel-scripts/diff.sh b/ci/bazel-scripts/diff.sh index 890eb6740c7..a6395d07a9d 100755 --- a/ci/bazel-scripts/diff.sh +++ b/ci/bazel-scripts/diff.sh @@ -18,7 +18,7 @@ MERGE_BASE="${MERGE_BASE_SHA:-HEAD}" COMMIT_RANGE="$MERGE_BASE..${BRANCH_HEAD_SHA:-}" DIFF_FILES=$(git diff --name-only "${COMMIT_RANGE}") -if grep -qE "(.*\.bazel|.*\.bzl|\.bazelrc|\.bazelversion|mainnet-canister-revisions\.json)" <<<"$DIFF_FILES"; then +if grep -qE "(.*\.bazel|.*\.bzl|\.bazelrc|\.bazelversion|mainnet-canister-revisions\.json|^\.github)" <<<"$DIFF_FILES"; then echo "Changes detected in bazel files. Considering all targets." >&2 echo ${BAZEL_TARGETS:-"//..."} exit 0 @@ -55,9 +55,9 @@ if [ ${#files[@]} -eq 0 ]; then exit 0 fi -if [ "${BAZEL_COMMAND:-}" == "build" ]; then +if [[ $BAZEL_COMMAND =~ ^build[[:space:]] ]]; then TARGETS=$(bazel query "rdeps(//..., set(${files[*]}))") -elif [ "${BAZEL_COMMAND:-}" == "test" ]; then +elif [[ $BAZEL_COMMAND =~ ^test[[:space:]] ]]; then EXCLUDED_TAGS=(manual $EXCLUDED_TEST_TAGS) EXCLUDED_TAGS=$( IFS='|' @@ -65,7 +65,7 @@ elif [ "${BAZEL_COMMAND:-}" == "test" ]; then ) TARGETS=$(bazel query "kind(test, rdeps(//..., set(${files[*]}))) except attr('tags', '$EXCLUDED_TAGS', //...)") else - echo "Unknown BAZEL_COMMAND: ${BAZEL_COMMAND:-}" >&2 + echo "Cannot infer command from BAZEL_COMMAND: ${BAZEL_COMMAND:-}" >&2 exit 1 fi diff --git a/ci/bazel-scripts/main.sh b/ci/bazel-scripts/main.sh index 46e7b45cd2f..35fcbec25c2 100755 --- a/ci/bazel-scripts/main.sh +++ b/ci/bazel-scripts/main.sh @@ -11,11 +11,11 @@ ic_version_rc_only="0000000000000000000000000000000000000000" release_build="false" s3_upload="False" -protected_branches=("master" "rc--*" "hotfix-*" "master-private") +protected_branches=("^master$" "^rc--" "^hotfix-" "^master-private$") # if we are on a protected branch or targeting a rc branch we set ic_version to the commit_sha and upload to s3 for pattern in "${protected_branches[@]}"; do - if [[ "$BRANCH_NAME" == $pattern ]]; then + if [[ "$BRANCH_NAME" =~ $pattern ]]; then IS_PROTECTED_BRANCH="true" break fi @@ -42,9 +42,6 @@ else s3_upload="True" fi -# pass info about bazel targets to bazel-targets file -echo "$BAZEL_TARGETS" >bazel-targets - # if bazel targets is empty we don't need to run any tests if [ -z "${BAZEL_TARGETS:-}" ]; then echo "No bazel targets to build" @@ -58,13 +55,9 @@ AWS_CREDS="${HOME}/.aws/credentials" mkdir -p "$(dirname "${AWS_CREDS}")" # add aws credentials file if it's set -if [ -n "${AWS_SHARED_CREDENTIALS_CONTENT+x}" ]; then - echo "$AWS_SHARED_CREDENTIALS_CONTENT" >"$AWS_CREDS" - unset AWS_SHARED_CREDENTIALS_CONTENT -fi - -if [ -n "${GITHUB_OUTPUT:-}" ]; then - echo "upload_artifacts=true" >>"$GITHUB_OUTPUT" +if [ -n "${CLOUD_CREDENTIALS_CONTENT+x}" ]; then + echo "$CLOUD_CREDENTIALS_CONTENT" >"$AWS_CREDS" + unset CLOUD_CREDENTIALS_CONTENT fi if [ -z "${KUBECONFIG:-}" ] && [ ! -z "${KUBECONFIG_TNET_CREATOR_LN1:-}" ]; then @@ -91,21 +84,28 @@ stream_awk_program=' # Finally, record the URL END { if (stream_url != null) print stream_url > url_out }' +bazel_args=( + --output_base=/var/tmp/bazel-output # Output base wiped after run + ${BAZEL_COMMAND} + ${BAZEL_TARGETS} + --color=yes + --build_metadata=BUILDBUDDY_LINKS="[CI Job](${CI_JOB_URL})" + --ic_version="${CI_COMMIT_SHA}" + --ic_version_rc_only="${ic_version_rc_only}" + --release_build="${release_build}" + --s3_upload="${s3_upload:-"False"}" +) + +# Unless explicitly provided, we set a default --repository_cache to a volume mounted inside our runners +# Only for Linux builds since there `/cache` is mounted to host local storage. +if [[ ! " ${bazel_args[*]} " =~ [[:space:]]--repository_cache[[:space:]] ]] && [[ "$(uname)" == "Linux" ]]; then + echo "setting default repository cache" + bazel_args+=(--repository_cache=/cache/bazel) +fi + # shellcheck disable=SC2086 # ${BAZEL_...} variables are expected to contain several arguments. We have `set -f` set above to disable globbing (and therefore only allow splitting)" -bazel \ - ${BAZEL_STARTUP_ARGS} \ - ${BAZEL_COMMAND} \ - --color=yes \ - ${BAZEL_CI_CONFIG} \ - --build_metadata=BUILDBUDDY_LINKS="[CI Job](${CI_JOB_URL})" \ - --ic_version="${CI_COMMIT_SHA}" \ - --ic_version_rc_only="${ic_version_rc_only}" \ - --release_build="${release_build}" \ - --s3_upload="${s3_upload:-"False"}" \ - ${BAZEL_EXTRA_ARGS:-} \ - ${BAZEL_TARGETS} \ - 2>&1 | awk -v url_out="$url_out" "$stream_awk_program" +bazel "${bazel_args[@]}" 2>&1 | awk -v url_out="$url_out" "$stream_awk_program" # Write the bes link & summary echo "Build results uploaded to $(<"$url_out")" diff --git a/ci/container/build-ic.sh b/ci/container/build-ic.sh index 6e2e385c325..40f639c31c8 100755 --- a/ci/container/build-ic.sh +++ b/ci/container/build-ic.sh @@ -1,6 +1,24 @@ #!/usr/bin/env bash set -euo pipefail +# Check if the script is nested (more than once). If so, +# something went wrong with the "inside container" detection +# and we abort to avoid an infinite loop. +if [ "${BUILD_IC_NESTED:-}" == 1 ]; then + echo "$0 nested, aborting" + exit 1 +fi +export BUILD_IC_NESTED=1 + +export ROOT_DIR="$(git rev-parse --show-toplevel)" + +# Drop into the container if we're not already inside it. This ensures +# we run in a predictable environment (Ubuntu with known deps). +if ! ([ -e /home/ubuntu/.DFINITY-TAG ] && ([ -e /.dockerenv ] || [ -e /run/.containerenv ] || [ -n "${CI_JOB_NAME:-}" ])); then + echo dropping into container + exec "$ROOT_DIR"/ci/container/container-run.sh bash "$0" "$@" +fi + [ -n "${DEBUG:-}" ] && set -x usage() { @@ -20,14 +38,31 @@ Non-Release Build, is for non-protected branches (revision is not in rc--* or ma EOF } -RED='\033[0;31m' -BLUE='\033[0;34m' -GREEN='\033[0;32m' -NOCOLOR='\033[0m' +# Color helpers +tp() { tput -T xterm "$@"; } +echo_red() { + tp setaf 1 + echo "$1" + tp sgr0 +} +echo_green() { + tp setaf 2 + echo "$1" + tp sgr0 +} +echo_blue() { + tp setaf 4 + echo "$1" + tp sgr0 +} -echo_red() { echo -e "${RED}${1}${NOCOLOR}"; } -echo_blue() { echo -e "${BLUE}${1}${NOCOLOR}"; } -echo_green() { echo -e "${GREEN}${1}${NOCOLOR}"; } +# Join a bash array with a string +# https://stackoverflow.com/a/17841619 +function join_by { + local IFS="$1" + shift + echo "$*" +} export BUILD_BIN=false export BUILD_CAN=false @@ -53,7 +88,7 @@ while getopts ':bcinh-:' OPT; do i | icos) BUILD_IMG=true ;; n | non-release | no-release | norelease) RELEASE=false ;; ??*) echo_red "Invalid option --$OPT" && usage && exit 1 ;; - ?) echo_red "Invalid command option.\n" && usage && exit 1 ;; + ?) echo_red "Invalid command option." && usage && exit 1 ;; esac done shift "$(($OPTIND - 1))" @@ -64,15 +99,20 @@ if ! "$BUILD_BIN" && ! "$BUILD_CAN" && ! "$BUILD_IMG"; then usage && exit 1 fi -export ROOT_DIR="$(git rev-parse --show-toplevel)" +# Ensure working dir is clean +if [ -n "$(git status --porcelain)" ]; then + echo_red "Git working directory is not clean! Clean it and retry." + exit 1 +fi + export VERSION="$(git rev-parse HEAD)" if "$RELEASE"; then export IC_VERSION_RC_ONLY="$VERSION" - echo_red "\nBuilding release revision (master or rc--*)! Use '--no-release' for non-release revision!\n" && sleep 2 + echo_red "Building release revision (master or rc--*)! Use '--no-release' for non-release revision!" && sleep 2 else export IC_VERSION_RC_ONLY="0000000000000000000000000000000000000000" - echo_red "\nBuilding non-release revision!\n" && sleep 2 + echo_red "Building non-release revision!" && sleep 2 fi export BINARIES_DIR=artifacts/release @@ -82,136 +122,89 @@ export BINARIES_DIR_FULL="$ROOT_DIR/$BINARIES_DIR" export CANISTERS_DIR_FULL="$ROOT_DIR/$CANISTERS_DIR" export DISK_DIR_FULL="$ROOT_DIR/$DISK_DIR" -is_inside_DFINITY_container() { - [ -e /home/ubuntu/.DFINITY-TAG ] && ([ -e /.dockerenv ] || [ -e /run/.containerenv ] || [ -n "${CI_JOB_NAME:-}" ]) -} - -validate_build_env() { - function not_supported_prompt() { - echo_red "$1" - read -t 7 -r -s -p $'Press ENTER to continue the build anyway...\n' - } - - if [ -n "$(git status --porcelain)" ]; then - echo_red "Git working directory is not clean! Clean it and retry." - exit 1 - fi - - if [ "$(uname)" != "Linux" ]; then - not_supported_prompt "This script is only supported on Linux!" - elif ! grep -q 'Ubuntu' /etc/os-release; then - not_supported_prompt "Build reproducibility is only supported on Ubuntu!" - fi -} - -echo_green "Validating build environment" -validate_build_env - echo_blue "Purging artifact directories" rm -rf "$BINARIES_DIR_FULL" rm -rf "$CANISTERS_DIR_FULL" rm -rf "$DISK_DIR_FULL" -echo_green "Building selected IC artifacts" -BAZEL_CMD="bazel build --config=local --ic_version='$VERSION' --ic_version_rc_only='$IC_VERSION_RC_ONLY' \ - --release_build=$RELEASE" - -BAZEL_CLEAN_CMD=$( - cat <<-END - # clear bazel cache - bazel clean -END -) - -BUILD_BINARIES_CMD=$( - cat <<-END - # build binaries - mkdir -p "$BINARIES_DIR" - $BAZEL_CMD //publish/binaries - bazel cquery --config=local --output=files //publish/binaries | xargs -I {} cp {} "$BINARIES_DIR" -END -) - -BUILD_CANISTERS_CMD=$( - cat <<-END - # build canisters - mkdir -p "$CANISTERS_DIR" - $BAZEL_CMD //publish/canisters - bazel cquery --config=local --output=files //publish/canisters | xargs -I {} cp {} "$CANISTERS_DIR" -END -) +BAZEL_TARGETS=() -BUILD_IMAGES_CMD=$( - cat <<-END - # build guestos images - mkdir -p "${DISK_DIR}/guestos" - $BAZEL_CMD //ic-os/guestos/envs/prod - bazel cquery --config=local --output=files //ic-os/guestos/envs/prod | xargs -I {} cp {} "${DISK_DIR}/guestos" - # build hostos images - mkdir -p "${DISK_DIR}/hostos" - $BAZEL_CMD //ic-os/hostos/envs/prod - bazel cquery --config=local --output=files //ic-os/hostos/envs/prod | xargs -I {} cp {} "${DISK_DIR}/hostos" - # build setupos images - mkdir -p "${DISK_DIR}/setupos" - $BAZEL_CMD //ic-os/setupos/envs/prod - bazel cquery --config=local --output=files //ic-os/setupos/envs/prod | xargs -I {} cp {} "${DISK_DIR}/setupos" -END +BAZEL_COMMON_ARGS=( + --config=local + --ic_version="$VERSION" + --ic_version_rc_only="$IC_VERSION_RC_ONLY" + --release_build="$RELEASE" ) -BUILD_CMD="${BAZEL_CLEAN_CMD}" -if "$BUILD_BIN"; then BUILD_CMD="${BUILD_CMD}${BUILD_BINARIES_CMD}"; fi -if "$BUILD_CAN"; then BUILD_CMD="${BUILD_CMD}${BUILD_CANISTERS_CMD}"; fi -if "$BUILD_IMG"; then BUILD_CMD="${BUILD_CMD}${BUILD_IMAGES_CMD}"; fi +if "$BUILD_BIN"; then BAZEL_TARGETS+=("//publish/binaries:compute_checksums"); fi +if "$BUILD_CAN"; then BAZEL_TARGETS+=("//publish/canisters:compute_checksums"); fi +if "$BUILD_IMG"; then BAZEL_TARGETS+=( + "//ic-os/guestos/envs/prod:compute_checksums" + "//ic-os/hostos/envs/prod:compute_checksums" + "//ic-os/setupos/envs/prod:compute_checksums" +); fi + +echo_blue "Bazel targets: ${BAZEL_TARGETS[*]}" + +bazel build "${BAZEL_COMMON_ARGS[@]}" "${BAZEL_TARGETS[@]}" + +query="$(join_by "+" "${BAZEL_TARGETS[@]}")" + +for artifact in $(bazel cquery "${BAZEL_COMMON_ARGS[@]}" --output=files "$query"); do + target_dir= + case "$artifact" in + *guestos*) + target_dir="$DISK_DIR/guestos" + ;; + *hostos*) + target_dir="$DISK_DIR/hostos" + ;; + *setupos*) + target_dir="$DISK_DIR/setupos" + ;; + *binaries*) + target_dir="$BINARIES_DIR" + ;; + *canisters*) + target_dir="$CANISTERS_DIR" + ;; + *) + echo "don't know where to put artifact '$artifact'" + exit 1 + ;; + esac -if is_inside_DFINITY_container; then - echo_blue "Building already inside a DFINITY container or CI" - eval "$BUILD_CMD" -else - echo_blue "Building by using a new DFINITY container" - "$ROOT_DIR"/ci/container/container-run.sh bash -c "$BUILD_CMD" -fi + mkdir -p "$target_dir" + cp "$artifact" "$target_dir" +done if "$BUILD_BIN"; then echo_green "##### Binaries SHA256SUMS #####" - pushd "$BINARIES_DIR_FULL" - GLOBIGNORE="SHA256SUMS" - # shellcheck disable=SC2035 - sha256sum -b *.gz | tee SHA256SUMS - popd + pushd "$BINARIES_DIR_FULL" >/dev/null + cat SHA256SUMS + popd >/dev/null fi if "$BUILD_CAN"; then echo_green "##### Canisters SHA256SUMS #####" pushd "$CANISTERS_DIR_FULL" - # shellcheck disable=SC2035 - sha256sum -b *.gz | tee SHA256SUMS - # neuron voters need to verify against the unzipped SHA256SUM - TMP="$(mktemp -d)" - cp *.gz "$TMP/" - cd "$TMP" - gunzip * - # shellcheck disable=SC2035 - sha256sum * + cat SHA256SUMS popd - rm -fr "$TMP" fi if "$BUILD_IMG"; then echo_green "##### GUESTOS SHA256SUMS #####" - pushd "$DISK_DIR_FULL/guestos" - # shellcheck disable=SC2035 - sha256sum -b *.tar.* | tee SHA256SUMS - popd + pushd "$DISK_DIR_FULL/guestos" >/dev/null + cat SHA256SUMS + popd >/dev/null echo_green "##### HOSTOS SHA256SUMS #####" - pushd "$DISK_DIR_FULL/hostos" - # shellcheck disable=SC2035 - sha256sum -b *.tar.* | tee SHA256SUMS - popd + pushd "$DISK_DIR_FULL/hostos" >/dev/null + cat SHA256SUMS + popd >/dev/null echo_green "##### SETUPOS SHA256SUMS #####" - pushd "$DISK_DIR_FULL/setupos" - # shellcheck disable=SC2035 - sha256sum -b *.tar.* | tee SHA256SUMS - popd + pushd "$DISK_DIR_FULL/setupos" >/dev/null + cat SHA256SUMS + popd >/dev/null fi -echo_green "Build complete for revision $(git rev-parse HEAD)" +echo_green "Build complete for revision $VERSION" diff --git a/ci/scripts/build-determinism.sh b/ci/scripts/build-determinism.sh index 8c89a3c5e01..01a1ca39a57 100755 --- a/ci/scripts/build-determinism.sh +++ b/ci/scripts/build-determinism.sh @@ -1,57 +1,36 @@ #!/usr/bin/env bash -set -eExuo pipefail +set -euo pipefail -# bazel-targets file is expected from bazel-test-all CI job -if [ ! -e bazel-targets ]; then - echo "Missing 'bazel-targets' file!" - exit 1 +VERSION="$(git rev-parse HEAD)" + +# PATH0 +mkdir -p "$PATH0" +if ! curl -sfS --retry 5 --retry-delay 10 \ + "https://download.dfinity.systems/ic/$VERSION/$PATH0/SHA256SUMS" \ + -o "$PATH0/SHA256SUMS"; then + + # workaround until we have a better way to pass SHA256SUMS files around + echo "Assuming artifacts were not rebuilt" + exit 0 fi -if grep -q "$TARGET" bazel-targets || grep -qF "//..." bazel-targets; then - VERSION="$(git rev-parse HEAD)" - - # build-ic.tar with SHA256SUMS files is expected from build-ic CI job - if [ ! -e build-ic.tar ]; then - echo "Missing 'build-ic.tar' file!" - exit 1 - fi - - # PATH0 - mkdir -p "$PATH0" - curl -sfS --retry 5 --retry-delay 10 \ - "https://download.dfinity.systems/ic/$VERSION/$PATH0/SHA256SUMS" \ - -o "$PATH0/SHA256SUMS" - - # PATH1 - tar -xf build-ic.tar - - # ignore *.wasm.gz.did files - sed -i -e '/.wasm.gz.did/d' "$PATH0/SHA256SUMS" "$PATH1/SHA256SUMS" - # TODO(IDX): remove when issue is identified and addressed - # https://gitlab.com/dfinity-lab/public/ic/-/snippets/3697069 - sed -i -e '/wasm.wasm.gz/d' "$PATH0/SHA256SUMS" "$PATH1/SHA256SUMS" - # TODO(IDX): remove when issue is identified and addressed - # https://gitlab.com/dfinity-lab/public/ic/-/snippets/3704313 - sed -i -e '/genesis-token-canister.wasm.gz/d' "$PATH0/SHA256SUMS" "$PATH1/SHA256SUMS" - - # for hostos / guestos we only care about update-img - if [ "${DISKIMG:-}" != "true" ]; then - sed -i -e '/disk-img/d' "$PATH0/SHA256SUMS" "$PATH1/SHA256SUMS" - fi - - if ! diff -u "$PATH0/SHA256SUMS" "$PATH1/SHA256SUMS"; then - set -x - cat build-ic/info - echo "Build Determinism Check Failed!" - echo "Contact IDX or investigate by yourself using diffoscope:" - echo " * [bazel-test-all]: curl -sfS https://download.dfinity.systems/ic/$VERSION/$PATH0/ -O" - echo " * [build-ic]: curl $(cat build-ic/url) -O" - echo "See info for pull the artifacts from both CI jobs above. Specify based on logs (e.g. 'ic-admin.gz', 'disk-img.tar.zst')." - echo "Note that [build-ic] artifacts.tar contains all the build artifacts (binaries, canisters and IC images)." - set +x - exit 1 - else - echo "Build Determinism Check Successful" - fi +# ignore *.wasm.gz.did files (these are checksummed by upload_artifacts but +# not by build-ic.sh) +sed -i -e '/.wasm.gz.did/d' "$PATH0/SHA256SUMS" "$PATH1/SHA256SUMS" + +# for hostos / guestos we only care about update-img +sed -i -e '/disk-img/d' "$PATH0/SHA256SUMS" "$PATH1/SHA256SUMS" + +if ! diff -u "$PATH0/SHA256SUMS" "$PATH1/SHA256SUMS"; then + cat build-ic/info + echo "Build Determinism Check Failed!" + echo "Contact IDX or investigate by yourself using diffoscope:" + echo " * [bazel-test-all]: curl -sfS https://download.dfinity.systems/ic/$VERSION/$PATH0/ -O" + echo " * [build-ic]: curl $(cat build-ic/url) -O" + echo "See info for pull the artifacts from both CI jobs above. Specify based on logs (e.g. 'ic-admin.gz', 'disk-img.tar.zst')." + echo "Note that [build-ic] artifacts.tar contains all the build artifacts (binaries, canisters and IC images)." + exit 1 fi + +echo "Build Determinism Check Successful" diff --git a/ci/scripts/run-build-ic.sh b/ci/scripts/run-build-ic.sh index ae970e7bd16..230e51e4b4a 100755 --- a/ci/scripts/run-build-ic.sh +++ b/ci/scripts/run-build-ic.sh @@ -43,7 +43,7 @@ elif [[ "${RUN_ON_DIFF_ONLY:-}" == "true" ]]; then exit 1 fi echo "No changes that require building IC-OS, binaries or canisters." - touch build-ic.tar + tar -cf build-ic.tar -T /dev/null # create empty tar exit 0 fi ci/container/build-ic.sh "${ARGS[@]}" diff --git a/ci/tools/download b/ci/tools/download deleted file mode 100755 index aac83309278..00000000000 --- a/ci/tools/download +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -print_usage() { - cat >&2 <<-USAGE - usage: $0 [-h] [-c ] [-u ] files... - Download files from https://download.dfinity.systems - Options: - -h - print this help message - -c - git revision to use, default to autodetect from \$CI_COMMIT_SHA or from the current working tree - -u - base url to download from. Default is to autodetect. - files... - list of files to download. -USAGE -} - -download_file() { - if curl --fail --retry 5 --retry-delay 10 "${BASE_URL}/ic/${GIT_COMMIT}/$1"; then - return - fi - echo "Can't download $1" >&2 - exit 1 -} - -GIT_COMMIT="${CI_COMMIT_SHA:-$(git rev-parse HEAD)}" - -while getopts 'hc:u:' flag; do - case "${flag}" in - c) - GIT_COMMIT="${OPTARG}" - ;; - u) - BASE_URL="${OPTARG}" - ;; - h | *) - print_usage - exit 1 - ;; - esac -done -shift $(($OPTIND - 1)) - -if [ -z "${GIT_COMMIT:-}" ]; then - echo "Can't detect git revision" >&2 - print_usage - exit 1 -fi - -if [ -z "${BASE_URL:-}" ]; then - BASE_URL="https://download.dfinity.systems" - PROXY_URL="http://download.proxy-global.dfinity.network:8080" - if curl --connect-timeout 5 --head "${PROXY_URL}" >&2; then - BASE_URL="${PROXY_URL}" - fi -fi - -for F in $@; do - download_file "${F}" -done diff --git a/hs/spec_compliance/BUILD.bazel b/hs/spec_compliance/BUILD.bazel index ab49b158474..7dd71a75581 100644 --- a/hs/spec_compliance/BUILD.bazel +++ b/hs/spec_compliance/BUILD.bazel @@ -127,7 +127,6 @@ haskell_binary( ":IC-Test-Spec", ":IC-Test-Spec-CanisterHistory", ":IC-Test-Spec-CanisterVersion", - ":IC-Test-Spec-HTTP", ":IC-Test-Spec-Timer", ":IC-Test-Spec-Utils", ":IC-Test-Universal", @@ -598,7 +597,6 @@ haskell_library( ":IC-Test-Agent-UserCalls", ":IC-Test-Spec-CanisterHistory", ":IC-Test-Spec-CanisterVersion", - ":IC-Test-Spec-HTTP", ":IC-Test-Spec-Timer", ":IC-Test-Spec-Utils", ":IC-Test-Universal", @@ -661,27 +659,6 @@ haskell_library( ], ) -haskell_library( - name = "IC-Test-Spec-HTTP", - srcs = ["src/IC/Test/Spec/HTTP.hs"], - src_strip_prefix = "src", - target_compatible_with = ["@platforms//os:linux"], - deps = STACK_DEPS + [ - ":IC-Constants", - ":IC-Id-Fresh", - ":IC-Management", - ":IC-Test-Agent", - ":IC-Test-Agent-SafeCalls", - ":IC-Test-Agent-UnsafeCalls", - ":IC-Test-Spec-Utils", - ":IC-Test-Universal", - ":IC-Types", - ":IC-Utils", - "@haskell-candid//:candid", - "@miracl-core//:lib", - ], -) - haskell_library( name = "IC-Test-Spec-CanisterVersion", srcs = ["src/IC/Test/Spec/CanisterVersion.hs"], diff --git a/hs/spec_compliance/src/IC/Test/Spec.hs b/hs/spec_compliance/src/IC/Test/Spec.hs index 8379bd5d8d2..5987093057f 100644 --- a/hs/spec_compliance/src/IC/Test/Spec.hs +++ b/hs/spec_compliance/src/IC/Test/Spec.hs @@ -48,7 +48,6 @@ import IC.Test.Agent.UnsafeCalls import IC.Test.Agent.UserCalls import IC.Test.Spec.CanisterHistory import IC.Test.Spec.CanisterVersion -import IC.Test.Spec.HTTP import IC.Test.Spec.Timer import IC.Test.Spec.Utils import IC.Test.Universal @@ -604,7 +603,6 @@ icTests my_sub other_sub conf = BS.length r1 @?= 32 BS.length r2 @?= 32 assertBool "random blobs are different" $ r1 /= r2, - testGroup "canister http outcalls" $ canister_http_calls my_sub httpbin_proto, testGroup "large calls" $ let arg n = BS.pack $ take n $ repeat 0 diff --git a/hs/spec_compliance/src/IC/Test/Spec/HTTP.hs b/hs/spec_compliance/src/IC/Test/Spec/HTTP.hs deleted file mode 100644 index 60e123ad5d2..00000000000 --- a/hs/spec_compliance/src/IC/Test/Spec/HTTP.hs +++ /dev/null @@ -1,469 +0,0 @@ -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE NamedFieldPuns #-} -{-# LANGUAGE NumericUnderscores #-} -{-# LANGUAGE OverloadedLabels #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE TupleSections #-} -{-# LANGUAGE TypeApplications #-} - --- | --- --- This module contains a test suite for the Internet Computer -module IC.Test.Spec.HTTP (canister_http_calls) where - -import qualified Codec.Candid as Candid -import Data.Aeson -import qualified Data.Aeson.Key as K -import qualified Data.Aeson.KeyMap as KM -import qualified Data.ByteString.Lazy as BS -import qualified Data.ByteString.Lazy.UTF8 as BLU -import Data.Char -import Data.List -import Data.Maybe -import Data.Row as R -import qualified Data.Text as T -import qualified Data.Vector as Vec -import Data.Word -import IC.Constants -import IC.Id.Fresh -import IC.Management (HttpHeader, HttpResponse) -import IC.Test.Agent -import IC.Test.Agent.SafeCalls -import IC.Test.Agent.UnsafeCalls -import IC.Test.Spec.Utils -import IC.Test.Universal -import IC.Types (EntityId (..), TestSubnetConfig) -import IC.Utils -import Test.Tasty -import Test.Tasty.HUnit - --- * Helpers - -charFromInt :: Int -> Char -charFromInt n = chr $ n + ord 'a' - --- * Canister http calls - -check_distinct_headers :: Vec.Vector HttpHeader -> Bool -check_distinct_headers v = length xs == length (nub xs) - where - xs = map (\r -> T.toLower $ r .! #name) $ Vec.toList v - -http_headers_to_map :: Vec.Vector HttpHeader -> T.Text -> Maybe T.Text -http_headers_to_map v n = lookup n $ map_to_lower $ map (\r -> (r .! #name, r .! #value)) $ Vec.toList v - -map_to_lower :: [(T.Text, T.Text)] -> [(T.Text, T.Text)] -map_to_lower = map (\(n, v) -> (T.toLower n, v)) - -check_http_response :: HttpResponse -> IO () -check_http_response resp = do - assertBool "HTTP response header names must be distinct" $ check_distinct_headers (resp .! #headers) - assertBool "HTTP header \"content-length\" must contain the length of the body" $ - case h (T.pack "content-length") of - Nothing -> False - Just l -> l == (T.pack $ show $ BS.length $ resp .! #body) - where - h = http_headers_to_map $ resp .! #headers - -newtype HttpRequestHeaders = HttpRequestHeaders [(T.Text, T.Text)] - -newtype HttpRequestBody = HttpRequestBody BS.ByteString - deriving (Eq) - -data HttpRequest = HttpRequest - { method :: T.Text, - headers :: HttpRequestHeaders, - body :: HttpRequestBody - } - -instance FromJSON HttpRequest where - parseJSON (Object v) = - HttpRequest - <$> v - .: "method" - <*> v - .: "headers" - <*> v - .: "data" - parseJSON _ = error "unsupported" - -instance FromJSON HttpRequestHeaders where - parseJSON (Object v) = - do - let r = - foldr - ( \(k, v) r -> case v of - String s -> fmap (\hs -> (K.toText k, s) : hs) r - _ -> Nothing - ) - (Just []) - (KM.toList v) - case r of - Nothing -> error "unsupported" - Just hs -> return $ HttpRequestHeaders hs - parseJSON _ = error "unsupported" - -instance FromJSON HttpRequestBody where - parseJSON (String s) = return $ HttpRequestBody $ toUtf8 s - parseJSON _ = error "unsupported" - -list_subset :: (Eq a) => [a] -> [a] -> Bool -list_subset xs ys = all (\x -> elem x ys) xs - -headers_match :: [(T.Text, T.Text)] -> [(T.Text, T.Text)] -> Bool -headers_match xs ys = all (\x -> elem x ys) xs && all (\(n, v) -> elem (n, v) xs || n == "host" || n == "content-length" || n == "accept-encoding" || n == "user-agent" && v == "ic/1.0") ys - -check_http_json :: String -> [(T.Text, T.Text)] -> BS.ByteString -> Maybe HttpRequest -> Assertion -check_http_json _ _ _ Nothing = assertFailure "Could not parse the original HttpRequest from the response" -check_http_json m hs b (Just req) = do - assertBool "Wrong HTTP method" $ T.pack m == method req - assertBool "Headers were not properly included in the HTTP request" $ headers_match (map_to_lower hs) (case headers req of HttpRequestHeaders hs -> map_to_lower hs) - assertBool "Body was not properly included in the HTTP request" $ HttpRequestBody b == body req - -check_http_body :: BS.ByteString -> Bool -check_http_body = aux . fromUtf8 - where - aux Nothing = False - aux (Just s) = all ((==) 'x') $ T.unpack s - -canister_http_calls :: (HasAgentConfig) => TestSubnetConfig -> String -> [TestTree] -canister_http_calls sub httpbin_proto = - let (_, _, _, ((ecid_as_word64, _) : _), _) = sub - in let ecid = rawEntityId $ wordToId ecid_as_word64 - in [ -- Corner cases - - simpleTestCase "invalid domain name" ecid $ \cid -> - ic_http_invalid_address_request' (ic00viaWithCyclesRefund 0 cid) sub "https://" "xwWPqqbNqxxHmLXdguF4DN9xGq22nczV.com" Nothing Nothing cid >>= isReject [2], - simpleTestCase "invalid IP address" ecid $ \cid -> - ic_http_invalid_address_request' (ic00viaWithCyclesRefund 0 cid) sub "https://" "240.0.0.0" Nothing Nothing cid >>= isReject [2], - -- "Currently, the GET, HEAD, and POST methods are supported for HTTP requests." - - simpleTestCase "GET call" ecid $ \cid -> do - let s = "hello_world" - resp <- ic_http_get_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("ascii/" ++ s) (Just 666) Nothing cid - (resp .! #status) @?= 200 - (resp .! #body) @?= BLU.fromString s - check_http_response resp, - simpleTestCase "POST call" ecid $ \cid -> do - let b = toUtf8 $ T.pack $ "Hello, world!" - let hs = [(T.pack "name1", T.pack "value1"), (T.pack "name2", T.pack "value2")] - resp <- ic_http_post_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto "anything" (Just 666) (Just b) (vec_header_from_list_text hs) Nothing cid - (resp .! #status) @?= 200 - check_http_response resp - check_http_json "POST" hs b $ (decode (resp .! #body) :: Maybe HttpRequest), - simpleTestCase "HEAD call" ecid $ \cid -> do - let n = 6666 - let b = toUtf8 $ T.pack $ replicate n 'x' - let hs = [(T.pack "name1", T.pack "value1"), (T.pack "name2", T.pack "value2")] - resp <- ic_http_head_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto "anything" (Just 666) (Just b) (vec_header_from_list_text hs) Nothing cid - (resp .! #status) @?= 200 - (resp .! #body) @?= (toUtf8 $ T.pack "") - assertBool "HTTP response header names must be distinct" $ check_distinct_headers (resp .! #headers) - let h = http_headers_to_map (resp .! #headers) "content-length" - assertBool ("content-length must be present and at least " ++ show n) $ - case h of - Nothing -> False - Just l -> (read (T.unpack l) :: Int) >= n, - -- "For security reasons, only HTTPS connections are allowed (URLs must start with https://)." - - testCase "url must start with https://" $ do - let s = "hello_world" - cid <- install ecid noop - ic_http_get_request' (ic00viaWithCyclesRefund 0 cid) sub "http://" ("ascii/" ++ s) Nothing Nothing cid >>= isReject [1], - -- "The size of an HTTP request from the canister is the total number of bytes representing the names and values of HTTP headers and the HTTP body. The maximal size for the request from the canister is 2MB (2,000,000B)." - - simpleTestCase "maximum possible request size" ecid $ \cid -> do - let hs = [(T.pack "name1", T.pack "value1"), (T.pack "name2", T.pack "value2"), (T.pack "content-type", T.pack "text/html; charset=utf-8")] - let len_hs = sum $ map (\(n, v) -> utf8_length n + utf8_length v) hs - let b = toUtf8 $ T.pack $ replicate (fromIntegral $ max_request_bytes_limit - len_hs) 'x' - resp <- ic_http_post_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto "request_size" Nothing (Just b) (vec_header_from_list_text hs) Nothing cid - (resp .! #status) @?= 200 - check_http_response resp - let n = read (T.unpack $ fromJust $ fromUtf8 (resp .! #body)) :: Word64 - assertBool ("Request size must be at least (the HTTP client can add more headers) " ++ show max_request_bytes_limit) $ n >= len_hs + fromIntegral (BS.length b), - simpleTestCase "maximum possible request size exceeded" ecid $ \cid -> do - let hs = [(T.pack "name1", T.pack "value1"), (T.pack "name2", T.pack "value2"), (T.pack "content-type", T.pack "text/html; charset=utf-8")] - let len_hs = sum $ map (\(n, v) -> utf8_length n + utf8_length v) hs - let b = toUtf8 $ T.pack $ replicate (fromIntegral $ max_request_bytes_limit - len_hs + 1) 'x' - ic_http_post_request' (\fee -> ic00viaWithCyclesRefund fee cid fee) sub httpbin_proto "request_size" Nothing (Just b) (vec_header_from_list_text hs) Nothing cid >>= isReject [4], - -- "The size of an HTTP response from the remote server is the total number of bytes representing the names and values of HTTP headers and the HTTP body. Each request can specify a maximal size for the response from the remote HTTP server." - - simpleTestCase "small maximum possible response size" ecid $ \cid -> do - let s = "hello_world" - {- Response headers (size: 158) - date: Jan 1 1970 00:00:00 GMT - content-type: application/octet-stream - content-length: 11 - access-control-allow-origin: * - access-control-allow-credentials: true - -} - let header_size = 143 - resp <- ic_http_get_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("ascii/" ++ s) (Just $ fromIntegral $ length s + header_size) Nothing cid - (resp .! #status) @?= 200 - (resp .! #body) @?= BLU.fromString s - check_http_response resp, - simpleTestCase "small maximum possible response size exceeded" ecid $ \cid -> do - let s = "hello_world" - {- Response headers (size: 158) - date: Jan 1 1970 00:00:00 GMT - content-type: application/octet-stream - content-length: 11 - access-control-allow-origin: * - access-control-allow-credentials: true - -} - let header_size = 143 - ic_http_get_request' (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("ascii/" ++ s) (Just $ fromIntegral $ length s + header_size - 1) Nothing cid >>= isReject [1], - simpleTestCase "small maximum possible response size (only headers)" ecid $ \cid -> do - {- Response headers (size: 157) - date: Jan 1 1970 00:00:00 GMT - content-type: application/octet-stream - content-length: 0 - access-control-allow-origin: * - access-control-allow-credentials: true - -} - let header_size = 142 - resp <- ic_http_get_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("equal_bytes/0") (Just header_size) Nothing cid - (resp .! #status) @?= 200 - (resp .! #body) @?= BS.empty - check_http_response resp, - simpleTestCase "small maximum possible response size (only headers) exceeded" ecid $ \cid -> do - {- Response headers (size: 157) - date: Jan 1 1970 00:00:00 GMT - content-type: application/octet-stream - content-length: 0 - access-control-allow-origin: * - access-control-allow-credentials: true - -} - let header_size = 142 - ic_http_get_request' (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("equal_bytes/0") (Just $ header_size - 1) Nothing cid >>= isReject [1], - -- "The upper limit on the maximal size for the response is 2MB (2,000,000B) and this value also applies if no maximal size value is specified." - - testCase "large maximum possible response size" $ do - {- Response headers (size: 163) - date: Jan 1 1970 00:00:00 GMT - content-type: application/octet-stream - content-length: 1999837 - access-control-allow-origin: * - access-control-allow-credentials: true - -} - let header_size = 148 - cid <- install ecid (onTransform (callback (replyData (bytes (Candid.encode dummyResponse))))) - resp <- ic_http_get_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("equal_bytes/" ++ show (max_response_bytes_limit - header_size)) Nothing (Just ("transform", "")) cid - (resp .! #status) @?= 202 - (resp .! #body) @?= "Dummy!" - check_http_response resp, - testCase "large maximum possible response size exceeded" $ do - {- Response headers (size: 163) - date: Jan 1 1970 00:00:00 GMT - content-type: application/octet-stream - content-length: 1999838 - access-control-allow-origin: * - access-control-allow-credentials: true - -} - let header_size = 148 - cid <- install ecid (onTransform (callback (replyData (bytes (Candid.encode dummyResponse))))) - ic_http_get_request' (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("equal_bytes/" ++ show (max_response_bytes_limit - header_size + 1)) Nothing (Just ("transform", "")) cid >>= isReject [1], - -- "The URL must be valid according to RFC-3986 and its length must not exceed 8192." - - simpleTestCase "non-ascii URL" ecid $ \cid -> do - ic_http_get_request' (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto "ascii/안녕하세요" Nothing Nothing cid >>= isReject [1], - simpleTestCase "maximum possible url size" ecid $ \cid -> do - resp <- ic_long_url_http_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto max_http_request_url_length Nothing cid - (resp .! #status) @?= 200 - assertBool "HTTP response body is malformed" $ check_http_body $ resp .! #body - check_http_response resp, - simpleTestCase "maximum possible url size exceeded" ecid $ \cid -> do - ic_long_url_http_request' (\fee -> ic00viaWithCyclesRefund fee cid fee) sub httpbin_proto (max_http_request_url_length + 1) Nothing cid >>= isReject [4], - -- "max_response_bytes - If provided, the value must not exceed 2MB (2,000,000B)." - - simpleTestCase "maximum possible value of max_response_bytes" ecid $ \cid -> do - let s = "hello_world" - resp <- ic_http_get_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("ascii/" ++ s) (Just max_response_bytes_limit) Nothing cid - (resp .! #status) @?= 200 - (resp .! #body) @?= BLU.fromString s - check_http_response resp, - simpleTestCase "maximum possible value of max_response_bytes exceeded" ecid $ \cid -> do - let s = "hello_world" - ic_http_get_request' (\fee -> ic00viaWithCyclesRefund fee cid fee) sub httpbin_proto ("ascii/" ++ s) (Just $ max_response_bytes_limit + 1) Nothing cid >>= isReject [4], - -- "transform - an optional record that includes a function that transforms raw responses to sanitized responses, and a byte-encoded context that is provided to the function upon invocation, along with the response to be sanitized." - - testCase "call with simple transform" $ do - let b = toUtf8 $ T.pack $ "Hello, world!" - let hs = vec_header_from_list_text [(T.pack "name1", T.pack "value1"), (T.pack "name2", T.pack "value2")] - cid <- install ecid (onTransform (callback (replyData (bytes (Candid.encode dummyResponse))))) - resp <- ic_http_post_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto "anything" (Just 666) (Just b) hs (Just ("transform", "")) cid - (resp .! #status) @?= 202 - (resp .! #body) @?= "Dummy!" - check_http_response resp, - testCase "reflect transform context" $ do - let s = "hello_world" - cid <- install ecid (onTransform (callback (replyData (getHttpReplyWithBody (getHttpTransformContext argData))))) - resp <- ic_http_get_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("ascii/" ++ s) Nothing (Just ("transform", "asdf")) cid - (resp .! #status) @?= 200 - (resp .! #body) @?= "asdf", - -- "If provided, the calling canister itself must export this (transform) function." - - testCase "non-existent transform function" $ do - let s = "hello_world" - cid <- install ecid noop - ic_http_get_request' (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("ascii/" ++ s) Nothing (Just ("nonExistent", "")) cid >>= isReject [5], - testCase "reference to a transform function exposed by another canister" $ do - let s = "hello_world" - cid <- install ecid noop - cid2 <- install ecid (onTransform (callback (replyData (bytes (Candid.encode dummyResponse))))) - ic_http_get_request' (\fee -> ic00viaWithCyclesRefund fee cid fee) sub httpbin_proto ("ascii/" ++ s) Nothing (Just ("transform", "")) cid2 >>= isReject [4], - -- "The maximal number of bytes representing the response produced by the transform function is 2MB (2,000,000B)." - - testCase "maximum possible canister response size" $ do - {- Response headers (size: 163) - date: Jan 1 1970 00:00:00 GMT - content-type: application/octet-stream - content-length: 1999837 - access-control-allow-origin: * - access-control-allow-credentials: true - -} - let header_size = 148 - let size = maximumSizeResponseBodySize - let new_pages = int $ size `div` (64 * 1024) + 1 - let max_size = int $ size - cid <- install ecid (onTransform (callback (ignore (stableGrow new_pages) >>> stableFill (int 0) (int 120) max_size >>> replyData (getHttpReplyWithBody (stableRead (int 0) max_size))))) - resp <- ic_http_get_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("equal_bytes/" ++ show (max_response_bytes_limit - header_size)) Nothing (Just ("transform", "")) cid - (resp .! #status) @?= 200 - (resp .! #body) @?= bodyOfSize maximumSizeResponseBodySize, - testCase "maximum possible canister response size exceeded" $ do - {- Response headers (size: 163) - date: Jan 1 1970 00:00:00 GMT - content-type: application/octet-stream - content-length: 1999837 - access-control-allow-origin: * - access-control-allow-credentials: true - -} - let header_size = 148 - let size = maximumSizeResponseBodySize + 1 - let new_pages = int $ size `div` (64 * 1024) + 1 - let max_size = int $ size - cid <- install ecid (onTransform (callback (ignore (stableGrow new_pages) >>> stableFill (int 0) (int 120) max_size >>> replyData (getHttpReplyWithBody (stableRead (int 0) max_size))))) - ic_http_get_request' (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("equal_bytes/" ++ show (max_response_bytes_limit - header_size)) Nothing (Just ("transform", "")) cid >>= isReject [1], - -- "When the transform function is invoked by the system due to a canister HTTP request, the caller's identity is the principal of the management canister." - - testCase "check caller of transform" $ do - let s = "hello_world" - cid <- install ecid (onTransform (callback (replyData (getHttpReplyWithBody (parsePrincipal caller))))) - resp <- ic_http_get_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("ascii/" ++ s) Nothing (Just ("transform", "caller")) cid - (resp .! #status) @?= 200 - (resp .! #body) @?= "aaaaa-aa", - -- "The following additional limits apply to HTTP requests and HTTP responses from the remote sever: the number of headers must not exceed 64." - - simpleTestCase "maximum number of request headers" ecid $ \cid -> do - let b = toUtf8 $ T.pack $ "Hello, world!" - let hs = [(T.pack ("name" ++ show i), T.pack ("value" ++ show i)) | i <- [0 .. http_headers_max_number - 1]] - resp <- ic_http_post_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto "anything" Nothing (Just b) (vec_header_from_list_text hs) Nothing cid - (resp .! #status) @?= 200 - check_http_response resp - check_http_json "POST" hs b $ (decode (resp .! #body) :: Maybe HttpRequest), - simpleTestCase "maximum number of request headers exceeded" ecid $ \cid -> do - let b = toUtf8 $ T.pack $ "Hello, world!" - let hs = [(T.pack ("name" ++ show i), T.pack ("value" ++ show i)) | i <- [0 .. http_headers_max_number]] - ic_http_post_request' (\fee -> ic00viaWithCyclesRefund fee cid fee) sub httpbin_proto "anything" Nothing (Just b) (vec_header_from_list_text hs) Nothing cid >>= isReject [4], - simpleTestCase "maximum number of response headers" ecid $ \cid -> do - {- These 5 response headers are always included: - date: Jan 1 1970 00:00:00 GMT - content-type: text/plain; charset=utf-8 - content-length: 0 - access-control-allow-origin: * - access-control-allow-credentials: true - -} - let n = http_headers_max_number - 5 - let hs = [(T.pack ("name" ++ show i), T.pack ("value" ++ show i)) | i <- [0 .. n - 1]] - resp <- ic_http_get_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("many_response_headers/" ++ show n) Nothing Nothing cid - (resp .! #status) @?= 200 - assertBool "Response HTTP headers have not been received properly." $ list_subset (map_to_lower hs) (map_to_lower $ http_response_headers resp) - check_http_response resp, - simpleTestCase "maximum number of response headers exceeded" ecid $ \cid -> do - {- These 5 response headers are always included: - date: Jan 1 1970 00:00:00 GMT - content-type: text/plain; charset=utf-8 - content-length: 0 - access-control-allow-origin: * - access-control-allow-credentials: true - -} - let n = http_headers_max_number - 5 + 1 - ic_http_get_request' (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("many_response_headers/" ++ show n) Nothing Nothing cid >>= isReject [1], - -- "The following additional limits apply to HTTP requests and HTTP responses from the remote sever: the number of bytes representing a header name must not exceed 8KiB." - - simpleTestCase "maximum request header name length" ecid $ \cid -> do - let b = toUtf8 $ T.pack $ "Hello, world!" - let hs = [(T.pack (replicate (fromIntegral http_headers_max_name_value_length) 'x'), T.pack ("value"))] - resp <- ic_http_post_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto "anything" Nothing (Just b) (vec_header_from_list_text hs) Nothing cid - (resp .! #status) @?= 200 - check_http_response resp - check_http_json "POST" hs b $ (decode (resp .! #body) :: Maybe HttpRequest), - simpleTestCase "maximum request header name length exceeded" ecid $ \cid -> do - let b = toUtf8 $ T.pack $ "Hello, world!" - let hs = [(T.pack (replicate (fromIntegral $ http_headers_max_name_value_length + 1) 'x'), T.pack ("value"))] - ic_http_post_request' (\fee -> ic00viaWithCyclesRefund fee cid fee) sub httpbin_proto "anything" Nothing (Just b) (vec_header_from_list_text hs) Nothing cid >>= isReject [4], - simpleTestCase "maximum response header name length" ecid $ \cid -> do - let n = http_headers_max_name_value_length - let hs = [(T.pack $ replicate (fromIntegral n) 'x', T.pack "value")] - resp <- ic_http_get_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("long_response_header_name/" ++ show n) Nothing Nothing cid - (resp .! #status) @?= 200 - assertBool "Response HTTP headers have not been received properly." $ list_subset (map_to_lower hs) (map_to_lower $ http_response_headers resp) - check_http_response resp, - simpleTestCase "maximum response header name length exceeded" ecid $ \cid -> do - let n = http_headers_max_name_value_length + 1 - ic_http_get_request' (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("long_response_header_name/" ++ show n) Nothing Nothing cid >>= isReject [1], - -- "The following additional limits apply to HTTP requests and HTTP responses from the remote sever: the number of bytes representing a header value must not exceed 8KiB." - - simpleTestCase "maximum request header value length" ecid $ \cid -> do - let b = toUtf8 $ T.pack $ "Hello, world!" - let hs = [(T.pack "name", T.pack (replicate (fromIntegral http_headers_max_name_value_length) 'x'))] - resp <- ic_http_post_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto "anything" Nothing (Just b) (vec_header_from_list_text hs) Nothing cid - (resp .! #status) @?= 200 - check_http_response resp - check_http_json "POST" hs b $ (decode (resp .! #body) :: Maybe HttpRequest), - simpleTestCase "maximum request header value length exceeded" ecid $ \cid -> do - let b = toUtf8 $ T.pack $ "Hello, world!" - let hs = [(T.pack "name", T.pack (replicate (fromIntegral $ http_headers_max_name_value_length + 1) 'x'))] - ic_http_post_request' (\fee -> ic00viaWithCyclesRefund fee cid fee) sub httpbin_proto "anything" Nothing (Just b) (vec_header_from_list_text hs) Nothing cid >>= isReject [4], - simpleTestCase "maximum response header value length" ecid $ \cid -> do - let n = http_headers_max_name_value_length - let hs = [(T.pack "name", T.pack $ replicate (fromIntegral n) 'x')] - resp <- ic_http_get_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("long_response_header_value/" ++ show n) Nothing Nothing cid - (resp .! #status) @?= 200 - assertBool "Response HTTP headers have not been received properly." $ list_subset (map_to_lower hs) (map_to_lower $ http_response_headers resp) - check_http_response resp, - simpleTestCase "maximum response header value length exceeded" ecid $ \cid -> do - let n = http_headers_max_name_value_length + 1 - ic_http_get_request' (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("long_response_header_value/" ++ show n) Nothing Nothing cid >>= isReject [1], - -- "The following additional limits apply to HTTP requests and HTTP responses from the remote sever: the total number of bytes representing the header names and values must not exceed 48KiB." - - simpleTestCase "maximum request total header size" ecid $ \cid -> do - let chunk = http_headers_max_name_value_length - assertBool ("Maximum number of bytes to represent all request header names and value is not divisible by " ++ show (2 * chunk)) (http_headers_max_total_size `mod` (2 * chunk) == 0) - assertBool ("Maximum number of bytes to represent all request header names and value exceeds " ++ show (2 * chunk * 26)) (http_headers_max_total_size `div` (2 * chunk) <= fromIntegral (min 26 http_headers_max_number)) - let n = http_headers_max_total_size `div` (2 * chunk) - let b = toUtf8 $ T.pack $ "Hello, world!" - let hs = [(T.pack $ [charFromInt i] ++ replicate (fromIntegral chunk - 1) 'x', T.pack $ replicate (fromIntegral chunk) 'x') | i <- [0 .. fromIntegral n - 1]] - resp <- ic_http_post_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto "anything" Nothing (Just b) (vec_header_from_list_text hs) Nothing cid - (resp .! #status) @?= 200 - check_http_response resp - check_http_json "POST" hs b $ (decode (resp .! #body) :: Maybe HttpRequest), - simpleTestCase "maximum request total header size exceeded" ecid $ \cid -> do - let chunk = http_headers_max_name_value_length - assertBool ("Maximum number of bytes to represent all request header names and value is not divisible by " ++ show (2 * chunk)) (http_headers_max_total_size `mod` (2 * chunk) == 0) - assertBool ("Maximum number of bytes to represent all request header names and value exceeds " ++ show (2 * chunk * 26)) (http_headers_max_total_size `div` (2 * chunk) <= fromIntegral (min 26 http_headers_max_number)) - let n = http_headers_max_total_size `div` (2 * chunk) - let b = toUtf8 $ T.pack $ "Hello, world!" - let hs = (T.pack "x", T.empty) : [(T.pack $ [charFromInt i] ++ replicate (fromIntegral chunk - 1) 'x', T.pack $ replicate (fromIntegral chunk) 'x') | i <- [0 .. fromIntegral n - 1]] - ic_http_post_request' (\fee -> ic00viaWithCyclesRefund fee cid fee) sub httpbin_proto "anything" Nothing (Just b) (vec_header_from_list_text hs) Nothing cid >>= isReject [4], - simpleTestCase "maximum response total header size" ecid $ \cid -> do - let n = http_headers_max_total_size - resp <- ic_http_get_request (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("large_response_total_header_size/" ++ show http_headers_max_name_value_length ++ "/" ++ show n) Nothing Nothing cid - (resp .! #status) @?= 200 - assertBool ("Total header size is not equal to " ++ show n) $ http_response_headers_total_size resp == n - check_http_response resp, - simpleTestCase "maximum response total header size exceeded" ecid $ \cid -> do - let n = http_headers_max_total_size + 1 - ic_http_get_request' (ic00viaWithCyclesRefund 0 cid) sub httpbin_proto ("large_response_total_header_size/" ++ show http_headers_max_name_value_length ++ "/" ++ show n) Nothing Nothing cid >>= isReject [1] - ] diff --git a/ic-os/bootloader/build-bootloader-tree.sh b/ic-os/bootloader/build-bootloader-tree.sh index 465b4d5e419..effaeab1b76 100755 --- a/ic-os/bootloader/build-bootloader-tree.sh +++ b/ic-os/bootloader/build-bootloader-tree.sh @@ -6,7 +6,15 @@ set -exo pipefail -while getopts "o:t:v:p:x:" OPT; do +cleanup() { + sudo podman --root "${TMPFS}" rm -f "${CONTAINER}" + rm -rf "${TMPDIR}" + sudo umount "${TMPFS}" + rm -rf "${TMPFS}" +} +trap cleanup EXIT + +while getopts "o:" OPT; do case "${OPT}" in o) OUT_FILE="${OPTARG}" @@ -18,16 +26,14 @@ while getopts "o:t:v:p:x:" OPT; do esac done -trap 'mountpoint "${TMPFS}" && sudo umount "${TMPFS}"; rm -rf "${TMPFS}"' exit TMPFS=$(mktemp -d /tmp/mytempdir.XXXXXX) sudo mount -t tmpfs tmpfs-podman "${TMPFS}" -trap 'rm -rf "${TMPDIR}"; sudo podman --root "${TMPFS}" rm -f "${CONTAINER}"' exit TMPDIR=$(mktemp -d -t build-image-XXXXXXXXXXXX) BASE_IMAGE="ghcr.io/dfinity/library/ubuntu@sha256:5d070ad5f7fe63623cbb99b4fc0fd997f5591303d4b03ccce50f403957d0ddc4" -sudo podman --root "${TMPFS}" build --iidfile ${TMPDIR}/iidfile - <<<" +sudo podman --root "${TMPFS}" build --iidfile "${TMPDIR}/iidfile" - <<<" FROM $BASE_IMAGE USER root:root RUN apt-get -y update && apt-get -y --no-install-recommends install grub-efi faketime @@ -44,10 +50,9 @@ sudo podman --root "${TMPFS}" build --iidfile ${TMPDIR}/iidfile - <<<" echo read ls cat png jpeg halt reboot loadenv lvm " -IMAGE=$(cat ${TMPDIR}/iidfile | cut -d':' -f2) +IMAGE_ID=$(cut -d':' -f2 <"${TMPDIR}/iidfile") -CONTAINER=$(sudo podman --root "${TMPFS}" run --network=host --cgroupns=host -d "$IMAGE") +CONTAINER=$(sudo podman --root "${TMPFS}" run --network=host --cgroupns=host -d "${IMAGE_ID}") -sudo podman --root "${TMPFS}" export "$CONTAINER" | tar -C "$TMPDIR" -x build --strip-components=1 +sudo podman --root "${TMPFS}" export "${CONTAINER}" | tar --strip-components=1 -C "${TMPDIR}" -x build tar cf "${OUT_FILE}" --sort=name --owner=root:0 --group=root:0 "--mtime=UTC 1970-01-01 00:00:00" -C "${TMPDIR}" boot -find "$TMPDIR/boot" -type f -exec sha256sum {} \; | sed "s|$TMPDIR||" diff --git a/ic-os/boundary-guestos/context/Dockerfile b/ic-os/boundary-guestos/context/Dockerfile index af748384095..8545b77d9e6 100644 --- a/ic-os/boundary-guestos/context/Dockerfile +++ b/ic-os/boundary-guestos/context/Dockerfile @@ -25,8 +25,8 @@ WORKDIR /tmp # Download and verify ic-gateway RUN \ - curl -L -O https://github.com/dfinity/ic-gateway/releases/download/v0.1.64/ic-gateway_0.1.64_amd64.deb && \ - echo "386ba2466454181fa4c3e8459945bcb86ee4e741ea69fb1ae11eb7a452366331 ic-gateway_0.1.64_amd64.deb" | sha256sum -c + curl -L -O https://github.com/dfinity/ic-gateway/releases/download/v0.1.65/ic-gateway_0.1.65_amd64.deb && \ + echo "c9b9cc6dabac4004d0f069fc08df5f5bfd8cecbb22c765815f5dca063c188bda ic-gateway_0.1.65_amd64.deb" | sha256sum -c # # Second build stage: @@ -56,9 +56,9 @@ FROM image-${BUILD_TYPE} USER root:root -COPY --from=download /tmp/ic-gateway_0.1.64_amd64.deb /tmp/ic-gateway_0.1.64_amd64.deb -RUN dpkg -i --force-confold /tmp/ic-gateway_0.1.64_amd64.deb && \ - rm /tmp/ic-gateway_0.1.64_amd64.deb +COPY --from=download /tmp/ic-gateway_0.1.65_amd64.deb /tmp/ic-gateway_0.1.65_amd64.deb +RUN dpkg -i --force-confold /tmp/ic-gateway_0.1.65_amd64.deb && \ + rm /tmp/ic-gateway_0.1.65_amd64.deb RUN mkdir -p /boot/config \ /boot/efi \ diff --git a/ic-os/boundary-guestos/context/docker-base.prod b/ic-os/boundary-guestos/context/docker-base.prod index b0cb024e9f6..b2f4b38d4dd 100644 --- a/ic-os/boundary-guestos/context/docker-base.prod +++ b/ic-os/boundary-guestos/context/docker-base.prod @@ -1 +1 @@ -ghcr.io/dfinity/boundaryos-base@sha256:cb82ecdd9e4f8bc2c15af749896eb6230c6f0d2186b4915f5eb39d03c8e26868 +ghcr.io/dfinity/boundaryos-base@sha256:844174c68720b11d731b8eac0f7ac95cb2758967d026244bb855a0487d629826 diff --git a/ic-os/components/boundary-guestos/etc/systemd/system/canary-proxy.service b/ic-os/components/boundary-guestos/etc/systemd/system/canary-proxy.service index a409cbe11d2..0e38d872a3c 100644 --- a/ic-os/components/boundary-guestos/etc/systemd/system/canary-proxy.service +++ b/ic-os/components/boundary-guestos/etc/systemd/system/canary-proxy.service @@ -17,8 +17,7 @@ ExecStart=/opt/ic/bin/canary-proxy \ Restart=always RestartSec=10 KillSignal=SIGINT -StartLimitBurst=5 -StartLimitInterval=0 +StartLimitIntervalSec=0 [Install] WantedBy=multi-user.target diff --git a/ic-os/components/boundary-guestos/etc/systemd/system/danted.service b/ic-os/components/boundary-guestos/etc/systemd/system/danted.service index 3e38ec79516..c45d9325642 100644 --- a/ic-os/components/boundary-guestos/etc/systemd/system/danted.service +++ b/ic-os/components/boundary-guestos/etc/systemd/system/danted.service @@ -3,8 +3,6 @@ Description=SOCKS (v4 and v5) proxy daemon (danted) Documentation=man:danted(8) man:danted.conf(5) Wants=network-online.target After=network-online.target -# We must wait for IC bootstrap to complete: It writes various -# state files and may also be needed to obtain network config. After=bootstrap-ic-node.service Wants=bootstrap-ic-node.service After=generate-dante-config.service diff --git a/ic-os/components/boundary-guestos/etc/systemd/system/setup-ssh-user-keys.service b/ic-os/components/boundary-guestos/etc/systemd/system/setup-ssh-user-keys.service index 3fdbbaa3db0..c3111749839 100644 --- a/ic-os/components/boundary-guestos/etc/systemd/system/setup-ssh-user-keys.service +++ b/ic-os/components/boundary-guestos/etc/systemd/system/setup-ssh-user-keys.service @@ -11,7 +11,7 @@ Type=oneshot RemainAfterExit=true ExecStart=/opt/ic/bin/setup-ssh-user-keys.sh -# All services that networking depends on log their outputs to the console -# and are piped to the host terminal if the verbose flag is enabled. +# All guestos services that networking depends on log their outputs to the +# console to be piped to the host terminal if the verbose flag is enabled. StandardOutput=journal+console StandardError=journal+console diff --git a/ic-os/components/boundary-guestos/opt/ic/bin/setup-ic-gateway.sh b/ic-os/components/boundary-guestos/opt/ic/bin/setup-ic-gateway.sh index 9315cd2bc7d..f18ec038651 100755 --- a/ic-os/components/boundary-guestos/opt/ic/bin/setup-ic-gateway.sh +++ b/ic-os/components/boundary-guestos/opt/ic/bin/setup-ic-gateway.sh @@ -133,6 +133,7 @@ POLICY_PRE_ISOLATION_CANISTERS="${RUN_DIR}/pre_isolation_canisters.txt" POLICY_DENYLIST_ALLOWLIST="${RUN_DIR}/allowlist.txt" POLICY_DENYLIST_SEED="${RUN_DIR}/denylist.json" DOMAIN_CANISTER_ALIAS="identity:rdmx6-jaaaa-aaaaa-aaadq-cai,nns:qoctq-giaaa-aaaaa-aaaea-cai" +DOMAIN_CUSTOM_PROVIDER="https://boundary.caffeine.ai/subdomains,https://beta.boundary.caffeine.ai/subdomains" GEOIP_DB="${RUN_DIR}/GeoLite2-Country.mmdb" IC_URL="http://127.0.0.1:9000" IC_ROOT_KEY="${ROOT_KEY}" diff --git a/ic-os/components/early-boot/initramfs-tools/hostos/modules b/ic-os/components/early-boot/initramfs-tools/hostos/modules index 56a282a1a4c..44298ded373 100644 --- a/ic-os/components/early-boot/initramfs-tools/hostos/modules +++ b/ic-os/components/early-boot/initramfs-tools/hostos/modules @@ -1,2 +1,3 @@ virtio_blk nvme +ahci diff --git a/ic-os/components/early-boot/save-machine-id/save-machine-id.service b/ic-os/components/early-boot/save-machine-id/save-machine-id.service index f5f6dfb2528..aa03a8e97d3 100644 --- a/ic-os/components/early-boot/save-machine-id/save-machine-id.service +++ b/ic-os/components/early-boot/save-machine-id/save-machine-id.service @@ -1,7 +1,6 @@ [Unit] Description=Save machine-id -Requires=boot-config.mount -After=boot-config.mount +RequiresMountsFor=/boot/config [Install] WantedBy=multi-user.target diff --git a/ic-os/components/hostos-scripts/monitoring/custom-metrics.service b/ic-os/components/hostos-scripts/monitoring/custom-metrics.service new file mode 100644 index 00000000000..3c4f392e489 --- /dev/null +++ b/ic-os/components/hostos-scripts/monitoring/custom-metrics.service @@ -0,0 +1,10 @@ +[Unit] +Description=Custom HostOS metrics +Before=node_exporter.service + +[Service] +Type=oneshot +ExecStart=/opt/ic/bin/custom-metrics.sh + +[Install] +WantedBy=multi-user.target diff --git a/ic-os/components/hostos-scripts/monitoring/custom-metrics.sh b/ic-os/components/hostos-scripts/monitoring/custom-metrics.sh new file mode 100644 index 00000000000..15ec8b2151b --- /dev/null +++ b/ic-os/components/hostos-scripts/monitoring/custom-metrics.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +set -e + +# Custom HostOS metrics + +source /opt/ic/bin/logging.sh +source /opt/ic/bin/metrics.sh + +MICROCODE_FILE="/sys/devices/system/cpu/cpu0/microcode/version" + +function update_microcode_metric() { + if [[ ! -r "${MICROCODE_FILE}" ]]; then + write_log "ERROR: Cannot read microcode version file: ${MICROCODE_FILE}" + return 1 + fi + + microcode=$(tr -d '\n' <"${MICROCODE_FILE}") + write_log "Found microcode version: ${microcode}" + write_metric_attr "node_cpu_microcode" \ + "{version=\"${microcode}\"}" \ + "1" \ + "CPU microcode version" \ + "gauge" +} + +function main() { + update_microcode_metric +} + +main diff --git a/ic-os/components/hostos-scripts/monitoring/monitor-nvme.service b/ic-os/components/hostos-scripts/monitoring/monitor-nvme.service index a96d42cc76c..ecf344886ee 100644 --- a/ic-os/components/hostos-scripts/monitoring/monitor-nvme.service +++ b/ic-os/components/hostos-scripts/monitoring/monitor-nvme.service @@ -1,7 +1,6 @@ [Unit] Description=Monitor NVMe SMART log info -Requires=node_exporter.service -After=node_exporter.service +Before=node_exporter.service [Service] Type=oneshot diff --git a/ic-os/components/hostos-scripts/monitoring/monitor-power.service b/ic-os/components/hostos-scripts/monitoring/monitor-power.service index 7241d157d1a..0877934df0b 100644 --- a/ic-os/components/hostos-scripts/monitoring/monitor-power.service +++ b/ic-os/components/hostos-scripts/monitoring/monitor-power.service @@ -1,7 +1,6 @@ [Unit] Description=Monitor power consumption -Requires=node_exporter.service -After=node_exporter.service +Before=node_exporter.service [Service] Type=oneshot diff --git a/ic-os/components/hostos.bzl b/ic-os/components/hostos.bzl index 7b9aa2f4a7f..f1f49775062 100644 --- a/ic-os/components/hostos.bzl +++ b/ic-os/components/hostos.bzl @@ -19,6 +19,8 @@ component_files = { Label("hostos-scripts/monitoring/monitor-guestos.sh"): "/opt/ic/bin/monitor-guestos.sh", Label("hostos-scripts/monitoring/monitor-guestos.service"): "/etc/systemd/system/monitor-guestos.service", Label("hostos-scripts/monitoring/monitor-guestos.timer"): "/etc/systemd/system/monitor-guestos.timer", + Label("hostos-scripts/monitoring/custom-metrics.sh"): "/opt/ic/bin/custom-metrics.sh", + Label("hostos-scripts/monitoring/custom-metrics.service"): "/etc/systemd/system/custom-metrics.service", Label("hostos-scripts/monitoring/monitor-nvme.sh"): "/opt/ic/bin/monitor-nvme.sh", Label("hostos-scripts/monitoring/monitor-nvme.service"): "/etc/systemd/system/monitor-nvme.service", Label("hostos-scripts/monitoring/monitor-nvme.timer"): "/etc/systemd/system/monitor-nvme.timer", diff --git a/ic-os/components/ic/generate-ic-config/generate-ic-config.service b/ic-os/components/ic/generate-ic-config/generate-ic-config.service index 1090975dfca..1aa59c2706e 100644 --- a/ic-os/components/ic/generate-ic-config/generate-ic-config.service +++ b/ic-os/components/ic/generate-ic-config/generate-ic-config.service @@ -1,13 +1,11 @@ [Unit] Description=Generate IC Configuration -# We must wait for IC bootstrap to complete: It writes various -# state files and may also be needed to obtain network config. After=bootstrap-ic-node.service Wants=bootstrap-ic-node.service -# We must also wait for storage permission fixup to have finished. +# We must wait for storage permission fixup to have finished. After=setup-permissions.service Wants=setup-permissions.service -# We must also wait for the network to become online: We must +# We must wait for the network to become online: We must # put the correct address(es) into the ic.json5, but in case # of dynamic assignment they only become available once all # network interfaces are up. @@ -17,11 +15,13 @@ Wants=network-online.target [Service] Type=oneshot ExecStart=/opt/ic/bin/generate-ic-config.sh -n /boot/config/network.conf -c /boot/config/nns.conf -b /boot/config/backup.conf -m /boot/config/malicious_behavior.conf -q /boot/config/query_stats.conf -t /boot/config/jaeger_addr.conf -i /opt/ic/share/ic.json5.template -o /run/ic-node/config/ic.json5 +Restart=on-failure +RestartSec=10 [Install] WantedBy=multi-user.target -# All services that networking depends on log their outputs to the console -# and are piped to the host terminal if the verbose flag is enabled. +# All guestos services that networking depends on log their outputs to the +# console to be piped to the host terminal if the verbose flag is enabled. StandardOutput=journal+console StandardError=journal+console \ No newline at end of file diff --git a/ic-os/components/ic/generate-ic-config/ic.json5.template b/ic-os/components/ic/generate-ic-config/ic.json5.template index 9bb90f72b34..04048ce4513 100644 --- a/ic-os/components/ic/generate-ic-config/ic.json5.template +++ b/ic-os/components/ic/generate-ic-config/ic.json5.template @@ -364,7 +364,7 @@ table ip6 filter {\n\ comment: "Default rule from template", direction: 1, }], - tcp_ports_for_node_whitelist: [2497, 4100, 8080], + tcp_ports_for_node_whitelist: [22, 2497, 4100, 8080], udp_ports_for_node_whitelist: [4100], ports_for_http_adapter_blacklist: [22, 2497, 4100, 7070, 8080, 9090, 9091, 9100, 19100, 19531], max_simultaneous_connections_per_ip_address: 1000, diff --git a/ic-os/components/ic/ic-btc-adapter/generate-btc-adapter-config.sh b/ic-os/components/ic/ic-btc-adapter/generate-btc-adapter-config.sh index 888415ff806..7fec33968a1 100755 --- a/ic-os/components/ic/ic-btc-adapter/generate-btc-adapter-config.sh +++ b/ic-os/components/ic/ic-btc-adapter/generate-btc-adapter-config.sh @@ -69,11 +69,9 @@ if [ "${SOCKS_FILE}" != "" -a -e "${SOCKS_FILE}" ]; then read_socks_proxy "${SOCKS_FILE}" fi -BITCOIN_NETWORK='"testnet"' -DNS_SEEDS='"testnet-seed.bitcoin.jonasschnelli.ch", - "seed.tbtc.petertodd.org", - "seed.testnet.bitcoin.sprovoost.nl", - "testnet-seed.bluematt.me"' +BITCOIN_NETWORK='"testnet4"' +DNS_SEEDS='"seed.testnet4.bitcoin.sprovoost.nl", + "seed.testnet4.wiz.biz"' if [ "$MAINNET" = true ]; then BITCOIN_NETWORK='"bitcoin"' diff --git a/ic-os/components/ic/ic-btc-adapter/ic-btc-mainnet-adapter.service b/ic-os/components/ic/ic-btc-adapter/ic-btc-mainnet-adapter.service index b65a8cae304..5ddebc5191b 100644 --- a/ic-os/components/ic/ic-btc-adapter/ic-btc-mainnet-adapter.service +++ b/ic-os/components/ic/ic-btc-adapter/ic-btc-mainnet-adapter.service @@ -1,7 +1,5 @@ [Unit] Description=IC Bitcoin Mainnet Adapter Service Provider -# We must wait for IC bootstrap to complete: It writes various -# state files and may also be needed to obtain network config. After=bootstrap-ic-node.service Wants=bootstrap-ic-node.service After=network-online.target @@ -16,7 +14,6 @@ User=ic-replica # socks_proxy.conf is not present for mainnet deployments and the socks_proxy defaults to 'socks5://socks5.ic0.app:1080' ExecStartPre=+/opt/ic/bin/generate-btc-adapter-config.sh -s /boot/config/socks_proxy.conf -m -o /run/ic-node/config/ic-btc-mainnet-adapter.json5 ExecStart=/opt/ic/bin/ic-btc-adapter /run/ic-node/config/ic-btc-mainnet-adapter.json5 -NotifyAccess=main Restart=always [Install] diff --git a/ic-os/components/ic/ic-btc-adapter/ic-btc-testnet-adapter.service b/ic-os/components/ic/ic-btc-adapter/ic-btc-testnet-adapter.service index 0c851b89ddb..5adeee58584 100644 --- a/ic-os/components/ic/ic-btc-adapter/ic-btc-testnet-adapter.service +++ b/ic-os/components/ic/ic-btc-adapter/ic-btc-testnet-adapter.service @@ -1,7 +1,5 @@ [Unit] Description=IC Bitcoin Testnet Adapter Service Provider -# We must wait for IC bootstrap to complete: It writes various -# state files and may also be needed to obtain network config. After=bootstrap-ic-node.service Wants=bootstrap-ic-node.service After=network-online.target @@ -15,7 +13,6 @@ Environment=RUST_BACKTRACE=1 # socks_proxy.conf is not present for mainnet deployments and the socks_proxy defaults to 'socks5://socks5.ic0.app:1080' ExecStartPre=+/opt/ic/bin/generate-btc-adapter-config.sh -b /boot/config/bitcoind_addr.conf -s /boot/config/socks_proxy.conf -o /run/ic-node/config/ic-btc-testnet-adapter.json5 ExecStart=/opt/ic/bin/ic-btc-adapter /run/ic-node/config/ic-btc-testnet-adapter.json5 -NotifyAccess=main Restart=always [Install] diff --git a/ic-os/components/ic/ic-crypto-csp/ic-crypto-csp.service b/ic-os/components/ic/ic-crypto-csp/ic-crypto-csp.service index 3d637927d83..d2e63f1bfcb 100644 --- a/ic-os/components/ic/ic-crypto-csp/ic-crypto-csp.service +++ b/ic-os/components/ic/ic-crypto-csp/ic-crypto-csp.service @@ -3,15 +3,12 @@ Description=IC Crypto Service Provider After=generate-ic-config.service Wants=generate-ic-config.service Requires=ic-crypto-csp.socket -StartLimitBurst=5 -StartLimitIntervalSec=5 [Service] UMask=066 User=ic-csp-vault Environment=RUST_BACKTRACE=1 ExecStart=/opt/ic/bin/ic-crypto-csp --replica-config-file /run/ic-node/config/ic.json5 -NotifyAccess=main Restart=always [Install] diff --git a/ic-os/components/ic/ic-https-outcalls-adapter/ic-https-outcalls-adapter.service b/ic-os/components/ic/ic-https-outcalls-adapter/ic-https-outcalls-adapter.service index d0f951c3feb..27496a76a02 100644 --- a/ic-os/components/ic/ic-https-outcalls-adapter/ic-https-outcalls-adapter.service +++ b/ic-os/components/ic/ic-https-outcalls-adapter/ic-https-outcalls-adapter.service @@ -1,7 +1,5 @@ [Unit] Description=IC Canister HTTP Provider -# We must wait for IC bootstrap to complete: It writes various -# state files and may also be needed to obtain network config. After=bootstrap-ic-node.service Wants=bootstrap-ic-node.service After=network-online.target @@ -14,7 +12,6 @@ User=ic-http-adapter Environment=RUST_BACKTRACE=1 ExecStartPre=+/opt/ic/bin/generate-https-outcalls-adapter-config.sh -s /boot/config/socks_proxy.conf -o /run/ic-node/config/ic-https-outcalls-adapter.json ExecStart=/opt/ic/bin/ic-https-outcalls-adapter /run/ic-node/config/ic-https-outcalls-adapter.json -NotifyAccess=main Restart=always [Install] diff --git a/ic-os/components/ic/ic-replica.service b/ic-os/components/ic/ic-replica.service index be0b53be3d3..fba2a18d238 100644 --- a/ic-os/components/ic/ic-replica.service +++ b/ic-os/components/ic/ic-replica.service @@ -6,8 +6,6 @@ Wants=generate-ic-config.service # Replica & orchestrator need ic-crypto-csp service running. After=ic-crypto-csp.service Wants=ic-crypto-csp.service -StartLimitBurst=5 -StartLimitIntervalSec=60 [Service] UMask=026 diff --git a/ic-os/components/ic/setup-permissions/setup-permissions.service b/ic-os/components/ic/setup-permissions/setup-permissions.service index 9d87725f03e..48fd03d85ff 100644 --- a/ic-os/components/ic/setup-permissions/setup-permissions.service +++ b/ic-os/components/ic/setup-permissions/setup-permissions.service @@ -1,11 +1,7 @@ [Unit] Description=Set up persistent storage permissions -# We must wait for IC bootstrap to complete (it may -# write the state files to begin with). After=bootstrap-ic-node.service Wants=bootstrap-ic-node.service -StartLimitBurst=5 -StartLimitIntervalSec=60 [Service] Type=oneshot diff --git a/ic-os/components/ic/share/ic-boundary.env b/ic-os/components/ic/share/ic-boundary.env index 52089c0d9df..2e103896c0b 100644 --- a/ic-os/components/ic/share/ic-boundary.env +++ b/ic-os/components/ic/share/ic-boundary.env @@ -11,12 +11,7 @@ RATE_LIMIT_GENERIC_AUTOSCALE="true" OBS_LOG_JOURNALD="true" OBS_METRICS_ADDR="[::]:9324" RATE_LIMIT_PER_SECOND_PER_SUBNET="1000" -BOUNCER_ENABLE="true" -BOUNCER_RATELIMIT="600" -BOUNCER_BURST_SIZE="1200" -BOUNCER_BAN_TIME="5m" -BOUNCER_MAX_BUCKETS="30000" -BOUNCER_BUCKET_TTL="1m" +BOUNCER_ENABLE="false" CACHE_SIZE="1GB" CACHE_MAX_ITEM_SIZE="10MB" CACHE_TTL="1s" diff --git a/ic-os/components/init/bootstrap-ic-node/bootstrap-ic-node.service b/ic-os/components/init/bootstrap-ic-node/bootstrap-ic-node.service index 055d549b920..7de875f8e41 100644 --- a/ic-os/components/init/bootstrap-ic-node/bootstrap-ic-node.service +++ b/ic-os/components/init/bootstrap-ic-node/bootstrap-ic-node.service @@ -1,12 +1,7 @@ [Unit] Description=Bootstrap the IC node After=upgrade-shared-data-store.service -Requires=var-lib-ic-data.mount -After=var-lib-ic-data.mount -Requires=var-lib-ic-crypto.mount -After=var-lib-ic-crypto.mount -Requires=var-lib-ic-backup.mount -After=var-lib-ic-backup.mount +RequiresMountsFor=/boot/config /var/lib/ic/data /var/lib/ic/crypto Before=setup-ssh-user-keys.service [Install] @@ -17,8 +12,10 @@ RequiredBy=setup-ssh-user-keys.service Type=oneshot RemainAfterExit=true ExecStart=/opt/ic/bin/bootstrap-ic-node.sh +Restart=on-failure +RestartSec=10 -# All services that networking depends on log their outputs to the console -# and are piped to the host terminal if the verbose flag is enabled. +# All guestos services that networking depends on log their outputs to the +# console to be piped to the host terminal if the verbose flag is enabled. StandardOutput=journal+console StandardError=journal+console diff --git a/ic-os/components/init/setup-encryption/setup-encryption.service b/ic-os/components/init/setup-encryption/setup-encryption.service index 71d7ee03624..f1caf08853c 100644 --- a/ic-os/components/init/setup-encryption/setup-encryption.service +++ b/ic-os/components/init/setup-encryption/setup-encryption.service @@ -1,8 +1,7 @@ [Unit] Description=Set up encrypted storage on first boot DefaultDependencies=no -After=boot-config.mount -Requires=boot-config.mount +RequiresMountsFor=/boot/config Before=cryptsetup-pre.target Wants=cryptsetup-pre.target diff --git a/ic-os/components/misc/vsock/vsock-agent.service b/ic-os/components/misc/vsock/vsock-agent.service index ee0d2f93911..6d1bd8c9c4a 100644 --- a/ic-os/components/misc/vsock/vsock-agent.service +++ b/ic-os/components/misc/vsock/vsock-agent.service @@ -2,14 +2,8 @@ Description=VSOCK agent daemon [Service] -User=root -Group=root ExecStart=/opt/ic/bin/vsock_host Restart=always -RestartSec=10 -KillSignal=SIGINT -StartLimitBurst=5 -StartLimitInterval=60 [Install] WantedBy=multi-user.target diff --git a/ic-os/components/monitoring/custom-metrics/metrics_tool.service b/ic-os/components/monitoring/custom-metrics/metrics_tool.service index 0d90361d4ae..33fa35cd173 100644 --- a/ic-os/components/monitoring/custom-metrics/metrics_tool.service +++ b/ic-os/components/monitoring/custom-metrics/metrics_tool.service @@ -1,37 +1,14 @@ [Unit] Description=Report custom metrics once per minute +Before=node_exporter.service [Service] Type=oneshot ExecStart=/opt/ic/bin/metrics_tool --metrics /run/node_exporter/collector_textfile/custom_metrics.prom -DeviceAllow=/dev/vda -IPAddressDeny=any -LockPersonality=yes -MemoryDenyWriteExecute=yes -NoNewPrivileges=yes -PrivateDevices=no -PrivateNetwork=yes -PrivateTmp=yes -PrivateUsers=no -ProtectClock=yes -ProtectControlGroups=yes -ProtectHome=yes -ProtectHostname=yes -ProtectKernelModules=yes -ProtectKernelTunables=yes -ProtectSystem=strict -ReadOnlyPaths=/proc/interrupts -ReadWritePaths=/run/node_exporter/collector_textfile -RestrictAddressFamilies=AF_UNIX -RestrictAddressFamilies=~AF_UNIX -RestrictNamespaces=yes -RestrictRealtime=yes -RestrictSUIDSGID=yes -SystemCallArchitectures=native -SystemCallErrorNumber=EPERM -SystemCallFilter=@system-service -UMask=022 # Disable systemd start and stop logs LogLevelMax=1 SyslogLevel=2 + +[Install] +WantedBy=multi-user.target diff --git a/ic-os/components/monitoring/filebeat/filebeat.service b/ic-os/components/monitoring/filebeat/filebeat.service index 8521cb392de..35b553c3b5c 100644 --- a/ic-os/components/monitoring/filebeat/filebeat.service +++ b/ic-os/components/monitoring/filebeat/filebeat.service @@ -3,8 +3,6 @@ Description=Filebeat ships systemd journal entries to Elasticsearch Documentation=https://www.elastic.co/beats/filebeat Wants=network-online.target After=network-online.target -# We must wait for IC bootstrap to complete: It writes various -# state files and may also be needed to obtain network config. After=bootstrap-ic-node.service Wants=bootstrap-ic-node.service # We must wait for var to be mounted over before interacting with it diff --git a/ic-os/components/monitoring/fstrim/fstrim_tool.service b/ic-os/components/monitoring/fstrim/fstrim_tool.service index 90962058406..95ddf11072d 100644 --- a/ic-os/components/monitoring/fstrim/fstrim_tool.service +++ b/ic-os/components/monitoring/fstrim/fstrim_tool.service @@ -1,5 +1,7 @@ [Unit] Description=Discard unused blocks on /var/lib/ic/crypto filesystem +After=setup-fstrim-metrics.service +Wants=setup-fstrim-metrics.service [Service] Type=oneshot diff --git a/ic-os/components/monitoring/metrics-proxy/guestos/metrics-proxy.yaml b/ic-os/components/monitoring/metrics-proxy/guestos/metrics-proxy.yaml index 9658cd932ef..d349f7c160d 100644 --- a/ic-os/components/monitoring/metrics-proxy/guestos/metrics-proxy.yaml +++ b/ic-os/components/monitoring/metrics-proxy/guestos/metrics-proxy.yaml @@ -20,6 +20,12 @@ proxies: - regex: artifact_pool_consensus_height_stat actions: - keep + - regex: mr_blocks_proposed_total + actions: + - keep + - regex: mr_blocks_not_proposed_total + actions: + - keep # Expose the GuestOS version to chainloaded HostOS metrics proxy. - listen_on: url: https://[::]:42372/metrics/guestos_node_exporter diff --git a/ic-os/components/monitoring/metrics-proxy/metrics-proxy.service b/ic-os/components/monitoring/metrics-proxy/metrics-proxy.service index 55d6775375b..9c6be8d806e 100644 --- a/ic-os/components/monitoring/metrics-proxy/metrics-proxy.service +++ b/ic-os/components/monitoring/metrics-proxy/metrics-proxy.service @@ -8,8 +8,6 @@ ExecStart=/opt/ic/bin/metrics-proxy /etc/metrics-proxy.yaml Restart=on-failure RestartSec=10 KillSignal=SIGINT -StartLimitBurst=5 -StartLimitInterval=60 LimitNOFILE=65536 [Install] diff --git a/ic-os/components/monitoring/nft-exporter/nft-exporter.service b/ic-os/components/monitoring/nft-exporter/nft-exporter.service index 6acb0df2f8d..ec3fe687757 100644 --- a/ic-os/components/monitoring/nft-exporter/nft-exporter.service +++ b/ic-os/components/monitoring/nft-exporter/nft-exporter.service @@ -1,5 +1,6 @@ [Unit] Description=Collect nft counters and write them to a file for node exporter +Before=node_exporter.service [Install] WantedBy=multi-user.target diff --git a/ic-os/components/monitoring/node_exporter/setup-node_exporter-keys/setup-node_exporter-keys.service b/ic-os/components/monitoring/node_exporter/setup-node_exporter-keys/setup-node_exporter-keys.service index 6a6ff2babf6..b9899a50ecf 100644 --- a/ic-os/components/monitoring/node_exporter/setup-node_exporter-keys/setup-node_exporter-keys.service +++ b/ic-os/components/monitoring/node_exporter/setup-node_exporter-keys/setup-node_exporter-keys.service @@ -1,6 +1,6 @@ [Unit] Description=Generate node_exporter TLS key pair on first boot -After=boot-config.mount +RequiresMountsFor=/boot/config Before=node_exporter.service [Install] diff --git a/ic-os/components/monitoring/setup-node-gen-status.service b/ic-os/components/monitoring/setup-node-gen-status.service index 1d8f1b70d8a..12af60ac735 100644 --- a/ic-os/components/monitoring/setup-node-gen-status.service +++ b/ic-os/components/monitoring/setup-node-gen-status.service @@ -1,6 +1,6 @@ [Unit] Description=Write node generation status -After=node_exporter.service +Before=node_exporter.service [Service] Type=oneshot diff --git a/ic-os/components/networking/generate-network-config/guestos/generate-network-config.service b/ic-os/components/networking/generate-network-config/guestos/generate-network-config.service index 98e00f951d9..ac95c22640c 100644 --- a/ic-os/components/networking/generate-network-config/guestos/generate-network-config.service +++ b/ic-os/components/networking/generate-network-config/guestos/generate-network-config.service @@ -12,8 +12,10 @@ WantedBy=multi-user.target Type=oneshot RemainAfterExit=true ExecStart=/opt/ic/bin/guestos_tool generate-network-config +Restart=on-failure +RestartSec=10 -# All services that networking depends on log their outputs to the console -# and are piped to the host terminal if the verbose flag is enabled. +# All guestos services that networking depends on log their outputs to the +# console to be piped to the host terminal if the verbose flag is enabled. StandardOutput=journal+console StandardError=journal+console diff --git a/ic-os/components/networking/generate-network-config/hostos/generate-network-config.service b/ic-os/components/networking/generate-network-config/hostos/generate-network-config.service index 7973e91b276..cb357d6c030 100644 --- a/ic-os/components/networking/generate-network-config/hostos/generate-network-config.service +++ b/ic-os/components/networking/generate-network-config/hostos/generate-network-config.service @@ -11,6 +11,8 @@ RemainAfterExit=true ExecStart=/opt/ic/bin/hostos_tool generate-network-config StandardOutput=journal+console StandardError=journal+console +Restart=on-failure +RestartSec=10 [Install] WantedBy=systemd-networkd.service diff --git a/ic-os/components/networking/generate-network-config/setupos/generate-network-config.service b/ic-os/components/networking/generate-network-config/setupos/generate-network-config.service index 4a966cf0dd3..be85dfec521 100644 --- a/ic-os/components/networking/generate-network-config/setupos/generate-network-config.service +++ b/ic-os/components/networking/generate-network-config/setupos/generate-network-config.service @@ -7,8 +7,8 @@ Before=setupos.service Type=oneshot RemainAfterExit=true ExecStart=/opt/ic/bin/output-wrapper.sh /dev/ttyS0 /opt/ic/bin/setupos_tool generate-network-config -StandardOutput=tty -StandardError=tty +StandardOutput=journal+console +StandardError=journal+console [Install] WantedBy=systemd-networkd.service diff --git a/ic-os/components/setupos-scripts/check-hardware.sh b/ic-os/components/setupos-scripts/check-hardware.sh index 67261c63216..e413647575e 100644 --- a/ic-os/components/setupos-scripts/check-hardware.sh +++ b/ic-os/components/setupos-scripts/check-hardware.sh @@ -1,5 +1,9 @@ #!/usr/bin/env bash +############################################################################### +# Environment & Script Setup +############################################################################### + set -o nounset set -o pipefail @@ -8,209 +12,205 @@ PATH="/sbin:/bin:/usr/sbin:/usr/bin" source /opt/ic/bin/functions.sh -GENERATION= +HARDWARE_GENERATION= -MINIMUM_CPU_SOCKETS=2 +############################################################################### +# Hardware Requirements +############################################################################### GEN1_CPU_MODEL="AMD EPYC 7302" GEN1_CPU_CAPABILITIES=("sev") GEN1_CPU_SOCKETS=2 GEN1_CPU_THREADS=64 +# Gen1 Dell has 10 * 3.2TB drives and Gen1 SuperMicro has 5 * 6.4 TB drives = 32TB +GEN1_MINIMUM_DISK_SIZE=3200000000000 +GEN1_MINIMUM_AGGREGATE_DISK_SIZE=32000000000000 GEN2_CPU_MODEL="AMD EPYC 7..3" GEN2_CPU_CAPABILITIES=("sev_snp") +GEN2_MINIMUM_CPU_SOCKETS=2 GEN2_MINIMUM_CPU_THREADS=64 - -# 510 GiB (Gibibyte) -MINIMUM_MEMORY_SIZE=547608330240 - # Gen2 has 5 * 6.4 TB drives = 32TB GEN2_MINIMUM_DISK_SIZE=6400000000000 GEN2_MINIMUM_AGGREGATE_DISK_SIZE=32000000000000 -# Dell 10 3.2TB and SuperMicro has 5 7.4 TB drives = 32TB -GEN1_MINIMUM_DISK_SIZE=3200000000000 -GEN1_MINIMUM_AGGREGATE_DISK_SIZE=32000000000000 +# Memory requirement for all nodes: 510 GB (just under the 512 GB publicly-listed requirement) +MINIMUM_MEMORY_SIZE=547608330240 -function check_generation() { - echo "* Checking Generation..." +############################################################################### +# Helper Functions +############################################################################### - local cpu="$(lshw -quiet -class cpu -json)" +function get_cpu_info_json() { + local cpu_json="$(lshw -quiet -class cpu -json)" log_and_halt_installation_on_error "${?}" "Unable to fetch CPU information." + echo "${cpu_json}" +} + +############################################################################### +# Hardware Generation Detection +############################################################################### + +function detect_hardware_generation() { + echo "* Detecting hardware generation..." + + local cpu_json="$(get_cpu_info_json)" - for i in $(echo "${cpu}" | jq -r '.[].id'); do - if [[ ${i} =~ .*:.* ]]; then - unit=$(echo ${i} | awk -F ':' '{ print $2 }') + for socket_id in $(echo "${cpu_json}" | jq -r '.[].id'); do + if [[ ${socket_id} =~ .*:.* ]]; then + unit=$(echo "${socket_id}" | awk -F ':' '{ print $2 }') else - unit=${i} + unit="${socket_id}" fi + echo "* Checking CPU socket ${unit}..." + local model=$(echo "${cpu_json}" | jq -r --arg socket "${socket_id}" '.[] | select(.id==$socket) | .product') - local model=$(echo "${cpu}" | jq -r --arg socket "${i}" '.[] | select(.id==$socket) | .product') if [[ ${model} =~ .*${GEN1_CPU_MODEL}.* ]]; then - if [[ ${GENERATION} =~ ^(|1)$ ]]; then - GENERATION=1 + if [[ ${HARDWARE_GENERATION} =~ ^(|1)$ ]]; then + HARDWARE_GENERATION=1 else - log_and_halt_installation_on_error "1" " CPU Socket Generations inconsistent." + log_and_halt_installation_on_error "1" "CPU Socket Hardware Generations inconsistent." fi elif [[ ${model} =~ .*${GEN2_CPU_MODEL}.* ]]; then - if [[ ${GENERATION} =~ ^(|2)$ ]]; then - GENERATION=2 + if [[ ${HARDWARE_GENERATION} =~ ^(|2)$ ]]; then + HARDWARE_GENERATION=2 else - log_and_halt_installation_on_error "1" " CPU Socket Generations inconsistent." + log_and_halt_installation_on_error "1" "CPU Socket Hardware Generations inconsistent." fi else - log_and_halt_installation_on_error "2" " CPU Model does NOT meet system requirements." + log_and_halt_installation_on_error "1" "CPU Model does NOT meet system requirements." fi done - echo "* Generation" ${GENERATION} "detected" + + echo "* Hardware generation ${HARDWARE_GENERATION} detected" } +############################################################################### +# CPU Verification +############################################################################### + function check_num_cpus() { - local num_cpu_sockets=$(lscpu | grep "Socket(s)" | awk '{print $2}') - if [ ${num_cpu_sockets} -ne ${MINIMUM_CPU_SOCKETS} ]; then - log_and_halt_installation_on_error "1" "Number of CPU's (${num_cpu_sockets}) does NOT meet system requirements (${MINIMUM_CPU_SOCKETS})." + local cpu_json="$1" + local required_sockets="$2" + + local num_cpu_sockets=$(echo "${cpu_json}" | jq -r '.[].id' | wc -l) + log_and_halt_installation_on_error "$?" "Unable to extract CPU sockets from CPU JSON." + + if [ "${num_cpu_sockets}" -lt "${required_sockets}" ]; then + log_and_halt_installation_on_error "1" "Number of CPU sockets (${num_cpu_sockets}) does NOT meet system requirements (expected ${required_sockets})." fi } -function verify_gen1_cpu() { - local cpu="$(lshw -quiet -class cpu -json)" - log_and_halt_installation_on_error "${?}" "Unable to fetch CPU information." +function verify_model_and_capabilities_for_all_sockets() { + local cpu_json="$1" + local required_model="$2" + shift 2 + local required_capabilities=("$@") - local sockets=$(echo "${cpu}" | jq -r '.[].id' | wc -l) - log_and_halt_installation_on_error "${?}" "Unable to extract CPU sockets." + for socket_id in $(echo "${cpu_json}" | jq -r '.[].id'); do + local unit=$(echo "${socket_id}" | awk -F ':' '{ print $2 }') - if [ ${sockets} -eq ${GEN1_CPU_SOCKETS} ]; then - echo " Number of sockets (${sockets}/${GEN1_CPU_SOCKETS}) meets system requirements." - else - log_and_halt_installation_on_error "1" " Number of sockets (${sockets}/${GEN1_CPU_SOCKETS}) does NOT meet system requirements." - fi - - for i in $(echo "${cpu}" | jq -r '.[].id'); do - unit=$(echo ${i} | awk -F ':' '{ print $2 }') echo "* Verifying CPU socket ${unit}..." - - local model=$(echo "${cpu}" | jq -r --arg socket "${i}" '.[] | select(.id==$socket) | .product') - if [[ ${model} =~ .*${GEN1_CPU_MODEL}.* ]]; then - echo " Model meets system requirements." + local model=$(echo "${cpu_json}" | jq -r --arg socket "${socket_id}" '.[] | select(.id==$socket) | .product') + if [[ ${model} =~ .*${required_model}.* ]]; then + echo "Model meets system requirements." else log_and_halt_installation_on_error "1" "Model does NOT meet system requirements.." fi echo "* Verifying CPU capabilities..." - for c in "${GEN1_CPU_CAPABILITIES[@]}"; do - local capability=$(echo "${cpu}" | jq -r --arg socket "${i}" --arg capability "${c}" '.[] | select(.id==$socket) | .capabilities[$capability]') - log_and_halt_installation_on_error "$?" "Capability '${c}' does NOT meet system requirements.." + for capability_name in "${required_capabilities[@]}"; do + local capability=$(echo "${cpu_json}" | jq -r \ + --arg socket "${socket_id}" \ + --arg capability "${capability_name}" \ + '.[] | select(.id==$socket) | .capabilities[$capability]') + log_and_halt_installation_on_error "$?" "Failed to query CPU capabilities" if [[ ${capability} =~ .*true.* ]]; then - echo " Capability '${c}' meets system requirements." + echo "Capability '${capability_name}' meets system requirements." else - log_and_halt_installation_on_error "$?" "Capability '${c}' does NOT meet system requirements.." + log_and_halt_installation_on_error "$?" "Capability '${capability_name}' does NOT meet system requirements.." fi done - - local num_threads=$(nproc) - if [ ${num_threads} -eq ${GEN1_CPU_THREADS} ]; then - echo " Number of threads (${num_threads}/${GEN1_CPU_THREADS}) meets system requirements." - else - log_and_halt_installation_on_error "1" "Number of threads (${num_threads}/${GEN1_CPU_THREADS}) does NOT meet system requirements." - fi done } -function verify_gen2_cpu() { - local cpu="$(lshw -quiet -class cpu -json)" - log_and_halt_installation_on_error "${?}" "Unable to fetch CPU information." +function verify_gen1_cpu() { + local cpu_json="$(get_cpu_info_json)" - check_num_cpus + check_num_cpus "${cpu_json}" "${GEN1_CPU_SOCKETS}" - for i in $(echo "${cpu}" | jq -r '.[].id'); do - unit=$(echo ${i} | awk -F ':' '{ print $2 }') - echo "* Verifying CPU socket ${unit}..." + verify_model_and_capabilities_for_all_sockets \ + "${cpu_json}" \ + "${GEN1_CPU_MODEL}" \ + "${GEN1_CPU_CAPABILITIES[@]}" - local model=$(echo "${cpu}" | jq -r --arg socket "${i}" '.[] | select(.id==$socket) | .product') - if [[ ${model} =~ .*${GEN2_CPU_MODEL}.* ]]; then - echo " Model meets system requirements." - else - log_and_halt_installation_on_error "1" "Model does NOT meet system requirements.." - fi + local num_threads=$(nproc) + if [ "${num_threads}" -eq "${GEN1_CPU_THREADS}" ]; then + echo "Number of threads (${num_threads}/${GEN1_CPU_THREADS}) meets system requirements." + else + log_and_halt_installation_on_error "1" "Number of threads (${num_threads}/${GEN1_CPU_THREADS}) does NOT meet system requirements." + fi +} - echo "* Verifying CPU capabilities..." - for c in "${GEN2_CPU_CAPABILITIES[@]}"; do - local capability=$(echo "${cpu}" | jq -r --arg socket "${i}" --arg capability "${c}" '.[] | select(.id==$socket) | .capabilities[$capability]') - log_and_halt_installation_on_error "$?" "Capability '${c}' does NOT meet system requirements.." +function verify_gen2_cpu() { + local cpu_json="$(get_cpu_info_json)" - if [[ ${capability} =~ .*true.* ]]; then - echo " Capability '${c}' meets system requirements." - else - log_and_halt_installation_on_error "$?" "Capability '${c}' does NOT meet system requirements.." - fi - done - done + check_num_cpus "${cpu_json}" "${GEN2_MINIMUM_CPU_SOCKETS}" + + verify_model_and_capabilities_for_all_sockets \ + "${cpu_json}" \ + "${GEN2_CPU_MODEL}" \ + "${GEN2_CPU_CAPABILITIES[@]}" local num_threads=$(nproc) - if [ ${num_threads} -lt ${GEN2_MINIMUM_CPU_THREADS} ]; then - log_and_halt_installation_on_error "1" "Number of threads (${num_threads}) does NOT meet system requirements (${GEN2_MINIMUM_CPU_THREADS})" + if [ "${num_threads}" -lt "${GEN2_MINIMUM_CPU_THREADS}" ]; then + log_and_halt_installation_on_error "1" "Number of threads (${num_threads}) does NOT meet system requirements (${GEN2_MINIMUM_CPU_THREADS})." fi } function verify_cpu() { - echo "* Verifying Generation" ${GENERATION} "CPU..." - if [[ ${GENERATION} == 1 ]]; then + echo "* Verifying hardware generation ${HARDWARE_GENERATION} CPU..." + + if [[ "${HARDWARE_GENERATION}" == "1" ]]; then verify_gen1_cpu else verify_gen2_cpu fi } +############################################################################### +# Memory Verification +############################################################################### + function verify_memory() { echo "* Verifying system memory..." local memory="$(lshw -quiet -class memory -json)" log_and_halt_installation_on_error "${?}" "Unable to fetch memory information." - local size=$(echo ${memory} | jq -r '.[] | select(.id=="memory") | .size') + local size=$(echo "${memory}" | jq -r '.[] | select(.id=="memory") | .size') log_and_halt_installation_on_error "${?}" "Unable to extract memory size." - if [ "${size}" -gt "${MINIMUM_MEMORY_SIZE}" ]; then - echo " Memory size (${size} bytes) meets system requirements." + if [ "${size}" -ge "${MINIMUM_MEMORY_SIZE}" ]; then + echo "Memory size (${size} bytes) meets system requirements." else log_and_halt_installation_on_error "1" "Memory size (${size} bytes/${MINIMUM_MEMORY_SIZE}) does NOT meet system requirements." fi } -function verify_gen1_disks() { - aggregate_size=0 - large_drives=($(get_large_drives)) - for drive in $(echo "${large_drives[@]}"); do - test -b "/dev/${drive}" - log_and_halt_installation_on_error "${?}" "Drive '/dev/${drive}' not found. Are all drives correctly installed?" - - local disk="$(lsblk --bytes --json /dev/${drive})" - log_and_halt_installation_on_error "${?}" "Unable to fetch disk information." +############################################################################### +# Disk Verification +############################################################################### - local disk_size=$(echo ${disk} | jq -r --arg logicalname "${drive}" '.[][] | select(.name==$logicalname) | .size') - log_and_halt_installation_on_error "${?}" "Unable to extract disk size." - - if [ "${disk_size}" -gt "${GEN1_MINIMUM_DISK_SIZE}" ]; then - echo " Disk size (${disk_size} bytes) meets system requirements." - else - log_and_halt_installation_on_error "1" "Disk size (${disk_size} bytes/${GEN1_MINIMUM_DISK_SIZE}) does NOT meet system requirements." - fi - aggregate_size=$((aggregate_size + disk_size)) - done - if [ "${aggregate_size}" -gt "${GEN1_MINIMUM_AGGREGATE_DISK_SIZE}" ]; then - echo " Aggregate Disk size (${aggregate_size} bytes) meets system requirements." - else - log_and_halt_installation_on_error "1" "Aggregate Disk size (${aggregate_size} bytes/${GEN1_MINIMUM_AGGREGATE_DISK_SIZE}) does NOT meet system requirements." - fi -} - -function verify_gen2_disks() { - aggregate_size=0 - large_drives=($(get_large_drives)) - for drive in $(echo "${large_drives[@]}"); do +function verify_disks_helper() { + local min_disk_size="${1}" + local min_aggregate_disk_size="${2}" + local aggregate_size=0 + local large_drives=($(get_large_drives)) + for drive in "${large_drives[@]}"; do echo "* Verifying disk ${drive}" test -b "/dev/${drive}" @@ -219,36 +219,44 @@ function verify_gen2_disks() { local disk="$(lsblk --bytes --json /dev/${drive})" log_and_halt_installation_on_error "${?}" "Unable to fetch disk information." - local disk_size=$(echo ${disk} | jq -r --arg logicalname "${drive}" '.[][] | select(.name==$logicalname) | .size') + local disk_size=$(echo "${disk}" | jq -r \ + --arg logicalname "${drive}" \ + '.[][] | select(.name==$logicalname) | .size') log_and_halt_installation_on_error "${?}" "Unable to extract disk size." - if [ "${disk_size}" -gt "${GEN2_MINIMUM_DISK_SIZE}" ]; then - echo " Disk size (${disk_size} bytes) meets system requirements." + if [ "${disk_size}" -ge "${min_disk_size}" ]; then + echo "Disk size (${disk_size} bytes) meets system requirements." else - log_and_halt_installation_on_error "1" "Disk size (${disk_size} bytes/${GEN2_MINIMUM_DISK_SIZE}) does NOT meet system requirements." + log_and_halt_installation_on_error "1" "Disk size (${disk_size} bytes/${min_disk_size}) does NOT meet system requirements." fi + aggregate_size=$((aggregate_size + disk_size)) done - if [ "${aggregate_size}" -gt "${GEN2_MINIMUM_AGGREGATE_DISK_SIZE}" ]; then - echo " Aggregate Disk size (${aggregate_size} bytes) meets system requirements." + + if [ "${aggregate_size}" -ge "${min_aggregate_disk_size}" ]; then + echo "Aggregate Disk size (${aggregate_size} bytes) meets system requirements." else - log_and_halt_installation_on_error "1" "Aggregate Disk size (${aggregate_size} bytes/${GEN2_MINIMUM_AGGREGATE_DISK_SIZE}) does NOT meet system requirements." + log_and_halt_installation_on_error "1" "Aggregate Disk size (${aggregate_size} bytes/${min_aggregate_disk_size}) does NOT meet system requirements." fi } function verify_disks() { echo "* Verifying disks..." - if [[ ${GENERATION} == 1 ]]; then - verify_gen1_disks + if [[ "${HARDWARE_GENERATION}" == "1" ]]; then + verify_disks_helper "${GEN1_MINIMUM_DISK_SIZE}" "${GEN1_MINIMUM_AGGREGATE_DISK_SIZE}" else - verify_gen2_disks + verify_disks_helper "${GEN2_MINIMUM_DISK_SIZE}" "${GEN2_MINIMUM_AGGREGATE_DISK_SIZE}" fi } +############################################################################### +# Deployment Path Verification +############################################################################### + function verify_deployment_path() { echo "* Verifying deployment path..." - if [[ ${GENERATION} == 2 ]] && [[ ! -f "${CONFIG_DIR}/node_operator_private_key.pem" ]]; then + if [[ "${HARDWARE_GENERATION}" == "2" ]] && [[ ! -f "/config/node_operator_private_key.pem" ]]; then echo -e "\n\n\n\n\n\n" echo -e "\033[1;31mWARNING: Gen2 hardware detected but no Node Operator Private Key found.\033[0m" echo -e "\033[1;31mGen2 hardware should be deployed using the Gen2 Node Deployment method.\033[0m" @@ -260,18 +268,20 @@ function verify_deployment_path() { fi } -# Establish run order +############################################################################### +# Main +############################################################################### + main() { log_start "$(basename $0)" if kernel_cmdline_bool_default_true ic.setupos.check_hardware; then - check_generation + detect_hardware_generation verify_cpu verify_memory verify_disks verify_deployment_path else echo "* Hardware checks skipped by request via kernel command line" - GENERATION=2 fi log_end "$(basename $0)" } diff --git a/ic-os/components/setupos-scripts/check-network.sh b/ic-os/components/setupos-scripts/check-network.sh index 67ac7e614c9..1b297b17471 100755 --- a/ic-os/components/setupos-scripts/check-network.sh +++ b/ic-os/components/setupos-scripts/check-network.sh @@ -9,6 +9,23 @@ PATH="/sbin:/bin:/usr/sbin:/usr/bin" source /opt/ic/bin/config.sh source /opt/ic/bin/functions.sh +function check_generate_network_config() { + if [ "$(systemctl is-failed generate-network-config.service)" = "failed" ]; then + local service_logs=$(systemctl status generate-network-config.service) + local network_settings=$(get_config_value '.network_settings') + local log_message="ERROR in generate-network-config.service + +generate-network-config.service logs: +${service_logs} + +Config network settings: +${network_settings} + +For more detailed generate-network-config.service logs, run \`\$ journalctl -u generate-network-config\`" + log_and_halt_installation_on_error "1" "${log_message}" + fi +} + function read_config_variables() { ipv6_prefix=$(get_config_value '.network_settings.ipv6_config.Deterministic.prefix') ipv6_gateway=$(get_config_value '.network_settings.ipv6_config.Deterministic.gateway') @@ -39,18 +56,18 @@ function eval_command_with_retries() { if [ ${exit_code} -ne 0 ]; then local ip6_output=$(ip -6 addr show) - local ip6_route_output=$(ip -6 route show) local dns_servers=$(grep 'nameserver' /etc/resolv.conf) + local network_settings=$(get_config_value '.network_settings') log_and_halt_installation_on_error "${exit_code}" "${error_message} Output of 'ip -6 addr show': ${ip6_output} -Output of 'ip -6 route show': -${ip6_route_output} - Configured DNS servers: -${dns_servers}" +${dns_servers} + +Config network settings: +${network_settings}" fi echo "${result}" @@ -209,6 +226,7 @@ function query_nns_nodes() { main() { log_start "$(basename $0)" if kernel_cmdline_bool_default_true ic.setupos.check_network; then + check_generate_network_config read_config_variables get_network_settings print_network_settings diff --git a/ic-os/components/ssh/setup-ssh-user-keys/setup-ssh-user-keys.service b/ic-os/components/ssh/setup-ssh-user-keys/setup-ssh-user-keys.service index 3fdbbaa3db0..c3111749839 100644 --- a/ic-os/components/ssh/setup-ssh-user-keys/setup-ssh-user-keys.service +++ b/ic-os/components/ssh/setup-ssh-user-keys/setup-ssh-user-keys.service @@ -11,7 +11,7 @@ Type=oneshot RemainAfterExit=true ExecStart=/opt/ic/bin/setup-ssh-user-keys.sh -# All services that networking depends on log their outputs to the console -# and are piped to the host terminal if the verbose flag is enabled. +# All guestos services that networking depends on log their outputs to the +# console to be piped to the host terminal if the verbose flag is enabled. StandardOutput=journal+console StandardError=journal+console diff --git a/ic-os/components/upgrade/shared-resources/monitor-expand-shared-data/monitor-expand-shared-data.service b/ic-os/components/upgrade/shared-resources/monitor-expand-shared-data/monitor-expand-shared-data.service index caf87c1e30d..851afb88174 100644 --- a/ic-os/components/upgrade/shared-resources/monitor-expand-shared-data/monitor-expand-shared-data.service +++ b/ic-os/components/upgrade/shared-resources/monitor-expand-shared-data/monitor-expand-shared-data.service @@ -1,7 +1,6 @@ [Unit] Description=Monitor and expand ic data storage logical volume -Requires=var-lib-ic-data.mount -After=var-lib-ic-data.mount +RequiresMountsFor=/var/lib/ic/data [Service] Type=simple diff --git a/ic-os/components/upgrade/shared-resources/upgrade-shared-data-store/upgrade-shared-data-store.service b/ic-os/components/upgrade/shared-resources/upgrade-shared-data-store/upgrade-shared-data-store.service index f516ebe3217..a7b2095c37f 100644 --- a/ic-os/components/upgrade/shared-resources/upgrade-shared-data-store/upgrade-shared-data-store.service +++ b/ic-os/components/upgrade/shared-resources/upgrade-shared-data-store/upgrade-shared-data-store.service @@ -1,8 +1,7 @@ [Unit] Description=Initialize node data storage DefaultDependencies=no -Requires=var-lib-ic-data.mount -After=var-lib-ic-data.mount +RequiresMountsFor=/var/lib/ic/data Before=setup-permissions.service [Install] @@ -13,7 +12,7 @@ Type=oneshot RemainAfterExit=true ExecStart=/opt/ic/bin/upgrade-shared-data-store.sh -# All services that networking depends on log their outputs to the console -# and are piped to the host terminal if the verbose flag is enabled. +# All guestos services that networking depends on log their outputs to the +# console to be piped to the host terminal if the verbose flag is enabled. StandardOutput=journal+console StandardError=journal+console diff --git a/ic-os/defs.bzl b/ic-os/defs.bzl index 79868126843..5fcaec78758 100644 --- a/ic-os/defs.bzl +++ b/ic-os/defs.bzl @@ -1,5 +1,12 @@ """ -A macro to build multiple versions of the ICOS image (i.e., dev vs prod) +A macro to build multiple versions of the ICOS image (i.e., dev vs prod). + +This macro defines the overall build process for ICOS images, including: + - Version management. + - Building bootloader, container, and filesystem images. + - Injecting variant-specific extra partitions via a custom mechanism. + - Assembling the final disk image and upload targets. + - Additional developer and test utilities. """ load("@bazel_skylib//rules:copy_file.bzl", "copy_file") @@ -47,19 +54,6 @@ def icos_build( image_deps = image_deps_func(mode, malicious) - # -------------------- Pre-check -------------------- - - # Verify that all the referenced components exist - native.genrule( - name = name + "_pre_check", - srcs = [k for k, v in image_deps["component_files"].items()], - outs = [name + "_pre_check_result.txt"], - cmd = """ - echo "Running pre_check for {name}" - echo "All paths exist" > $@ - """, - ) - # -------------------- Version management -------------------- copy_file( @@ -302,23 +296,22 @@ def icos_build( # -------------------- Assemble disk partitions --------------- - # Build a list of custom partitions with a function, to allow "injecting" build steps at this point - if "custom_partitions" not in image_deps: - custom_partitions = [] - else: - custom_partitions = image_deps["custom_partitions"]() + # Build a list of custom partitions to allow "injecting" variant-specific partition logic. + custom_partitions = image_deps.get("custom_partitions", lambda mode: [])(mode) + + partitions = [ + "//ic-os/bootloader:partition-esp.tzst", + ":partition-grub.tzst", + ":partition-boot.tzst", + ":partition-root.tzst", + ] + custom_partitions # -------------------- Assemble disk image -------------------- disk_image( name = "disk-img.tar", layout = image_deps["partition_table"], - partitions = [ - "//ic-os/bootloader:partition-esp.tzst", - ":partition-grub.tzst", - ":partition-boot.tzst", - ":partition-root.tzst", - ] + custom_partitions, + partitions = partitions, expanded_size = image_deps.get("expanded_size", default = None), tags = ["manual", "no-cache"], target_compatible_with = [ @@ -330,12 +323,7 @@ def icos_build( disk_image_no_tar( name = "disk.img", layout = image_deps["partition_table"], - partitions = [ - "//ic-os/bootloader:partition-esp.tzst", - ":partition-grub.tzst", - ":partition-boot.tzst", - ":partition-root.tzst", - ] + custom_partitions, + partitions = partitions, expanded_size = image_deps.get("expanded_size", default = None), tags = ["manual", "no-cache"], target_compatible_with = [ @@ -606,7 +594,6 @@ EOF name = name, testonly = malicious, srcs = [ - name + "_pre_check_result.txt", ":disk-img.tar.zst", ] + ([ ":update-img.tar.zst", diff --git a/ic-os/dev-tools/bare_metal_deployment/deploy.py b/ic-os/dev-tools/bare_metal_deployment/deploy.py index eec705da060..dd6d2685f78 100755 --- a/ic-os/dev-tools/bare_metal_deployment/deploy.py +++ b/ic-os/dev-tools/bare_metal_deployment/deploy.py @@ -308,7 +308,7 @@ class DeploymentError(Exception): def gen_failure(result: invoke.Result, bmc_info: BMCInfo) -> DeploymentError: - error_msg = f"Failed on {result.command}: {result.stderr}" + error_msg = f"Failure: {result.stderr}" return DeploymentError(OperationResult(bmc_info, success=False, error_msg=error_msg)) diff --git a/ic-os/guestos/context/docker-base.dev b/ic-os/guestos/context/docker-base.dev index fe6d201b10d..d44c83eab09 100644 --- a/ic-os/guestos/context/docker-base.dev +++ b/ic-os/guestos/context/docker-base.dev @@ -1 +1 @@ -ghcr.io/dfinity/guestos-base-dev@sha256:552ce1cfbd81142a58c4c57c26327bdf284512e50fc5afadbb4c80807072ca8c +ghcr.io/dfinity/guestos-base-dev@sha256:f5297fb2b6d5f607e954138aafbf55d9b6975c1702803e468d038cff1c16bd2e diff --git a/ic-os/guestos/context/docker-base.prod b/ic-os/guestos/context/docker-base.prod index e24bd9086e4..30d17a2289f 100644 --- a/ic-os/guestos/context/docker-base.prod +++ b/ic-os/guestos/context/docker-base.prod @@ -1 +1 @@ -ghcr.io/dfinity/guestos-base@sha256:61fd298190b4cc9aa3bfaa758c72a13df2c8a1a4741680eecd08c6579cbb6c9f +ghcr.io/dfinity/guestos-base@sha256:3c0e5d5c7c8c2d35341f875500c590768f4644cbcc4132bf635b49b57730e6b7 diff --git a/ic-os/guestos/defs.bzl b/ic-os/guestos/defs.bzl index aa2c7e36260..067c7e6de67 100644 --- a/ic-os/guestos/defs.bzl +++ b/ic-os/guestos/defs.bzl @@ -68,7 +68,7 @@ def image_deps(mode, malicious = False): "bootfs_size": "1G", # Add any custom partitions to the manifest - "custom_partitions": lambda: [Label("//ic-os/guestos:partition-config.tzst")], + "custom_partitions": lambda _: [Label("//ic-os/guestos:partition-config.tzst")], # We will install extra_boot_args onto the system, after substituting the # hash of the root filesystem into it. Track the template (before diff --git a/ic-os/guestos/envs/prod/BUILD.bazel b/ic-os/guestos/envs/prod/BUILD.bazel index 077dd9f155f..51108c16213 100644 --- a/ic-os/guestos/envs/prod/BUILD.bazel +++ b/ic-os/guestos/envs/prod/BUILD.bazel @@ -1,5 +1,6 @@ load("//ic-os:defs.bzl", "icos_build") load("//ic-os/guestos:defs.bzl", "image_deps") +load("//publish:defs.bzl", "checksum_rule") # The macro contains several targets. # Check @@ -11,3 +12,9 @@ icos_build( upload_prefix = "guest-os", visibility = ["//rs:ic-os-pkg"], ) + +# Export checksums & build artifacts +checksum_rule( + name = "compute_checksums", + inputs = [":prod"], +) diff --git a/ic-os/hostos/context/docker-base.dev b/ic-os/hostos/context/docker-base.dev index 93405bf0a1f..97ffe02b5df 100644 --- a/ic-os/hostos/context/docker-base.dev +++ b/ic-os/hostos/context/docker-base.dev @@ -1 +1 @@ -ghcr.io/dfinity/hostos-base-dev@sha256:507924b46e4f6afde0ee113c583cd793ed23e53d03b2554f37df67f7116d8da7 +ghcr.io/dfinity/hostos-base-dev@sha256:2ebb2e939b74cd9dca2843c138d9898261276d7d16148e1012a4bcad3cdd63fa diff --git a/ic-os/hostos/context/docker-base.prod b/ic-os/hostos/context/docker-base.prod index f7473152b35..d31d8be448b 100644 --- a/ic-os/hostos/context/docker-base.prod +++ b/ic-os/hostos/context/docker-base.prod @@ -1 +1 @@ -ghcr.io/dfinity/hostos-base@sha256:d3659cdf81694d0401f68ff081a9c56f0f1d290815670c3ba6c97ae9f3c7a853 +ghcr.io/dfinity/hostos-base@sha256:870c9381eec6a88dceaab5436663ba7d3458aef7cbbbec987b4a9ae654ce673d diff --git a/ic-os/hostos/defs.bzl b/ic-os/hostos/defs.bzl index f60ab207c02..888a2b4c4fe 100644 --- a/ic-os/hostos/defs.bzl +++ b/ic-os/hostos/defs.bzl @@ -85,7 +85,7 @@ def image_deps(mode, _malicious = False): # Inject a step building an LVM partition. This depends on boot and root built # earlier in the pipeline, and is depended on by the final disk image. -def _custom_partitions(): +def _custom_partitions(_): lvm_image( name = "partition-hostlvm.tzst", layout = Label("//ic-os/hostos:volumes.csv"), diff --git a/ic-os/hostos/envs/prod/BUILD.bazel b/ic-os/hostos/envs/prod/BUILD.bazel index d75dcb34418..ae355cdb2b3 100644 --- a/ic-os/hostos/envs/prod/BUILD.bazel +++ b/ic-os/hostos/envs/prod/BUILD.bazel @@ -1,5 +1,6 @@ load("//ic-os:defs.bzl", "icos_build") load("//ic-os/hostos:defs.bzl", "image_deps") +load("//publish:defs.bzl", "checksum_rule") # The macro contains several targets. # Check @@ -12,3 +13,9 @@ icos_build( visibility = ["//rs:ic-os-pkg"], vuln_scan = False, ) + +# Export checksums & build artifacts +checksum_rule( + name = "compute_checksums", + inputs = [":prod"], +) diff --git a/ic-os/setupos/context/docker-base.dev b/ic-os/setupos/context/docker-base.dev index 2c1a90478cb..07ba4c47ecf 100644 --- a/ic-os/setupos/context/docker-base.dev +++ b/ic-os/setupos/context/docker-base.dev @@ -1 +1 @@ -ghcr.io/dfinity/setupos-base-dev@sha256:d8059ce820b9722af5429a373e53b1694eed86d7447ed19492bb9ffdc9fb5690 +ghcr.io/dfinity/setupos-base-dev@sha256:4782662a93b050abe76dc498e1bf69d101a9db4a7239b63f032d7ec31db37125 diff --git a/ic-os/setupos/context/docker-base.prod b/ic-os/setupos/context/docker-base.prod index 8b586a2033b..6f11b282d74 100644 --- a/ic-os/setupos/context/docker-base.prod +++ b/ic-os/setupos/context/docker-base.prod @@ -1 +1 @@ -ghcr.io/dfinity/setupos-base@sha256:df342292a649f373a32971845b90fd966eb90b628ed0db9128c0b158a6575830 +ghcr.io/dfinity/setupos-base@sha256:813fc80661dee9d17d9f6375112acb17ef6f6220dd8d82741ecf9e8a3579a3e0 diff --git a/ic-os/setupos/defs.bzl b/ic-os/setupos/defs.bzl index 294c14cb3b6..29c4652a9b3 100644 --- a/ic-os/setupos/defs.bzl +++ b/ic-os/setupos/defs.bzl @@ -44,7 +44,7 @@ def image_deps(mode, _malicious = False): "extra_boot_args": Label("//ic-os/setupos/context:extra_boot_args"), # Add any custom partitions to the manifest - "custom_partitions": lambda: (_custom_partitions)(mode), + "custom_partitions": _custom_partitions, } dev_build_args = ["BUILD_TYPE=dev"] diff --git a/ic-os/setupos/envs/prod/BUILD.bazel b/ic-os/setupos/envs/prod/BUILD.bazel index 53f67a4d529..e5e46f56a45 100644 --- a/ic-os/setupos/envs/prod/BUILD.bazel +++ b/ic-os/setupos/envs/prod/BUILD.bazel @@ -1,6 +1,7 @@ load("//ic-os:defs.bzl", "icos_build") load("//ic-os/dev-tools/bare_metal_deployment:tools.bzl", "launch_bare_metal") load("//ic-os/setupos:defs.bzl", "image_deps") +load("//publish:defs.bzl", "checksum_rule") # The macro contains several targets. # Check @@ -18,3 +19,9 @@ launch_bare_metal( name = "launch_bare_metal", image_zst_file = ":disk-img.tar.zst", ) + +# Export checksums & build artifacts +checksum_rule( + name = "compute_checksums", + inputs = [":prod"], +) diff --git a/mainnet-canister-revisions.json b/mainnet-canister-revisions.json index 97762a62a50..2dd846598c2 100644 --- a/mainnet-canister-revisions.json +++ b/mainnet-canister-revisions.json @@ -60,24 +60,24 @@ "sha256": "9637743e1215a4db376a62ee807a0986faf20833be2b332df09b3d5dbdd7339e" }, "cycles-minting": { - "rev": "b5192581ccd35b67fe5a1f795ead9cbcd25956d6", - "sha256": "11c8dedd11741f05990498c90f925e9e37ad60647a65ef47caa59cdba234be6f" + "rev": "2d4bcba47ea10520ff21ce54a8acb9cdb0629317", + "sha256": "4e4a6f907a3b4720bfeb4c45c5027d9b1379deb840e4ba0217876df9a4c5b193" }, "genesis-token": { "rev": "4bed17bfc82cddc5691743db6228992cdc2740f4", "sha256": "fd25a4e2e283b498c3be1aaf63cc9b2726264d78a12b12f43ad453ceeb575e7c" }, "governance": { - "rev": "03393bc817da78cdc27190eaa388b8f6f8990365", - "sha256": "542cb59d9ba2b4ba43b0690a839cf1d51dd49582a53e55fbf535eb08a23a14c4" + "rev": "345790def6dfa93bcc317171c9733851d205802e", + "sha256": "15c9b8db9e54963d4f7075e1fd3bd6a0055dbe6981a2f6a54dd64114fdb0629f" }, "index": { "rev": "7c6309cb5bec7ab28ed657ac7672af08a59fc1ba", "sha256": "7b884231f230f5fc66ad18e0baaec0c14921bd5da742db5dbaf51f824b8dfc63" }, "ledger": { - "rev": "7c6309cb5bec7ab28ed657ac7672af08a59fc1ba", - "sha256": "a9ed1cb9dda555e0fc1038825eb7b3a6b366f17aa4b88575184c7537e864e551" + "rev": "6bc1943fc5bcff846959025c5f3f2f7f510489cf", + "sha256": "6dae518b33ef5814462ff921e81d13acd5e7a8f4e383ab849d87a33b0a608b08" }, "ledger_v1": { "rev": "6dcfafb491092704d374317d9a72a7ad2475d7c9", @@ -87,29 +87,33 @@ "rev": "dac2f36f96d7549d82fa8e3c714979255ce57afd", "sha256": "50c05fd687883fe788c0bb91996de358d8f856ba56088c6ff47767ea853001d7" }, + "ledger_v3": { + "rev": "7c6309cb5bec7ab28ed657ac7672af08a59fc1ba", + "sha256": "a9ed1cb9dda555e0fc1038825eb7b3a6b366f17aa4b88575184c7537e864e551" + }, "lifeline": { "rev": "b5192581ccd35b67fe5a1f795ead9cbcd25956d6", "sha256": "8c8eb285de53ca5609abd7dc41ba3ec8eeb67708b81469311fd670e6738d7d0a" }, "registry": { - "rev": "a5878586e47536d4cd47f0aadb66b73df8131d2b", - "sha256": "f0fb8fa545b2cc68f030b040e1182a8d004c4d4f4bb4341c9f1b432642c85bef" + "rev": "4f60863183c418782800fc8ffacf41be494a9a15", + "sha256": "c0e70561a26bcb4a2acee50c487335640bab9e7301f9970b08ac345a59075748" }, "root": { - "rev": "b5192581ccd35b67fe5a1f795ead9cbcd25956d6", - "sha256": "d3c702648ca4fb232f349bad7533c400c474a528abf62c05d4b100b4cdb91ce2" + "rev": "c5e098e8cc8e62249e6d7f4ed09e6c2ed87fc800", + "sha256": "304af3d8d330397d53eed7e8580810fb3ab303930bdf6fd3969c9109dd11b80e" }, "sns-wasm": { - "rev": "25c1bb0227d9970f5673b908817d7c4962b29911", - "sha256": "68f9fb37341d14a35735e10a0eb2471721b4cd75b6552ac11124aac559b05736" + "rev": "c5e098e8cc8e62249e6d7f4ed09e6c2ed87fc800", + "sha256": "6308fdd2d8bafb6a54ae995f0ff07118976dd75f6e2775fdf50349084a59b4b7" }, "sns_archive": { "rev": "c741e349451edf0c9792149ad439bb32a0161371", "sha256": "2b0970a84976bc2eb9591b68d44501566937994fa5594972f8aac9c8b058672f" }, "sns_governance": { - "rev": "03393bc817da78cdc27190eaa388b8f6f8990365", - "sha256": "5c43913c77f922a21f54b3422abf7cb43d369677e7668b7c8f91a429acd5c864" + "rev": "2d4bcba47ea10520ff21ce54a8acb9cdb0629317", + "sha256": "82edbcf511304b53e519965b4899266ea75593c3e731524f0b010a1fc4e974ad" }, "sns_index": { "rev": "c741e349451edf0c9792149ad439bb32a0161371", @@ -124,8 +128,8 @@ "sha256": "3d808fa63a3d8ebd4510c0400aa078e99a31afaa0515f0b68778f929ce4b2a46" }, "sns_root": { - "rev": "a5878586e47536d4cd47f0aadb66b73df8131d2b", - "sha256": "dc243135057d13c48f71d2f0a4b8f5fc43ed525d579d97dde23e052dca15bf96" + "rev": "2d4bcba47ea10520ff21ce54a8acb9cdb0629317", + "sha256": "cbbc1ffdd911c58692409e942fafbddcf3e3445e1df99b26d83ae8ed5383af9a" }, "swap": { "rev": "a5878586e47536d4cd47f0aadb66b73df8131d2b", diff --git a/mainnet-subnet-revisions.json b/mainnet-subnet-revisions.json index c2a305644ca..c372b151689 100644 --- a/mainnet-subnet-revisions.json +++ b/mainnet-subnet-revisions.json @@ -1,6 +1,6 @@ { "subnets": { - "tdb26-jop6k-aogll-7ltgs-eruif-6kk7m-qpktf-gdiqx-mxtrf-vb5e6-eqe": "233c1ee2ef68c1c8800b8151b2b9f38e17b8440a", - "io67a-2jmkw-zup3h-snbwi-g6a5n-rm5dn-b6png-lvdpl-nqnto-yih6l-gqe": "4ba583480e05a518aa2bcf36f5a0e48475e8edc2" + "tdb26-jop6k-aogll-7ltgs-eruif-6kk7m-qpktf-gdiqx-mxtrf-vb5e6-eqe": "35f39480fe28485694743dc3ef15ac37ea000c74", + "io67a-2jmkw-zup3h-snbwi-g6a5n-rm5dn-b6png-lvdpl-nqnto-yih6l-gqe": "5ee8dcf34f26c12defcff51c2f5737214611bccc" } } \ No newline at end of file diff --git a/rs/crypto/getrandom_for_wasm/BUILD.bazel b/packages/ic-dummy-getrandom-for-wasm/BUILD.bazel similarity index 73% rename from rs/crypto/getrandom_for_wasm/BUILD.bazel rename to packages/ic-dummy-getrandom-for-wasm/BUILD.bazel index b5616b10441..50705d6be4b 100644 --- a/rs/crypto/getrandom_for_wasm/BUILD.bazel +++ b/packages/ic-dummy-getrandom-for-wasm/BUILD.bazel @@ -3,9 +3,9 @@ load("@rules_rust//rust:defs.bzl", "rust_library") package(default_visibility = ["//visibility:public"]) rust_library( - name = "getrandom_for_wasm", + name = "ic-dummy-getrandom-for-wasm", srcs = glob(["src/**"]), - crate_name = "ic_crypto_getrandom_for_wasm", + crate_name = "ic_dummy_getrandom_for_wasm", version = "0.1.0", deps = [ # Keep sorted. diff --git a/rs/crypto/getrandom_for_wasm/Cargo.toml b/packages/ic-dummy-getrandom-for-wasm/Cargo.toml similarity index 68% rename from rs/crypto/getrandom_for_wasm/Cargo.toml rename to packages/ic-dummy-getrandom-for-wasm/Cargo.toml index 56c308f00af..f4c77128eaa 100644 --- a/rs/crypto/getrandom_for_wasm/Cargo.toml +++ b/packages/ic-dummy-getrandom-for-wasm/Cargo.toml @@ -1,9 +1,11 @@ [package] -name = "ic-crypto-getrandom-for-wasm" -version.workspace = true +name = "ic-dummy-getrandom-for-wasm" +version = "0.1.0" +description = "Workaround a problem with rand on wasm32-unknown-unknown targets" +license = "Apache-2.0" +readme = "README.md" authors.workspace = true edition.workspace = true -description.workspace = true documentation.workspace = true [target.'cfg(all(target_arch = "wasm32", target_vendor = "unknown", target_os = "unknown"))'.dependencies] diff --git a/packages/ic-dummy-getrandom-for-wasm/README.md b/packages/ic-dummy-getrandom-for-wasm/README.md new file mode 100644 index 00000000000..46d339bc987 --- /dev/null +++ b/packages/ic-dummy-getrandom-for-wasm/README.md @@ -0,0 +1,12 @@ +ic-dummy-getrandom-for-wasm +============================= + +The `rand` crate is widely used in the Rust ecosystem. The `rand` crate in turn +relies on `getrandom` to acquire cryptographic seed material. For policy +reasons, `getrandom` refuses to compile on the `wasm32-unknown-unknown` target +used by the Internet Computer. This prevents using `rand` without workarounds. + +This crate implements such a workaround; on `wasm32-unknown-unknown` target, it +registers a custom getrandom implementation which just returns an error at +runtime. On any other target, it does nothing. + diff --git a/rs/crypto/getrandom_for_wasm/src/lib.rs b/packages/ic-dummy-getrandom-for-wasm/src/lib.rs similarity index 100% rename from rs/crypto/getrandom_for_wasm/src/lib.rs rename to packages/ic-dummy-getrandom-for-wasm/src/lib.rs diff --git a/rs/crypto/ed25519/BUILD.bazel b/packages/ic-ed25519/BUILD.bazel similarity index 65% rename from rs/crypto/ed25519/BUILD.bazel rename to packages/ic-ed25519/BUILD.bazel index 38ea28037f2..e5b941de654 100644 --- a/rs/crypto/ed25519/BUILD.bazel +++ b/packages/ic-ed25519/BUILD.bazel @@ -1,4 +1,4 @@ -load("@rules_rust//rust:defs.bzl", "rust_doc", "rust_library", "rust_test", "rust_test_suite") +load("@rules_rust//rust:defs.bzl", "rust_doc", "rust_doc_test", "rust_library", "rust_test", "rust_test_suite") package(default_visibility = ["//visibility:public"]) @@ -28,33 +28,40 @@ MACRO_DEV_DEPENDENCIES = [] ALIASES = {} rust_library( - name = "ed25519", + name = "ic-ed25519", srcs = glob(["src/**/*.rs"]), aliases = ALIASES, - crate_name = "ic_crypto_ed25519", + crate_features = ["rand"], + crate_name = "ic_ed25519", proc_macro_deps = MACRO_DEPENDENCIES, - version = "0.9.0", + version = "0.2.0", deps = DEPENDENCIES, ) rust_doc( - name = "ed25519_doc", - crate = ":ed25519", + name = "doc", + crate = ":ic-ed25519", +) + +rust_doc_test( + name = "doc_test", + crate = ":ic-ed25519", + deps = [":ic-ed25519"] + DEPENDENCIES + DEV_DEPENDENCIES, ) rust_test( - name = "ed25519_test", + name = "test", aliases = ALIASES, - crate = ":ed25519", + crate = ":ic-ed25519", proc_macro_deps = MACRO_DEPENDENCIES + MACRO_DEV_DEPENDENCIES, deps = DEPENDENCIES + DEV_DEPENDENCIES, ) rust_test_suite( - name = "ed25519_integration", + name = "integration_tests", srcs = glob(["tests/**/*.rs"]), aliases = ALIASES, compile_data = glob(["tests/data/*"]), proc_macro_deps = MACRO_DEPENDENCIES + MACRO_DEV_DEPENDENCIES, - deps = [":ed25519"] + DEPENDENCIES + DEV_DEPENDENCIES, + deps = [":ic-ed25519"] + DEPENDENCIES + DEV_DEPENDENCIES, ) diff --git a/packages/ic-ed25519/CHANGELOG.md b/packages/ic-ed25519/CHANGELOG.md new file mode 100644 index 00000000000..804df328353 --- /dev/null +++ b/packages/ic-ed25519/CHANGELOG.md @@ -0,0 +1,21 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.2.0] - 2025-02-14 + +### Added + +- Added a new feature `rand` which controls if `ic-ed25519` will depend on the `rand` + crate. Key generation and batch verification are not supported if `rand` support is + disabled. Disabling this feature is useful anytime a dependency on `rand` is not + desirable, particularly when building for the `wasm32-unknown-unknown` target used for + the Internet Computer, due to the fact that a dependency of `rand`, namely `getrandom`, + refuses to compile for this target. + +## [0.1.0] - 2025-02-07 + +Initial release. diff --git a/rs/crypto/ed25519/Cargo.toml b/packages/ic-ed25519/Cargo.toml similarity index 52% rename from rs/crypto/ed25519/Cargo.toml rename to packages/ic-ed25519/Cargo.toml index 2cd4edcc84c..9c4c215c3f9 100644 --- a/rs/crypto/ed25519/Cargo.toml +++ b/packages/ic-ed25519/Cargo.toml @@ -1,9 +1,13 @@ [package] -name = "ic-crypto-ed25519" -version.workspace = true +name = "ic-ed25519" +version = "0.2.0" +description = "A package created for the Internet Computer Protocol for creating and verifying Ed25519 signatures." +license = "Apache-2.0" +readme = "README.md" +include = ["src", "Cargo.toml", "CHANGELOG.md", "LICENSE", "README.md"] +repository = "https://github.com/dfinity/ic" authors.workspace = true edition.workspace = true -description.workspace = true documentation.workspace = true [dependencies] @@ -11,12 +15,17 @@ curve25519-dalek = { workspace = true } ed25519-dalek = { workspace = true } hkdf = "0.12" pem = "1" -rand = { workspace = true } +rand = { workspace = true, optional = true, no-default-features = true } thiserror = { workspace = true } zeroize = { workspace = true } +[features] +default = ["rand"] +rand = ["dep:rand"] + [dev-dependencies] hex = { workspace = true } hex-literal = "0.4" +rand = { workspace = true } rand_chacha = { workspace = true } wycheproof = { version = "0.6", default-features = false, features = ["eddsa"] } diff --git a/packages/ic-ed25519/LICENSE b/packages/ic-ed25519/LICENSE new file mode 120000 index 00000000000..c87d0654aa6 --- /dev/null +++ b/packages/ic-ed25519/LICENSE @@ -0,0 +1 @@ +../../licenses/Apache-2.0.txt \ No newline at end of file diff --git a/packages/ic-ed25519/README.md b/packages/ic-ed25519/README.md new file mode 100644 index 00000000000..9f05fc2e66c --- /dev/null +++ b/packages/ic-ed25519/README.md @@ -0,0 +1,3 @@ +# IC Ed25519 + +A package created for the Internet Computer Protocol for creating and verifying Ed25519 signatures. diff --git a/rs/crypto/ed25519/src/lib.rs b/packages/ic-ed25519/src/lib.rs similarity index 99% rename from rs/crypto/ed25519/src/lib.rs rename to packages/ic-ed25519/src/lib.rs index 45db6123327..10c8a0a1a16 100644 --- a/rs/crypto/ed25519/src/lib.rs +++ b/packages/ic-ed25519/src/lib.rs @@ -9,7 +9,6 @@ use curve25519_dalek::{edwards::CompressedEdwardsY, EdwardsPoint, Scalar}; use ed25519_dalek::pkcs8::{DecodePrivateKey, DecodePublicKey, EncodePrivateKey, EncodePublicKey}; use ed25519_dalek::{Digest, Sha512}; use ed25519_dalek::{Signer, SigningKey, VerifyingKey}; -use rand::{CryptoRng, Rng}; use thiserror::Error; use zeroize::ZeroizeOnDrop; @@ -97,13 +96,15 @@ impl PrivateKey { pub const BYTES: usize = 32; /// Create a new random secret Ed25519 key + #[cfg(feature = "rand")] pub fn generate() -> Self { let mut rng = rand::thread_rng(); Self::generate_using_rng(&mut rng) } /// Create a new random secret Ed25519 key using specified RNG - pub fn generate_using_rng(rng: &mut R) -> Self { + #[cfg(feature = "rand")] + pub fn generate_using_rng(rng: &mut R) -> Self { let sk = SigningKey::generate(rng); Self { sk } } @@ -707,7 +708,8 @@ impl PublicKey { /// valid signatures (if any). /// /// This verification follows ZIP215 validation rules - pub fn batch_verify( + #[cfg(feature = "rand")] + pub fn batch_verify( messages: &[&[u8]], signatures: &[&[u8]], keys: &[Self], diff --git a/rs/crypto/ed25519/tests/data/zip215.txt b/packages/ic-ed25519/tests/data/zip215.txt similarity index 100% rename from rs/crypto/ed25519/tests/data/zip215.txt rename to packages/ic-ed25519/tests/data/zip215.txt diff --git a/rs/crypto/ed25519/tests/tests.rs b/packages/ic-ed25519/tests/tests.rs similarity index 96% rename from rs/crypto/ed25519/tests/tests.rs rename to packages/ic-ed25519/tests/tests.rs index e867f4a12bf..16e919feb8e 100644 --- a/rs/crypto/ed25519/tests/tests.rs +++ b/packages/ic-ed25519/tests/tests.rs @@ -1,5 +1,5 @@ use hex_literal::hex; -use ic_crypto_ed25519::*; +use ic_ed25519::*; use rand::Rng; use rand_chacha::ChaCha20Rng; @@ -16,6 +16,10 @@ fn test_rng() -> ChaCha20Rng { test_rng_with_seed(seed) } +fn random_key(rng: &mut R) -> PrivateKey { + PrivateKey::generate_from_seed(&rng.gen::<[u8; 32]>()) +} + #[test] fn secret_key_serialization_round_trips() { let mut rng = &mut test_rng(); @@ -27,7 +31,7 @@ fn secret_key_serialization_round_trips() { ]; for _ in 0..100 { - let key = PrivateKey::generate_using_rng(&mut rng); + let key = random_key(&mut rng); let via_raw = PrivateKey::deserialize_raw(&key.serialize_raw()).unwrap(); assert_eq!(key, via_raw); @@ -70,7 +74,7 @@ fn secret_key_generation_from_seed_is_stable() { #[test] fn pkcs8_v2_rep_includes_the_public_key() { let mut rng = &mut test_rng(); - let sk = PrivateKey::generate_using_rng(&mut rng); + let sk = random_key(&mut rng); let pk = sk.public_key().serialize_raw(); let sk_pkcs8 = sk.serialize_pkcs8(PrivateKeyFormat::Pkcs8v2); @@ -84,7 +88,7 @@ fn pkcs8_v2_rep_includes_the_public_key() { fn signatures_we_generate_will_verify() { let mut rng = &mut test_rng(); for _ in 0..100 { - let sk = PrivateKey::generate_using_rng(&mut rng); + let sk = random_key(&mut rng); let pk = sk.public_key(); let msg = rng.gen::<[u8; 32]>(); @@ -116,6 +120,7 @@ fn public_key_deserialization_rejects_keys_of_incorrect_length() { } #[test] +#[cfg(feature = "rand")] fn batch_verification_works() { fn batch_verifies( msg: &[[u8; 32]], @@ -148,9 +153,7 @@ fn batch_verification_works() { assert!(PublicKey::batch_verify(&[], &[], &[], rng).is_ok()); for batch_size in (1..30).chain([50, 75, 100]) { - let sk = (0..batch_size) - .map(|_| PrivateKey::generate_using_rng(rng)) - .collect::>(); + let sk = (0..batch_size).map(|_| random_key(rng)).collect::>(); let mut pk = sk.iter().map(|k| k.public_key()).collect::>(); let mut msg = (0..batch_size) @@ -186,7 +189,7 @@ fn batch_verification_works() { // Corrupt a random public key and check that the batch fails: let corrupted_pk_idx = rng.gen::() % batch_size; let correct_pk = pk[corrupted_pk_idx]; - let wrong_pk = PrivateKey::generate_using_rng(rng).public_key(); + let wrong_pk = random_key(rng).public_key(); assert_ne!(correct_pk, wrong_pk); pk[corrupted_pk_idx] = wrong_pk; assert!(!batch_verifies(&msg, &sigs, &pk, rng)); @@ -407,7 +410,7 @@ fn private_derivation_is_compatible_with_public_derivation() { } for _ in 0..100 { - let master_sk = PrivateKey::generate_using_rng(rng); + let master_sk = random_key(rng); let master_pk = master_sk.public_key(); let path = random_path(rng); @@ -437,7 +440,7 @@ fn private_derivation_also_works_for_derived_keys() { let rng = &mut test_rng(); for _ in 0..100 { - let master_sk = PrivateKey::generate_using_rng(rng); + let master_sk = random_key(rng); let chain_code = rng.gen::<[u8; 32]>(); let path_len = 2 + rng.gen::() % 32; @@ -536,6 +539,7 @@ fn public_key_accepts_but_can_detect_non_canonical_keys_with_torsion_component() } #[test] +#[cfg(feature = "rand")] fn verification_follows_zip215() { let rng = &mut test_rng(); @@ -552,7 +556,7 @@ fn verification_follows_zip215() { }) .map(|s| { ( - ic_crypto_ed25519::PublicKey::deserialize_raw(&s[0]).unwrap(), + ic_ed25519::PublicKey::deserialize_raw(&s[0]).unwrap(), s[1].clone(), ) }) @@ -584,8 +588,7 @@ fn verification_follows_zip215() { }; assert!( - ic_crypto_ed25519::PublicKey::batch_verify(&bmsg[..], &bsigs[..], &bkeys[..], rng) - .is_ok() + ic_ed25519::PublicKey::batch_verify(&bmsg[..], &bsigs[..], &bkeys[..], rng).is_ok() ); } } diff --git a/rs/crypto/secp256k1/BUILD.bazel b/packages/ic-secp256k1/BUILD.bazel similarity index 69% rename from rs/crypto/secp256k1/BUILD.bazel rename to packages/ic-secp256k1/BUILD.bazel index 9f7d69d1c9c..b14d81c24b6 100644 --- a/rs/crypto/secp256k1/BUILD.bazel +++ b/packages/ic-secp256k1/BUILD.bazel @@ -1,4 +1,4 @@ -load("@rules_rust//rust:defs.bzl", "rust_doc", "rust_library", "rust_test", "rust_test_suite") +load("@rules_rust//rust:defs.bzl", "rust_doc", "rust_doc_test", "rust_library", "rust_test", "rust_test_suite") package(default_visibility = ["//visibility:public"]) @@ -32,32 +32,38 @@ MACRO_DEV_DEPENDENCIES = [] ALIASES = {} rust_library( - name = "secp256k1", + name = "ic-secp256k1", srcs = glob(["src/**"]), aliases = ALIASES, - crate_name = "ic_crypto_secp256k1", + crate_name = "ic_secp256k1", proc_macro_deps = MACRO_DEPENDENCIES, version = "0.1.0", deps = DEPENDENCIES, ) rust_doc( - name = "secp256k1_doc", - crate = ":secp256k1", + name = "doc", + crate = ":ic-secp256k1", +) + +rust_doc_test( + name = "doc_test", + crate = ":ic-secp256k1", + deps = [":ic-secp256k1"] + DEPENDENCIES + DEV_DEPENDENCIES, ) rust_test( - name = "secp256k1_test", + name = "test", aliases = ALIASES, - crate = ":secp256k1", + crate = ":ic-secp256k1", proc_macro_deps = MACRO_DEPENDENCIES + MACRO_DEV_DEPENDENCIES, deps = DEPENDENCIES + DEV_DEPENDENCIES, ) rust_test_suite( - name = "secp256k1_integration", + name = "integration_tests", srcs = glob(["tests/**/*.rs"]), aliases = ALIASES, proc_macro_deps = MACRO_DEPENDENCIES + MACRO_DEV_DEPENDENCIES, - deps = [":secp256k1"] + DEPENDENCIES + DEV_DEPENDENCIES, + deps = [":ic-secp256k1"] + DEPENDENCIES + DEV_DEPENDENCIES, ) diff --git a/packages/ic-secp256k1/CHANGELOG.md b/packages/ic-secp256k1/CHANGELOG.md new file mode 100644 index 00000000000..0ac479b4c83 --- /dev/null +++ b/packages/ic-secp256k1/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.1.0] - 2025-02-07 + +Initial release. \ No newline at end of file diff --git a/rs/crypto/secp256k1/Cargo.toml b/packages/ic-secp256k1/Cargo.toml similarity index 69% rename from rs/crypto/secp256k1/Cargo.toml rename to packages/ic-secp256k1/Cargo.toml index 3a5e3f9e7fd..db29d61c9ce 100644 --- a/rs/crypto/secp256k1/Cargo.toml +++ b/packages/ic-secp256k1/Cargo.toml @@ -1,9 +1,13 @@ [package] -name = "ic-crypto-secp256k1" -version.workspace = true +name = "ic-secp256k1" +version = "0.1.0" +description = "A package created for the Internet Computer Protocol for the handling of ECDSA and Schnorr keys over the secp256k1 curve." +license = "Apache-2.0" +readme = "README.md" +include = ["src", "Cargo.toml", "CHANGELOG.md", "LICENSE", "README.md"] +repository = "https://github.com/dfinity/ic" authors.workspace = true edition.workspace = true -description.workspace = true documentation.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/packages/ic-secp256k1/LICENSE b/packages/ic-secp256k1/LICENSE new file mode 120000 index 00000000000..c87d0654aa6 --- /dev/null +++ b/packages/ic-secp256k1/LICENSE @@ -0,0 +1 @@ +../../licenses/Apache-2.0.txt \ No newline at end of file diff --git a/packages/ic-secp256k1/README.md b/packages/ic-secp256k1/README.md new file mode 100644 index 00000000000..7f736165053 --- /dev/null +++ b/packages/ic-secp256k1/README.md @@ -0,0 +1,3 @@ +# IC Secp256k1 + +A package created for the Internet Computer Protocol for the handling of ECDSA and Schnorr keys over the secp256k1 curve. diff --git a/rs/crypto/secp256k1/src/lib.rs b/packages/ic-secp256k1/src/lib.rs similarity index 100% rename from rs/crypto/secp256k1/src/lib.rs rename to packages/ic-secp256k1/src/lib.rs diff --git a/rs/crypto/secp256k1/tests/tests.rs b/packages/ic-secp256k1/tests/tests.rs similarity index 99% rename from rs/crypto/secp256k1/tests/tests.rs rename to packages/ic-secp256k1/tests/tests.rs index b135ed883ff..c391987bff6 100644 --- a/rs/crypto/secp256k1/tests/tests.rs +++ b/packages/ic-secp256k1/tests/tests.rs @@ -1,5 +1,5 @@ use hex_literal::hex; -use ic_crypto_secp256k1::{DerivationPath, KeyDecodingError, PrivateKey, PublicKey}; +use ic_secp256k1::{DerivationPath, KeyDecodingError, PrivateKey, PublicKey}; use rand::Rng; use rand_chacha::ChaCha20Rng; @@ -561,7 +561,7 @@ fn key_derivation_matches_bip32() { mod try_recovery_from_digest { use crate::test_rng; - use ic_crypto_secp256k1::{PrivateKey, PublicKey, RecoveryError}; + use ic_secp256k1::{PrivateKey, PublicKey, RecoveryError}; use k256::ecdsa::{Signature, VerifyingKey}; use rand::Rng; diff --git a/packages/pocket-ic/CHANGELOG.md b/packages/pocket-ic/CHANGELOG.md index 1f73264f836..e426dc3ef75 100644 --- a/packages/pocket-ic/CHANGELOG.md +++ b/packages/pocket-ic/CHANGELOG.md @@ -16,6 +16,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The function `PocketIc::await_call_no_ticks` to await the status of an update call (submitted through an ingress message) becoming known without triggering round execution (round execution must be triggered separarely, e.g., on a "live" instance or by separate PocketIC library calls). - The function `PocketIc::set_certified_time` to set the current certified time on all subnets of the PocketIC instance. +- The function `PocketIc::update_call_with_effective_principal` is made public. It is helpful, e.g., for +modeling management canister calls that need to be routed to the right subnet using effective principals. ### Changed - The response types `pocket_ic::WasmResult`, `pocket_ic::UserError`, and `pocket_ic::CallError` are replaced by a single reject response type `pocket_ic::RejectResponse`. diff --git a/packages/pocket-ic/src/common/rest.rs b/packages/pocket-ic/src/common/rest.rs index 0413b7bb5ba..f1dc7f0d6b4 100644 --- a/packages/pocket-ic/src/common/rest.rs +++ b/packages/pocket-ic/src/common/rest.rs @@ -356,6 +356,23 @@ impl From for RawNodeId { } } +#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize, JsonSchema, Default)] +pub struct TickConfigs { + pub blockmakers: Option, +} + +#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize, JsonSchema)] +pub struct BlockmakerConfigs { + pub blockmakers_per_subnet: Vec, +} + +#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize, JsonSchema)] +pub struct RawSubnetBlockmaker { + pub subnet: RawSubnetId, + pub blockmaker: RawNodeId, + pub failed_blockmakers: Vec, +} + #[derive(Serialize, Deserialize, JsonSchema)] pub struct RawVerifyCanisterSigArg { #[serde(deserialize_with = "base64::deserialize")] diff --git a/packages/pocket-ic/src/lib.rs b/packages/pocket-ic/src/lib.rs index d7483a4692e..b520f804345 100644 --- a/packages/pocket-ic/src/lib.rs +++ b/packages/pocket-ic/src/lib.rs @@ -522,6 +522,14 @@ impl PocketIc { runtime.block_on(async { self.pocket_ic.tick().await }) } + /// Make the IC produce and progress by one block with custom + /// configs for the round. + #[instrument(skip(self), fields(instance_id=self.pocket_ic.instance_id))] + pub fn tick_with_configs(&self, configs: crate::common::rest::TickConfigs) { + let runtime = self.runtime.clone(); + runtime.block_on(async { self.pocket_ic.tick_with_configs(configs).await }) + } + /// Configures the IC to make progress automatically, /// i.e., periodically update the time of the IC /// to the real time and execute rounds on the subnets. @@ -1129,7 +1137,7 @@ impl PocketIc { runtime.block_on(async { self.pocket_ic.get_subnet_metrics(subnet_id).await }) } - fn update_call_with_effective_principal( + pub fn update_call_with_effective_principal( &self, canister_id: CanisterId, effective_principal: RawEffectivePrincipal, diff --git a/packages/pocket-ic/src/nonblocking.rs b/packages/pocket-ic/src/nonblocking.rs index 763574b4651..e58a8b97536 100644 --- a/packages/pocket-ic/src/nonblocking.rs +++ b/packages/pocket-ic/src/nonblocking.rs @@ -5,7 +5,7 @@ use crate::common::rest::{ MockCanisterHttpResponse, RawAddCycles, RawCanisterCall, RawCanisterHttpRequest, RawCanisterId, RawCanisterResult, RawCycles, RawEffectivePrincipal, RawIngressStatusArgs, RawMessageId, RawMockCanisterHttpResponse, RawPrincipalId, RawSetStableMemory, RawStableMemory, RawSubnetId, - RawTime, RawVerifyCanisterSigArg, SubnetId, Topology, + RawTime, RawVerifyCanisterSigArg, SubnetId, TickConfigs, Topology, }; use crate::management_canister::{ CanisterId, CanisterIdRecord, CanisterInstallMode, CanisterInstallModeUpgradeInner, @@ -290,8 +290,15 @@ impl PocketIc { /// inter-canister calls or heartbeats. #[instrument(skip(self), fields(instance_id=self.instance_id))] pub async fn tick(&self) { + self.tick_with_configs(TickConfigs::default()).await; + } + + /// Make the IC produce and progress by one block with custom + /// configs for the round. + #[instrument(skip(self), fields(instance_id=self.instance_id))] + pub async fn tick_with_configs(&self, configs: TickConfigs) { let endpoint = "update/tick"; - self.post::<(), _>(endpoint, "").await; + self.post::<(), _>(endpoint, configs).await; } /// Configures the IC to make progress automatically, @@ -1529,7 +1536,7 @@ impl PocketIc { result.into() } - pub(crate) async fn update_call_with_effective_principal( + pub async fn update_call_with_effective_principal( &self, canister_id: CanisterId, effective_principal: RawEffectivePrincipal, diff --git a/packages/pocket-ic/test_canister/canister.did b/packages/pocket-ic/test_canister/canister.did index f0e2766bcc7..11ce96ca553 100644 --- a/packages/pocket-ic/test_canister/canister.did +++ b/packages/pocket-ic/test_canister/canister.did @@ -98,12 +98,29 @@ type TransformArgs = record { context : blob; }; +type NodeMetricsHistoryArgs = record { + subnet_id: principal; + start_at_timestamp_nanos: nat64; +}; + +type NodeMetrics = record { + node_id: principal; + num_blocks_proposed_total: nat64; + num_block_failures_total: nat64; +}; + +type NodeMetricsHistoryResponse = record { + timestamp_nanos: nat64; + node_metrics: vec NodeMetrics; +}; + service : { http_request: (request: HttpGatewayRequest) -> (HttpGatewayResponse) query; schnorr_public_key : (opt principal, vec blob, SchnorrKeyId) -> (SchnorrPublicKeyResult); sign_with_schnorr : (blob, vec blob, SchnorrKeyId) -> (SignWithSchnorrResult); ecdsa_public_key : (opt principal, vec blob, text) -> (EcdsaPublicKeyResult); sign_with_ecdsa : (blob, vec blob, text) -> (SignWithEcdsaResult); + node_metrics_history_proxy: (NodeMetricsHistoryArgs) -> (vec NodeMetricsHistoryResponse); canister_http : () -> (HttpResponseResult); canister_http_with_transform : () -> (HttpResponse); transform : (TransformArgs) -> (HttpResponse) query; diff --git a/packages/pocket-ic/test_canister/src/canister.rs b/packages/pocket-ic/test_canister/src/canister.rs index 239803ea47b..1a4aaa03750 100644 --- a/packages/pocket-ic/test_canister/src/canister.rs +++ b/packages/pocket-ic/test_canister/src/canister.rs @@ -293,6 +293,40 @@ async fn call_with_large_blob(canister: Principal, blob_len: usize) -> usize { .0 } +#[derive(CandidType, Deserialize)] +pub struct NodeMetrics { + pub node_id: Principal, + pub num_blocks_proposed_total: u64, + pub num_block_failures_total: u64, +} + +#[derive(CandidType, Deserialize)] +pub struct NodeMetricsHistoryResponse { + pub timestamp_nanos: u64, + pub node_metrics: Vec, +} + +#[derive(CandidType, Deserialize)] +pub struct NodeMetricsHistoryArgs { + pub start_at_timestamp_nanos: u64, + pub subnet_id: Principal, +} + +#[update] +async fn node_metrics_history_proxy( + args: NodeMetricsHistoryArgs, +) -> Vec { + ic_cdk::api::call::call_with_payment128::<_, (Vec,)>( + candid::Principal::management_canister(), + "node_metrics_history", + (args,), + 0_u128, + ) + .await + .unwrap() + .0 +} + // executing many instructions #[update] diff --git a/packages/pocket-ic/tests/tests.rs b/packages/pocket-ic/tests/tests.rs index 21ac2e65250..5eb863b3c4b 100644 --- a/packages/pocket-ic/tests/tests.rs +++ b/packages/pocket-ic/tests/tests.rs @@ -2,10 +2,12 @@ use candid::{decode_one, encode_one, CandidType, Decode, Deserialize, Encode, Pr use ic_certification::Label; use ic_transport_types::Envelope; use ic_transport_types::EnvelopeContent::ReadState; +use pocket_ic::common::rest::{BlockmakerConfigs, RawSubnetBlockmaker, TickConfigs}; use pocket_ic::management_canister::{ CanisterIdRecord, CanisterInstallMode, CanisterSettings, EcdsaPublicKeyResult, - HttpRequestResult, ProvisionalCreateCanisterWithCyclesArgs, SchnorrAlgorithm, - SchnorrPublicKeyArgsKeyId, SchnorrPublicKeyResult, SignWithBip341Aux, SignWithSchnorrAux, + HttpRequestResult, NodeMetricsHistoryArgs, NodeMetricsHistoryResultItem, + ProvisionalCreateCanisterWithCyclesArgs, SchnorrAlgorithm, SchnorrPublicKeyArgsKeyId, + SchnorrPublicKeyResult, SignWithBip341Aux, SignWithSchnorrAux, }; use pocket_ic::{ common::rest::{ @@ -2214,3 +2216,82 @@ fn test_reject_response_type() { assert!(!err.certified); } } + +#[test] +fn test_custom_blockmaker_metrics() { + const HOURS_IN_SECONDS: u64 = 60 * 60; + + let pocket_ic = PocketIcBuilder::new().with_application_subnet().build(); + let topology = pocket_ic.topology(); + let application_subnet = topology.get_app_subnets()[0]; + + // Create and install test canister. + let canister = pocket_ic.create_canister_on_subnet(None, None, application_subnet); + pocket_ic.add_cycles(canister, INIT_CYCLES); + pocket_ic.install_canister(canister, test_canister_wasm(), vec![], None); + + let nodes = topology + .subnet_configs + .get(&application_subnet) + .unwrap() + .clone(); + + let blockmaker_1 = nodes.node_ids[0].clone(); + let blockmaker_2 = nodes.node_ids[1].clone(); + + let subnets_blockmakers = vec![RawSubnetBlockmaker { + subnet: application_subnet.into(), + blockmaker: blockmaker_1.clone(), + failed_blockmakers: vec![blockmaker_2.clone()], + }]; + + let tick_configs = TickConfigs { + blockmakers: Some(BlockmakerConfigs { + blockmakers_per_subnet: subnets_blockmakers, + }), + }; + let daily_blocks = 5; + + // Blockmaker metrics are recorded in the management canister + for _ in 0..daily_blocks { + pocket_ic.tick_with_configs(tick_configs.clone()); + } + // Advance time until next day so that management canister can record blockmaker metrics + pocket_ic.advance_time(std::time::Duration::from_secs(HOURS_IN_SECONDS * 24)); + pocket_ic.tick(); + + let response = pocket_ic + .update_call( + canister, + Principal::anonymous(), + // Calls the node_metrics_history method on the management canister + "node_metrics_history_proxy", + Encode!(&NodeMetricsHistoryArgs { + subnet_id: application_subnet, + start_at_timestamp_nanos: 0, + }) + .unwrap(), + ) + .unwrap(); + + let first_node_metrics = Decode!(&response, Vec) + .unwrap() + .remove(0) + .node_metrics; + + let blockmaker_1_metrics = first_node_metrics + .iter() + .find(|x| x.node_id == Principal::from(blockmaker_1.clone())) + .unwrap() + .clone(); + let blockmaker_2_metrics = first_node_metrics + .into_iter() + .find(|x| x.node_id == Principal::from(blockmaker_2.clone())) + .unwrap(); + + assert_eq!(blockmaker_1_metrics.num_blocks_proposed_total, daily_blocks); + assert_eq!(blockmaker_1_metrics.num_block_failures_total, 0); + + assert_eq!(blockmaker_2_metrics.num_blocks_proposed_total, 0); + assert_eq!(blockmaker_2_metrics.num_block_failures_total, daily_blocks); +} diff --git a/publish/binaries/BUILD.bazel b/publish/binaries/BUILD.bazel index d383c4e05ed..00ebc1750ae 100644 --- a/publish/binaries/BUILD.bazel +++ b/publish/binaries/BUILD.bazel @@ -1,6 +1,6 @@ load("//bazel:defs.bzl", "gzip_compress") load("//ci/src/artifacts:upload.bzl", "upload_artifacts") -load("//publish:defs.bzl", "release_nostrip_binary", "release_strip_binary", "release_strip_binary_test") +load("//publish:defs.bzl", "checksum_rule", "release_nostrip_binary", "release_strip_binary", "release_strip_binary_test") package(default_visibility = ["//rs:ic-os-pkg"]) @@ -119,6 +119,11 @@ filegroup( srcs = [name + ".gz" for name in ALL_BINARIES], ) +checksum_rule( + name = "compute_checksums", + inputs = [":binaries"], +) + upload_artifacts( name = "upload", testonly = True, diff --git a/publish/canisters/BUILD.bazel b/publish/canisters/BUILD.bazel index e353b17af02..9a35999cfa0 100644 --- a/publish/canisters/BUILD.bazel +++ b/publish/canisters/BUILD.bazel @@ -1,5 +1,8 @@ load("@bazel_skylib//rules:copy_file.bzl", "copy_file") load("//ci/src/artifacts:upload.bzl", "upload_artifacts") +load("//publish:defs.bzl", "checksum_rule") +load("//rs/nns:nns.bzl", NNS_CANISTER_NAME_TO_MAX_COMPRESSED_WASM_SIZE_E5_BYTES = "CANISTER_NAME_TO_MAX_COMPRESSED_WASM_SIZE_E5_BYTES") +load("//rs/sns:sns.bzl", SNS_CANISTER_NAME_TO_MAX_COMPRESSED_WASM_SIZE_E5_BYTES = "CANISTER_NAME_TO_MAX_COMPRESSED_WASM_SIZE_E5_BYTES") # The list of canisters that are being published/uploaded as artifacts to our CDN (download.dfinity.systems) include # 1. Officially released canisters that can be downloaded/verified by 3rd parties - https://github.com/dfinity/ic/blob/master/.github/workflows/tag-release.yml @@ -86,35 +89,9 @@ CANISTERS_MAX_SIZE_COMPRESSED_E5_BYTES = { "rate-limit-canister.wasm.gz": "7", } -# How these limits were chosen: -# -# 1. Temporarily set value to "0". -# 2. Run the test: bazel test //publish/canisters:all -# 3. Fail message reports size it sees. -# 4. Pick a number that gives at least 20% headroom. -# -# This way, there is some room to grow, but an alarm eventually gets triggered after a "significant" -# amount of growth happens. - -NNS_CANISTERS_MAX_SIZE_COMPRESSED_E5_BYTES = { - "cycles-minting-canister.wasm.gz": "6", - "genesis-token-canister.wasm.gz": "3", - "governance-canister.wasm.gz": "17", - "governance-canister_test.wasm.gz": "17", - "registry-canister.wasm.gz": "14", - "root-canister.wasm.gz": "4", -} - -SNS_CANISTERS_MAX_SIZE_COMPRESSED_E5_BYTES = { - "sns-governance-canister.wasm.gz": "13", - "sns-governance-canister_test.wasm.gz": "13", - "sns-root-canister.wasm.gz": "4", - "sns-swap-canister.wasm.gz": "7", -} +CANISTERS_MAX_SIZE_COMPRESSED_E5_BYTES.update(NNS_CANISTER_NAME_TO_MAX_COMPRESSED_WASM_SIZE_E5_BYTES) -CANISTERS_MAX_SIZE_COMPRESSED_E5_BYTES.update(NNS_CANISTERS_MAX_SIZE_COMPRESSED_E5_BYTES) - -CANISTERS_MAX_SIZE_COMPRESSED_E5_BYTES.update(SNS_CANISTERS_MAX_SIZE_COMPRESSED_E5_BYTES) +CANISTERS_MAX_SIZE_COMPRESSED_E5_BYTES.update(SNS_CANISTER_NAME_TO_MAX_COMPRESSED_WASM_SIZE_E5_BYTES) [ sh_test( @@ -149,6 +126,12 @@ filegroup( [name for name in COMPRESSED_CANISTERS], ) +# Export checksums & build artifacts +checksum_rule( + name = "compute_checksums", + inputs = [":canisters"], +) + # the further targets are all testonly for simplicity because if a target was # violating the testonly flag, it would error at this point diff --git a/publish/defs.bzl b/publish/defs.bzl index 7121e0682cb..a41e203f285 100644 --- a/publish/defs.bzl +++ b/publish/defs.bzl @@ -120,3 +120,70 @@ malicious_binary = rule( "binary": attr.label(mandatory = True, cfg = malicious_code_enabled_transition, allow_single_file = True), }, ) + +def _checksum_rule_impl(ctx): + # List of input files + input_files = ctx.files.inputs + + # Declare output files (NOTE: not windows friendly) + out_checksums = ctx.actions.declare_file("_checksums/SHA256SUMS") + + def make_symlink(target): + symlink = ctx.actions.declare_file("_checksums/" + target.basename) + ctx.actions.symlink(output = symlink, target_file = target) + return symlink + + symlinks = [make_symlink(file) for file in input_files] + + # Compute checksums and print it to stdout & out file. + # The filenames are stripped from anything but the basename. + # NOTE: This might produce confusing output if `input_files` contain + # files with identical names in different directories. + ctx.actions.run_shell( + inputs = input_files, + arguments = [file.path for file in input_files], + outputs = [out_checksums], + tools = [ctx.executable._sha256], + command = """ + set -euo pipefail + + out_checksums="{out}" + output=$(mktemp) # temporary file bc sha256 doesn't support writing to stdout (or /dev/stdout) directly + + for input in "$@"; do + if ! [[ $input =~ (\\.tar|\\.gz) ]]; then + echo "skipping non-archive file $input" + continue + fi + {sha256} "$input" "$output" + cat "$output" >> "$out_checksums" + # '*' added for compatibility with determinism tests + echo " *$(basename $input)" >> "$out_checksums" + done + + cat "$out_checksums" + + sort -o "$out_checksums" -k 2 "$out_checksums" + """.format(out = out_checksums.path, sha256 = ctx.executable._sha256.path), + ) + + # Return the output file + return [DefaultInfo(files = depset([out_checksums] + symlinks))] + +# A rule that re-exports symlinks to all the inputs as well +# as an extra file 'SHA256SUMS' containing the checksums of inputs. +checksum_rule = rule( + implementation = _checksum_rule_impl, + attrs = { + "inputs": attr.label_list( + allow_files = True, + mandatory = True, + ), + # The bazel-provided sha256 tool to avoid relying on tools from the container/env + "_sha256": attr.label( + default = "@bazel_tools//tools/build_defs/hash:sha256", + executable = True, + cfg = "exec", + ), + }, +) diff --git a/rs/artifact_pool/Cargo.toml b/rs/artifact_pool/Cargo.toml index 5817cf30bd0..11e7ba69e55 100644 --- a/rs/artifact_pool/Cargo.toml +++ b/rs/artifact_pool/Cargo.toml @@ -37,7 +37,7 @@ rocksdb = { version = "0.22.0", default-features = false } criterion = { workspace = true } ic-limits = { path = "../limits" } ic-crypto-test-utils-canister-threshold-sigs = { path = "../crypto/test_utils/canister_threshold_sigs" } -ic-management-canister-types = { path = "../types/management_canister_types" } +ic-management-canister-types-private = { path = "../types/management_canister_types" } ic-test-artifact-pool = { path = "../test_utilities/artifact_pool" } ic-test-utilities = { path = "../test_utilities" } ic-test-utilities-consensus = { path = "../test_utilities/consensus" } diff --git a/rs/bitcoin/adapter/BUILD.bazel b/rs/bitcoin/adapter/BUILD.bazel index 6ffc2252fde..e982ff99b04 100644 --- a/rs/bitcoin/adapter/BUILD.bazel +++ b/rs/bitcoin/adapter/BUILD.bazel @@ -22,6 +22,7 @@ DEPENDENCIES = [ "@crate_index//:serde_json", "@crate_index//:slog", "@crate_index//:slog-async", + "@crate_index//:static_assertions", "@crate_index//:thiserror", "@crate_index//:tokio", "@crate_index//:tokio-socks", diff --git a/rs/bitcoin/adapter/Cargo.toml b/rs/bitcoin/adapter/Cargo.toml index 41e657a1a14..ec05ad25f94 100644 --- a/rs/bitcoin/adapter/Cargo.toml +++ b/rs/bitcoin/adapter/Cargo.toml @@ -30,6 +30,7 @@ serde = { workspace = true } serde_json = { workspace = true } slog = { workspace = true } slog-async = { workspace = true } +static_assertions = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true } tokio-socks = "0.5.1" diff --git a/rs/bitcoin/adapter/src/blockchainmanager.rs b/rs/bitcoin/adapter/src/blockchainmanager.rs index 56e7a0eca2e..8465caaa3b3 100644 --- a/rs/bitcoin/adapter/src/blockchainmanager.rs +++ b/rs/bitcoin/adapter/src/blockchainmanager.rs @@ -20,12 +20,12 @@ use std::{ collections::{HashMap, HashSet}, net::SocketAddr, sync::{Arc, Mutex}, - time::Instant, + time::{Duration, Instant}, }; use thiserror::Error; /// This constant is the maximum number of seconds to wait until we get response to the getdata request sent by us. -const GETDATA_REQUEST_TIMEOUT_SECS: u64 = 30; +const GETDATA_REQUEST_TIMEOUT: Duration = Duration::from_secs(30); /// This constant is the maximum number of seconds to wait until we get response to the getdata request sent by us. const GETHEADERS_REQUEST_TIMEOUT_SECS: u64 = 30; @@ -42,13 +42,6 @@ const MAX_UNSOLICITED_HEADERS: usize = 20; /// to a peer at a time. const INV_PER_GET_DATA_REQUEST: u32 = 8; -const ONE_MB: usize = 1_024 * 1_024; - -/// The limit at which we should stop making additional requests for new blocks as the block cache -/// becomes too large. Inflight `getdata` messages will remain active, but new `getdata` messages will -/// not be created. -const BLOCK_CACHE_THRESHOLD_BYTES: usize = 10 * ONE_MB; - /// Block locators. Consists of starting hashes and a stop hash. type Locators = (Vec, BlockHash); @@ -146,6 +139,8 @@ pub struct BlockchainManager { /// This field stores the map of which bitcoin nodes sent which "inv" messages. peer_info: HashMap, + /// This field is used to keep track of the next peer to send a "getdata" request to. + round_robin_offset: usize, /// This HashMap stores the information related to each getdata request /// sent by the BlockChainManager. An entry is removed from this hashmap when @@ -192,6 +187,7 @@ impl BlockchainManager { BlockchainManager { blockchain, peer_info, + round_robin_offset: 0, getdata_request_info, getheaders_requests: HashMap::new(), catchup_headers: HashSet::new(), @@ -525,7 +521,7 @@ impl BlockchainManager { for (block_hash, request) in self.getdata_request_info.iter_mut() { match request.sent_at { Some(sent_at) => { - if sent_at.elapsed().as_secs() > GETDATA_REQUEST_TIMEOUT_SECS { + if sent_at.elapsed() > GETDATA_REQUEST_TIMEOUT { retry_queue.insert(*block_hash); } } @@ -535,22 +531,24 @@ impl BlockchainManager { } } + // If a request timed out, there is no point in storing it in getdata_request_info + // Not removing it can actually lead to the adapter stalling, thinking all of its peers are busy. + for block_hash in &retry_queue { + self.getdata_request_info.remove(block_hash); + } + // If nothing to be synced, then there is nothing to do at this point. if retry_queue.is_empty() && self.block_sync_queue.is_empty() { return; } - let block_cache_size = self.blockchain.lock().unwrap().get_block_cache_size(); + let is_cache_full = self.blockchain.lock().unwrap().is_block_cache_full(); - if block_cache_size >= BLOCK_CACHE_THRESHOLD_BYTES { - debug!( - self.logger, - "Cache Size: {}, Max Size: {}", block_cache_size, BLOCK_CACHE_THRESHOLD_BYTES - ); + if is_cache_full { + debug!(self.logger, "Cache full"); + return; } - let is_cache_full = block_cache_size >= BLOCK_CACHE_THRESHOLD_BYTES; - // Count the number of requests per peer. let mut requests_per_peer: HashMap = self.peer_info.keys().map(|addr| (*addr, 0)).collect(); @@ -559,15 +557,17 @@ impl BlockchainManager { *counter = counter.saturating_add(1); } - let mut peer_info: Vec<_> = self.peer_info.values_mut().collect(); - peer_info.sort_by(|a, b| { - let requests_sent_to_a = requests_per_peer.get(&a.socket).unwrap_or(&0); - let requests_sent_to_b = requests_per_peer.get(&b.socket).unwrap_or(&0); - requests_sent_to_a.cmp(requests_sent_to_b) - }); + // Rotate the peer_info vector to ensure that we are not always sending requests to the same peer. + let mut peers: Vec<_> = self.peer_info.values().collect(); + let len = peers.len(); + if len == 0 { + return; + } + peers.rotate_left(self.round_robin_offset % len); + self.round_robin_offset = (self.round_robin_offset + 1) % len; // For each peer, select a random subset of the inventory and send a "getdata" request for it. - for peer in peer_info { + for peer in peers { // Calculate number of inventory that can be sent in 'getdata' request to the peer. let requests_sent_to_peer = requests_per_peer.get(&peer.socket).unwrap_or(&0); let num_requests_to_be_sent = @@ -576,11 +576,7 @@ impl BlockchainManager { // Randomly sample some inventory to be requested from the peer. let mut selected_inventory = vec![]; for _ in 0..num_requests_to_be_sent { - match get_next_block_hash_to_sync( - is_cache_full, - &mut retry_queue, - &mut self.block_sync_queue, - ) { + match get_next_block_hash_to_sync(&mut retry_queue, &mut self.block_sync_queue) { Some(hash) => { selected_inventory.push(hash); } @@ -589,7 +585,7 @@ impl BlockchainManager { } if selected_inventory.is_empty() { - break; + continue; } trace!( @@ -753,20 +749,14 @@ impl BlockchainManager { } } +// Only returns a block if the cache is not full. +// Prioritzes new blocks that are in the sync queue over the ones in the retry queue, as +// blocks in the retry queue are most likely not part of the main chain. See more in CON-1464. fn get_next_block_hash_to_sync( - is_cache_full: bool, retry_queue: &mut LinkedHashSet, sync_queue: &mut LinkedHashSet, ) -> Option { - if !retry_queue.is_empty() { - return retry_queue.pop_front(); - } - - if is_cache_full { - return None; - } - - sync_queue.pop_front() + sync_queue.pop_front().or_else(|| retry_queue.pop_front()) } #[cfg(test)] @@ -1187,12 +1177,7 @@ pub mod test { .get(&block_1_hash) .expect("missing request info for block hash 1"); assert!( - request - .sent_at - .expect("should be some instant") - .elapsed() - .as_secs() - < GETDATA_REQUEST_TIMEOUT_SECS + request.sent_at.expect("should be some instant").elapsed() < GETDATA_REQUEST_TIMEOUT ); let getdata_command = channel .pop_back() @@ -1246,12 +1231,7 @@ pub mod test { .get(&block_1_hash) .expect("missing request info for block hash 1"); assert!( - request - .sent_at - .expect("should be some instant") - .elapsed() - .as_secs() - < GETDATA_REQUEST_TIMEOUT_SECS + request.sent_at.expect("should be some instant").elapsed() < GETDATA_REQUEST_TIMEOUT ); assert_eq!(request.socket, addr2); let getdata_command = channel @@ -1271,10 +1251,8 @@ pub mod test { ); } - /// This function tests to ensure that the BlockchainManager retries `getdata` requests - /// that have failed when calling `sync_blocks` with a full block cache. #[test] - fn test_ensure_getdata_requests_are_retried_with_a_full_cache() { + fn test_ensure_getdata_requests_are_not_retried_with_a_full_cache() { let addr = SocketAddr::from_str("127.0.0.1:8333").expect("bad address format"); let sockets = vec![addr]; let mut channel = TestChannel::new(sockets.clone()); @@ -1302,7 +1280,7 @@ pub mod test { blockchain.add_block(block).expect("failed to add block"); } - assert!(blockchain.get_block_cache_size() >= BLOCK_CACHE_THRESHOLD_BYTES); + assert!(blockchain.is_block_cache_full()); } let block_1_hash = large_blockchain_headers @@ -1321,35 +1299,16 @@ pub mod test { blockchain_manager.sync_blocks(&mut channel); - assert_eq!(blockchain_manager.getdata_request_info.len(), 1); + // The `getdata_request_info` should be empty as the block cache is at the size threshold. + // Additionally, the previous entry in get_data_request_info was removed because it timed out. + assert_eq!(blockchain_manager.getdata_request_info.len(), 0); // The request is considered retried if its timeout is less than the the timeout seconds. - let request = blockchain_manager - .getdata_request_info - .get(&block_1_hash) - .expect("missing request info for block hash 1"); - assert!( - request - .sent_at - .expect("should be some instant") - .elapsed() - .as_secs() - < GETDATA_REQUEST_TIMEOUT_SECS - ); - let getdata_command = channel - .pop_back() - .expect("there should `getdata` request in the channel"); - assert!(matches!( - getdata_command.message, - NetworkMessage::GetData(_) - )); - let hashes_sent = match getdata_command.message { - NetworkMessage::GetData(inv) => inv, - _ => vec![], - }; - assert_eq!(hashes_sent.len(), 1); - assert!( - matches!(hashes_sent.first(), Some(Inventory::Block(hash)) if *hash == block_1_hash) - ); + while let Some(command) = channel.pop_front() { + assert!( + !matches!(command.message, NetworkMessage::GetData(_)), + "Found a `GetData` command, but none was expected." + ); + } } /// Tests the `BlockchainManager::idle(...)` function to ensure it clears the state from the @@ -1599,7 +1558,7 @@ pub mod test { /// Test to check that the retry queue is always used to retrieve the next block hash. #[test] - fn test_get_next_block_hash_to_sync_always_retrieves_from_the_retry_queue() { + fn test_get_next_block_hash_to_sync_retrieves_from_sync_queue_first_only_if_cahce_not_full() { let genesis_block = genesis_block(Network::Regtest); let headers = generate_headers( genesis_block.block_hash(), @@ -1607,9 +1566,11 @@ pub mod test { 3, &[], ); - let mut retry_queue: LinkedHashSet = + // Sync queue starts with 2 times + let mut sync_queue: LinkedHashSet = headers.iter().map(|h| h.block_hash()).take(2).collect(); - let mut sync_queue: LinkedHashSet = headers + // Retry queue starts with 1 item. + let mut retry_queue: LinkedHashSet = headers .iter() .map(|h| h.block_hash()) .skip(2) @@ -1617,43 +1578,15 @@ pub mod test { .collect(); // Try with `is_cache_full` set to false. - let first_hash = retry_queue + let first_hash = sync_queue .front() .copied() - .expect("Retry queue should have 2 items."); - let result = get_next_block_hash_to_sync(false, &mut retry_queue, &mut sync_queue); + .expect("Sync queue queue should have 2 items."); + let result = get_next_block_hash_to_sync(&mut retry_queue, &mut sync_queue); + // The result is part of sync queue, and now sync queue only has one item assert!(matches!(result, Some(block_hash) if block_hash == first_hash)); assert_eq!(retry_queue.len(), 1); assert_eq!(sync_queue.len(), 1); - - // Try with `is_cache_full` set to true. - let first_hash = retry_queue - .front() - .copied() - .expect("Retry queue should have 1 item."); - let result = get_next_block_hash_to_sync(true, &mut retry_queue, &mut sync_queue); - assert!(matches!(result, Some(block_hash) if block_hash == first_hash)); - assert_eq!(sync_queue.len(), 1); - assert_eq!(retry_queue.len(), 0); - } - - /// Tests if the cache is full and the retry queue is empty, then no blocks are returned. - #[test] - fn test_get_next_block_hash_to_sync_full_cache_and_empty_retry_queue() { - let genesis_block = genesis_block(Network::Regtest); - let headers = generate_headers( - genesis_block.block_hash(), - genesis_block.header.time, - 1, - &[], - ); - let mut retry_queue = LinkedHashSet::new(); - let mut sync_queue: LinkedHashSet = - headers.iter().map(|h| h.block_hash()).collect(); - let result = get_next_block_hash_to_sync(true, &mut retry_queue, &mut sync_queue); - assert!(result.is_none()); - assert_eq!(sync_queue.len(), 1); - assert_eq!(retry_queue.len(), 0); } /// Tests that the sync queue is used last only if the cache is not full and the retry queue @@ -1674,7 +1607,7 @@ pub mod test { .front() .copied() .expect("Sync queue should have 1 item."); - let result = get_next_block_hash_to_sync(false, &mut retry_queue, &mut sync_queue); + let result = get_next_block_hash_to_sync(&mut retry_queue, &mut sync_queue); assert!(matches!(result, Some(block_hash) if block_hash == first_hash)); assert_eq!(sync_queue.len(), 0); assert_eq!(retry_queue.len(), 0); diff --git a/rs/bitcoin/adapter/src/blockchainstate.rs b/rs/bitcoin/adapter/src/blockchainstate.rs index b0711f5e3b1..b88653637ee 100644 --- a/rs/bitcoin/adapter/src/blockchainstate.rs +++ b/rs/bitcoin/adapter/src/blockchainstate.rs @@ -2,15 +2,21 @@ //! use crate::{common::BlockHeight, config::Config, metrics::BlockchainStateMetrics}; use bitcoin::{ - block::Header as BlockHeader, blockdata::constants::genesis_block, Block, BlockHash, Network, + block::Header as BlockHeader, blockdata::constants::genesis_block, consensus::Encodable, Block, + BlockHash, Network, }; +use bitcoin::Work; use ic_btc_validation::{validate_header, HeaderStore, ValidateHeaderError}; use ic_metrics::MetricsRegistry; -use std::collections::HashMap; +use std::{collections::HashMap, sync::Arc}; use thiserror::Error; -use bitcoin::Work; +/// The limit at which we should stop making additional requests for new blocks as the block cache +/// becomes too large. Inflight `getdata` messages will remain active, but new `getdata` messages will +/// not be created. +const BLOCK_CACHE_THRESHOLD_BYTES: usize = 10 * ONE_MB; +const ONE_MB: usize = 1_024 * 1_024; /// Contains the necessary information about a tip. #[derive(Clone, Debug)] @@ -77,11 +83,16 @@ pub enum AddBlockError { /// Used to indicate that the merkle root of the block is invalid. #[error("Received a block with an invalid merkle root: {0}")] InvalidMerkleRoot(BlockHash), - // Used to indicate when the header causes an error while adding a block to the state. + /// Used to indicate when the header causes an error while adding a block to the state. #[error("Block's header caused an error: {0}")] Header(AddHeaderError), + /// Used to indicate that the block could not be serialized. + #[error("Serialization error for block {0} with error {1}")] + CouldNotSerialize(BlockHash, String), } +pub type SerializedBlock = Vec; + /// This struct is a cache of Bitcoin blockchain. /// The BlockChainState caches all the Bitcoin headers, some of the Bitcoin blocks. /// The BlockChainState also maintains the child relationhips between the headers. @@ -93,8 +104,8 @@ pub struct BlockchainState { /// This field stores all the Bitcoin headers using a HashMap containining BlockHash and the corresponding header. header_cache: HashMap, - /// This field stores a hashmap containing BlockHash and the corresponding Block. - block_cache: HashMap, + /// This field stores a hashmap containing BlockHash and the corresponding SerializedBlock. + block_cache: HashMap>, /// This field contains the known tips of the header cache. tips: Vec, @@ -137,6 +148,11 @@ impl BlockchainState { self.header_cache.get(hash) } + /// Returns the hashes of all cached blocks. + pub(crate) fn get_cached_blocks(&self) -> Vec { + self.block_cache.keys().copied().collect() + } + /// Processes the `headers` message received from Bitcoin nodes by adding them to the state. /// Headers are expected to be sorted. If they are not, the headers will be likely be rejected /// with a [AddHeaderError::PrevHeaderNotCached](AddHeaderError::PrevHeaderNotCached) error. @@ -240,7 +256,15 @@ impl BlockchainState { .add_header(block.header) .map_err(AddBlockError::Header)?; self.tips.sort_unstable_by(|a, b| b.work.cmp(&a.work)); - self.block_cache.insert(block_hash, block); + + let mut serialized_block = vec![]; + block + .consensus_encode(&mut serialized_block) + .map_err(|e| AddBlockError::CouldNotSerialize(block_hash, e.to_string()))?; + + self.block_cache + .insert(block_hash, Arc::new(serialized_block)); + self.metrics .block_cache_size .set(self.get_block_cache_size() as i64); @@ -317,10 +341,10 @@ impl BlockchainState { hashes } - /// This method takes a list of block hashes as input. - /// For each block hash, if the corresponding block is stored in the `block_cache`, the cached block is returned. - pub fn get_block(&self, block_hash: &BlockHash) -> Option<&Block> { - self.block_cache.get(block_hash) + /// This method takes a block hash + /// If the corresponding block is stored in the `block_cache`, the cached block is returned. + pub fn get_block(&self, block_hash: &BlockHash) -> Option> { + self.block_cache.get(block_hash).cloned() } /// Used when the adapter is shutdown and no longer requires holding on to blocks. @@ -328,11 +352,13 @@ impl BlockchainState { self.block_cache = HashMap::new(); } + pub(crate) fn is_block_cache_full(&self) -> bool { + self.get_block_cache_size() >= BLOCK_CACHE_THRESHOLD_BYTES + } + /// Returns the current size of the block cache. pub fn get_block_cache_size(&self) -> usize { - self.block_cache - .values() - .fold(0, |sum, b| b.total_size() + sum) + self.block_cache.values().map(|block| block.len()).sum() } } @@ -353,7 +379,7 @@ impl HeaderStore for BlockchainState { #[cfg(test)] mod test { - use bitcoin::TxMerkleNode; + use bitcoin::{consensus::Decodable, Block, TxMerkleNode}; use ic_metrics::MetricsRegistry; use super::*; @@ -377,12 +403,14 @@ mod test { let mut cached_blocks = vec![]; for hash in &block_hashes { if let Some(block) = state.get_block(hash) { - cached_blocks.push(block); + cached_blocks.push((*hash, block)); } } assert_eq!(cached_blocks.len(), 1); - let block = cached_blocks.first().expect("there should be 1"); + let (block_hash, serialized_block) = cached_blocks.first().expect("there should be 1"); + let block = Block::consensus_decode(&mut (*serialized_block).as_slice()).unwrap(); + assert_eq!(*block_hash, block_1_hash); assert_eq!(block.block_hash(), block_1_hash); } diff --git a/rs/bitcoin/adapter/src/config.rs b/rs/bitcoin/adapter/src/config.rs index 50bbe9ead7a..f599b1bc5ce 100644 --- a/rs/bitcoin/adapter/src/config.rs +++ b/rs/bitcoin/adapter/src/config.rs @@ -62,9 +62,11 @@ pub fn address_limits(network: Network) -> (usize, usize) { match network { Network::Bitcoin => (500, 2000), Network::Testnet => (100, 1000), + //TODO(mihailjianu): revisit these values + Network::Testnet4 => (100, 1000), Network::Signet => (1, 1), Network::Regtest => (1, 1), - other => unreachable!("Unsupported network: {:?}", other), + _ => (1, 1), } } @@ -74,6 +76,7 @@ impl Config { match self.network { Network::Bitcoin => 8333, Network::Testnet => 18333, + Network::Testnet4 => 48333, _ => 8333, } } diff --git a/rs/bitcoin/adapter/src/connectionmanager.rs b/rs/bitcoin/adapter/src/connectionmanager.rs index eeb9f8eaad6..66983abf938 100644 --- a/rs/bitcoin/adapter/src/connectionmanager.rs +++ b/rs/bitcoin/adapter/src/connectionmanager.rs @@ -394,6 +394,10 @@ impl ConnectionManager { addr: &SocketAddr, network_message: NetworkMessage, ) -> ConnectionManagerResult<()> { + self.metrics + .bitcoin_messages_sent + .with_label_values(&[network_message.cmd()]) + .inc(); let conn = self.get_connection(addr)?; if conn.send(network_message).is_err() { conn.disconnect(); @@ -586,10 +590,6 @@ impl ConnectionManager { impl Channel for ConnectionManager { fn send(&mut self, command: Command) -> Result<(), ChannelError> { - self.metrics - .bitcoin_messages_sent - .with_label_values(&[command.message.cmd()]) - .inc(); let Command { address, message } = command; if let Some(addr) = address { self.send_to(&addr, message).ok(); diff --git a/rs/bitcoin/adapter/src/get_successors_handler.rs b/rs/bitcoin/adapter/src/get_successors_handler.rs index d3ddc79e9ea..36b3110c62e 100644 --- a/rs/bitcoin/adapter/src/get_successors_handler.rs +++ b/rs/bitcoin/adapter/src/get_successors_handler.rs @@ -3,14 +3,15 @@ use std::{ sync::{Arc, Mutex}, }; -use bitcoin::{block::Header as BlockHeader, Block, BlockHash, Network}; +use bitcoin::{block::Header as BlockHeader, BlockHash, Network}; use ic_metrics::MetricsRegistry; +use static_assertions::const_assert_eq; use tokio::sync::mpsc::Sender; use tonic::Status; use crate::{ - common::BlockHeight, config::Config, metrics::GetSuccessorMetrics, BlockchainManagerRequest, - BlockchainState, + blockchainstate::SerializedBlock, common::BlockHeight, config::Config, + metrics::GetSuccessorMetrics, BlockchainManagerRequest, BlockchainState, }; // Max size of the `GetSuccessorsResponse` message. @@ -21,6 +22,10 @@ use crate::{ // for pagination on the replica side to work as expected. const MAX_RESPONSE_SIZE: usize = 2_000_000; +// Lower than mainnet's response size. The main reason is large serialization time +// for large blocks. +const TESTNET4_MAX_RESPONSE_SIZE: usize = 1_000_000; + // Max number of next block headers that can be returned in the `GetSuccessorsResponse`. const MAX_NEXT_BLOCK_HEADERS_LENGTH: usize = 100; @@ -28,6 +33,15 @@ const MAX_NEXT_BLOCK_HEADERS_LENGTH: usize = 100; // We limit the number of blocks because serializing many blocks to pb can take some time. const MAX_BLOCKS_LENGTH: usize = 100; +// The maximum number of get blocks requests that can be in-flight at any given time. +const MAX_IN_FLIGHT_BLOCKS: usize = 100; + +// The maximum number of get blocks requests that can be in-flight at any given time. +// The number of blocks outside of the main chain easily exceeds 100 currently on testnet4. +// Setting this to 100 would prevent the adapter from making progress, +// as it gets stuck on these blocks, whose requests timeout indefinitely. +const TESTNET4_MAX_IN_FLIGHT_BLOCKS: usize = 1000; + const BLOCK_HEADER_SIZE: usize = 80; // The maximum number of bytes the `next` field in a response can take. @@ -38,6 +52,14 @@ const MAX_NEXT_BYTES: usize = MAX_NEXT_BLOCK_HEADERS_LENGTH * BLOCK_HEADER_SIZE; // Having this as a soft limit as necessary to prevent large blocks from stalling consensus. const MAX_BLOCKS_BYTES: usize = MAX_RESPONSE_SIZE - MAX_NEXT_BYTES; +const TESTNET4_MAX_BLOCKS_BYTES: usize = TESTNET4_MAX_RESPONSE_SIZE - MAX_NEXT_BYTES; + +const_assert_eq!(MAX_NEXT_BYTES + MAX_BLOCKS_BYTES, MAX_RESPONSE_SIZE); +const_assert_eq!( + MAX_NEXT_BYTES + TESTNET4_MAX_BLOCKS_BYTES, + TESTNET4_MAX_RESPONSE_SIZE +); + // Max height for sending multiple blocks when connecting the Bitcoin mainnet. const MAINNET_MAX_MULTI_BLOCK_ANCHOR_HEIGHT: BlockHeight = 750_000; @@ -52,7 +74,7 @@ pub struct GetSuccessorsRequest { #[derive(Clone, Eq, PartialEq, Debug)] pub struct GetSuccessorsResponse { /// Blocks found in the block cache. - pub blocks: Vec, + pub blocks: Vec>, /// Next set of headers to be sent to the canister. pub next: Vec, } @@ -96,7 +118,7 @@ impl GetSuccessorsHandler { .processed_block_hashes .observe(request.processed_block_hashes.len() as f64); - let response = { + let (blocks, next, obsolete_blocks) = { let state = self.state.lock().unwrap(); let anchor_height = state .get_cached_header(&request.anchor) @@ -108,32 +130,47 @@ impl GetSuccessorsHandler { &request.anchor, &request.processed_block_hashes, allow_multiple_blocks, + self.network, ); let next = get_next_headers( &state, &request.anchor, &request.processed_block_hashes, &blocks, + self.network, ); - GetSuccessorsResponse { blocks, next } + // If no blocks are returned, this means that nothing that is in the cache could be reached from the anchor. + // We can safely remove everything that is in the cache then, as those blocks are no longer needed. + // There is a chance that these blocks are above the anchor height (but they were forked below it), + // meaning that the regular "pruning anything below anchor" will not affect them. + // There is also a chance that they are reachable from the anchor, just not through the cache. + // Meaning that we still need to download some other blocks first. (hence we need to free the cache). + let mut obsolete_blocks = request.processed_block_hashes; + if blocks.is_empty() && state.is_block_cache_full() { + obsolete_blocks.extend(state.get_cached_blocks()) + } + (blocks, next, obsolete_blocks) + }; + let response_next = &next[..next.len().min(MAX_NEXT_BLOCK_HEADERS_LENGTH)]; + let response = GetSuccessorsResponse { + blocks: blocks.into_iter().map(|(_, block)| block).collect(), + next: response_next.to_vec(), }; self.metrics .response_blocks .observe(response.blocks.len() as f64); - if !response.next.is_empty() { + if !next.is_empty() { // TODO: better handling of full channel as the receivers are never closed. self.blockchain_manager_tx - .try_send(BlockchainManagerRequest::EnqueueNewBlocksToDownload( - response.next.clone(), - )) + .try_send(BlockchainManagerRequest::EnqueueNewBlocksToDownload(next)) .ok(); } // TODO: better handling of full channel as the receivers are never closed. self.blockchain_manager_tx .try_send(BlockchainManagerRequest::PruneBlocks( request.anchor, - request.processed_block_hashes, + obsolete_blocks, )) .ok(); @@ -151,7 +188,8 @@ fn get_successor_blocks( anchor: &BlockHash, processed_block_hashes: &[BlockHash], allow_multiple_blocks: bool, -) -> Vec { + network: Network, +) -> Vec<(BlockHash, Arc)> { let seen: HashSet = processed_block_hashes.iter().copied().collect(); let mut successor_blocks = vec![]; @@ -162,30 +200,36 @@ fn get_successor_blocks( .map(|c| c.children.iter().collect()) .unwrap_or_default(); + let max_blocks_size = match network { + Network::Testnet4 => TESTNET4_MAX_BLOCKS_BYTES, + _ => MAX_BLOCKS_BYTES, + }; + + let max_blocks_length = if allow_multiple_blocks { + MAX_BLOCKS_LENGTH + } else { + 1 + }; + // Compute the blocks by starting a breadth-first search. while let Some(block_hash) = queue.pop_front() { if !seen.contains(block_hash) { // Retrieve the block from the cache. - match state.get_block(block_hash) { - Some(block) => { - let block_size = block.total_size(); - if response_block_size == 0 - || (response_block_size + block_size <= MAX_BLOCKS_BYTES - && successor_blocks.len() < MAX_BLOCKS_LENGTH - && allow_multiple_blocks) - { - successor_blocks.push(block.clone()); - response_block_size += block_size; - } else { - break; - } - } - None => { - // Cache miss has occurred. This block or any of its successors cannot - // be returned. Discarding this subtree from the BFS. - continue; - } + let Some(block) = state.get_block(block_hash) else { + // If the block is not in the cache, we skip it and all its subtree. + // We don't want to return orphaned blocks to the canister. + continue; + }; + let block_size = block.len(); + // If we have at least one block in the response, and we can't fit another block, we stop. + if response_block_size > 0 + && (response_block_size + block_size > max_blocks_size + || successor_blocks.len() + 1 > max_blocks_length) + { + break; } + successor_blocks.push((*block_hash, block)); + response_block_size += block_size; } queue.extend( @@ -200,16 +244,20 @@ fn get_successor_blocks( } /// Get the next headers for blocks that may possibly be sent in upcoming GetSuccessor responses. +/// This returns the first MAX_IN_FLIGHT_BLOCKS / TESTNET4_MAX_IN_FLIGHT_BLOCKS headers from the anchor in BFS fashion +/// which are not in processed nor are they in the current response. Essentially representing the +/// blocks that should be returned in the next response. fn get_next_headers( state: &BlockchainState, anchor: &BlockHash, processed_block_hashes: &[BlockHash], - blocks: &[Block], + blocks: &[(BlockHash, Arc)], + network: Network, ) -> Vec { let seen: HashSet = processed_block_hashes .iter() .copied() - .chain(blocks.iter().map(|b| b.block_hash())) + .chain(blocks.iter().map(|(hash, _)| *hash)) .collect(); let mut queue: VecDeque<&BlockHash> = state @@ -217,9 +265,14 @@ fn get_next_headers( .map(|c| c.children.iter().collect()) .unwrap_or_default(); + let max_in_flight_blocks = match network { + Network::Testnet4 => TESTNET4_MAX_IN_FLIGHT_BLOCKS, + _ => MAX_IN_FLIGHT_BLOCKS, + }; + let mut next_headers = vec![]; while let Some(block_hash) = queue.pop_front() { - if next_headers.len() >= MAX_NEXT_BLOCK_HEADERS_LENGTH { + if next_headers.len() >= max_in_flight_blocks { break; } @@ -237,7 +290,7 @@ fn get_next_headers( fn are_multiple_blocks_allowed(network: Network, anchor_height: BlockHeight) -> bool { match network { Network::Bitcoin => anchor_height <= MAINNET_MAX_MULTI_BLOCK_ANCHOR_HEIGHT, - Network::Testnet | Network::Signet | Network::Regtest => true, + Network::Testnet | Network::Signet | Network::Regtest | Network::Testnet4 => true, other => unreachable!("Unsupported network: {:?}", other), } } @@ -248,7 +301,7 @@ mod test { use std::sync::{Arc, Mutex}; - use bitcoin::Network; + use bitcoin::{consensus::Decodable, Block, Network}; use ic_metrics::MetricsRegistry; use tokio::sync::mpsc::channel; @@ -257,6 +310,10 @@ mod test { generate_headers, generate_large_block_blockchain, headers_to_hashes, }; + fn decode_block(serialized_block: &Arc) -> Block { + Block::consensus_decode(&mut (*serialized_block).as_slice()).unwrap() + } + /// This tests ensures that `BlockchainManager::get_successors(...)` will return relevant blocks /// with the next headers of many forks and enqueue missing block hashes. #[tokio::test] @@ -330,7 +387,7 @@ mod test { // Check that blocks contain block 1. assert_eq!(response.blocks.len(), 1); assert!( - matches!(response.blocks.first(), Some(block) if block.block_hash() == side_block_1.block_hash()) + matches!(response.blocks.first(), Some(block) if decode_block(block).block_hash() == side_block_1.block_hash()) ); assert_eq!(response.next.len(), 6); @@ -478,13 +535,13 @@ mod test { let response = handler.get_successors(request).await.unwrap(); assert_eq!(response.blocks.len(), 3); assert!( - matches!(response.blocks.first(), Some(block) if block.block_hash() == main_block_1.block_hash()) + matches!(response.blocks.first(), Some(block) if decode_block(block).block_hash() == main_block_1.block_hash()) ); assert!( - matches!(response.blocks.get(1), Some(block) if block.block_hash() == side_block_1.block_hash()) + matches!(response.blocks.get(1), Some(block) if decode_block(block).block_hash() == side_block_1.block_hash()) ); assert!( - matches!(response.blocks.get(2), Some(block) if block.block_hash() == main_block_2.block_hash()) + matches!(response.blocks.get(2), Some(block) if decode_block(block).block_hash() == main_block_2.block_hash()) ); } @@ -600,11 +657,11 @@ mod test { response .blocks .iter() - .map(|b| b.block_hash()) + .map(|b| decode_block(b).block_hash()) .collect::>() ); assert!( - matches!(response.blocks.first(), Some(block) if block.block_hash() == side_block_1.block_hash()) + matches!(response.blocks.first(), Some(block) if decode_block(block).block_hash() == side_block_1.block_hash()) ); assert_eq!( response.next.len(), @@ -673,7 +730,7 @@ mod test { // Only the large block should be returned in this response. assert_eq!(response.blocks.len(), 1); assert!( - matches!(response.blocks.first(), Some(block) if block.block_hash() == large_block.block_hash() && block.txdata.len() == large_block.txdata.len()) + matches!(response.blocks.first(), Some(block) if decode_block(block).block_hash() == large_block.block_hash() && decode_block(block).txdata.len() == large_block.txdata.len()) ); // The smaller block's header should be in the next field. assert!( @@ -731,7 +788,7 @@ mod test { // Should return the first 5 blocks as the total size is below the cap. assert_eq!(response.blocks.len(), 5); assert!( - matches!(response.blocks.last(), Some(block) if block.block_hash() == main_chain.last().unwrap().block_hash()) + matches!(response.blocks.last(), Some(block) if decode_block(block).block_hash() == main_chain.last().unwrap().block_hash()) ); // The next field should contain the large block header as it is too large for the request. @@ -780,9 +837,4 @@ mod test { u32::MAX ); } - - #[test] - fn response_size() { - assert_eq!(MAX_NEXT_BYTES + MAX_BLOCKS_BYTES, MAX_RESPONSE_SIZE); - } } diff --git a/rs/bitcoin/adapter/src/rpc_server.rs b/rs/bitcoin/adapter/src/rpc_server.rs index 26416410e06..5d784724fe2 100644 --- a/rs/bitcoin/adapter/src/rpc_server.rs +++ b/rs/bitcoin/adapter/src/rpc_server.rs @@ -56,11 +56,8 @@ impl TryFrom for BtcServiceGetSuccessorsResponse { type Error = Status; fn try_from(response: GetSuccessorsResponse) -> Result { let mut blocks = vec![]; - for block in response.blocks.iter() { - let mut encoded_block = vec![]; - block - .consensus_encode(&mut encoded_block) - .map_err(|_| Status::unknown("Failed to encode block!"))?; + for block in response.blocks { + let encoded_block = Arc::unwrap_or_clone(block); blocks.push(encoded_block); } diff --git a/rs/bitcoin/adapter/tests/adapter_test.rs b/rs/bitcoin/adapter/tests/adapter_test.rs index 693f3229c3a..ce3a07b81a2 100644 --- a/rs/bitcoin/adapter/tests/adapter_test.rs +++ b/rs/bitcoin/adapter/tests/adapter_test.rs @@ -496,7 +496,7 @@ fn check_fork_bfs_order( .collect::>>(), anchor, expected_len, - 200, + 400, ); assert_eq!(blocks.len(), expected_len); let block_hashes: Vec = blocks.iter().map(|block| block.block_hash()).collect(); @@ -830,19 +830,19 @@ fn test_receives_blocks_from_forks() { .get_new_address(None, None) .unwrap() .assume_checked(); - client1.generate_to_address(25, &address1).unwrap(); + client1.generate_to_address(10, &address1).unwrap(); - wait_for_blocks(&client1, 25); - wait_for_blocks(&client2, 25); + wait_for_blocks(&client1, 10); + wait_for_blocks(&client2, 10); let address2 = client2 .get_new_address(None, None) .unwrap() .assume_checked(); - client2.generate_to_address(25, &address2).unwrap(); + client2.generate_to_address(10, &address2).unwrap(); - wait_for_blocks(&client1, 50); - wait_for_blocks(&client2, 50); + wait_for_blocks(&client1, 20); + wait_for_blocks(&client2, 20); // Disconnect the nodes to create a fork client1 @@ -852,15 +852,15 @@ fn test_receives_blocks_from_forks() { wait_for_connection(&client1, 1); wait_for_connection(&client2, 1); - client1.generate_to_address(10, &address1).unwrap(); - client2.generate_to_address(15, &address2).unwrap(); + client1.generate_to_address(3, &address1).unwrap(); + client2.generate_to_address(6, &address2).unwrap(); - wait_for_blocks(&client1, 60); - wait_for_blocks(&client2, 65); + wait_for_blocks(&client1, 23); + wait_for_blocks(&client2, 26); let anchor = client1.get_block_hash(0).unwrap()[..].to_vec(); - let blocks = sync_blocks(&adapter_client, &mut vec![], anchor, 75, 200); - assert_eq!(blocks.len(), 75); + let blocks = sync_blocks(&adapter_client, &mut vec![], anchor, 29, 201); + assert_eq!(blocks.len(), 29); } /// Checks that the adapter returns blocks in BFS order. @@ -917,18 +917,18 @@ fn test_bfs_order() { wait_for_connection(&client1, 1); wait_for_connection(&client2, 1); - let fork1 = client1.generate_to_address(15, &address1).unwrap(); + let fork1 = client1.generate_to_address(6, &address1).unwrap(); let address2 = client2 .get_new_address(None, None) .unwrap() .assume_checked(); - let fork2 = client2.generate_to_address(15, &address2).unwrap(); + let fork2 = client2.generate_to_address(6, &address2).unwrap(); - wait_for_blocks(&client1, 20); - wait_for_blocks(&client2, 20); + wait_for_blocks(&client1, 11); + wait_for_blocks(&client2, 11); - assert_eq!(fork1.len() + fork2.len(), 30); + assert_eq!(fork1.len() + fork2.len(), 12); client1 .onetry_node(&url2.to_string()) @@ -953,8 +953,8 @@ fn test_bfs_order() { ); assert!(bfs_order1 == block_hashes || bfs_order2 == block_hashes); - fork_test_data1.update_excluded(5, 10); - fork_test_data2.update_excluded(10, 15); + fork_test_data1.update_excluded(2, 4); + fork_test_data2.update_excluded(4, 6); let (block_hashes, bfs_order1, bfs_order2) = check_fork_bfs_order( &shared_blocks, &fork_test_data1, @@ -964,8 +964,8 @@ fn test_bfs_order() { ); assert!(bfs_order1 == block_hashes || bfs_order2 == block_hashes); - fork_test_data1.update_excluded(0, 15); - fork_test_data2.update_excluded(10, 15); + fork_test_data1.update_excluded(0, 6); + fork_test_data2.update_excluded(4, 6); let (block_hashes, bfs_order1, bfs_order2) = check_fork_bfs_order( &shared_blocks, &fork_test_data1, diff --git a/rs/bitcoin/checker/BUILD.bazel b/rs/bitcoin/checker/BUILD.bazel index e881302c0d4..9407c89cd58 100644 --- a/rs/bitcoin/checker/BUILD.bazel +++ b/rs/bitcoin/checker/BUILD.bazel @@ -19,6 +19,7 @@ rust_library( # Keep sorted. "@crate_index//:bitcoin", "@crate_index//:candid", + "@crate_index//:ic-btc-interface", "@crate_index//:serde", ], ) diff --git a/rs/bitcoin/checker/btc_checker_canister.did b/rs/bitcoin/checker/btc_checker_canister.did index e17b711a521..da57916a7ca 100644 --- a/rs/bitcoin/checker/btc_checker_canister.did +++ b/rs/bitcoin/checker/btc_checker_canister.did @@ -11,6 +11,11 @@ type CheckTransactionArgs = record { txid : blob }; type CheckTransactionStrArgs = record { txid : text }; +type CheckTransactionQueryArgs = variant { + TxIdStr : text; + TxIdBin : blob; +}; + // The result of a check_transaction call. type CheckTransactionResponse = variant { // When check finishes and all input addresses passed. @@ -50,6 +55,18 @@ type CheckTransactionIrrecoverableError = variant { InvalidTransaction : text; }; +// The result of a check_transaction_query call. +type CheckTransactionQueryResponse = variant { + // When check finishes and all input addresses passed. + Passed; + // When check finishes and one or more input addresses failed. + // The list of failed addresses are returned as a best effort, which may be non-exhaustive. + Failed: vec BitcoinAddress; + // The result is not available, but may be obtainable via a call to the non-query version + // of `check_transaction`. + Unknown; +}; + type InitArg = record { btc_network : BtcNetwork; check_mode : CheckMode; @@ -91,6 +108,11 @@ service : (CheckArg) -> { // Same as check_transaction, but taking the transaction id argument as a string. check_transaction_str: (CheckTransactionStrArgs) -> (CheckTransactionResponse); + // Same as check_transaction, but query method, hence it does not perform any HTTP + // outcalls to fetch the required information. + // IMPORTANT: this endpoint is meant as a debugging tool and is not guaranteed to be backwards-compatible. + check_transaction_query: (CheckTransactionQueryArgs) -> (CheckTransactionQueryResponse) query; + // Return `Passed` if the given Bitcoin address passes the Bitcoin checker, or `Failed` otherwise. // May throw error (trap) if the given address is malformed or not a mainnet address. check_address: (CheckAddressArgs) -> (CheckAddressResponse) query; diff --git a/rs/bitcoin/checker/src/fetch.rs b/rs/bitcoin/checker/src/fetch.rs index 5afe2ec25e6..2b54c89826c 100644 --- a/rs/bitcoin/checker/src/fetch.rs +++ b/rs/bitcoin/checker/src/fetch.rs @@ -8,8 +8,8 @@ use bitcoin::Transaction; use futures::future::try_join_all; use ic_btc_checker::{ blocklist::is_blocked, get_tx_cycle_cost, CheckTransactionIrrecoverableError, - CheckTransactionResponse, CheckTransactionRetriable, CheckTransactionStatus, - INITIAL_MAX_RESPONSE_BYTES, RETRY_MAX_RESPONSE_BYTES, + CheckTransactionQueryResponse, CheckTransactionResponse, CheckTransactionRetriable, + CheckTransactionStatus, INITIAL_MAX_RESPONSE_BYTES, RETRY_MAX_RESPONSE_BYTES, }; use ic_btc_interface::Txid; use ic_canister_log::log; @@ -183,23 +183,10 @@ pub trait FetchEnv { /// /// Pre-condition: `txid` already exists in state with a `Fetched` status. async fn check_fetched(&self, txid: Txid, fetched: &FetchedTx) -> CheckTransactionResponse { - // Return Passed or Failed when all checks are complete, or None otherwise. - fn check_completed(fetched: &FetchedTx) -> Option { - if fetched.input_addresses.iter().all(|x| x.is_some()) { - // We have obtained all input addresses. - for address in fetched.input_addresses.iter().flatten() { - if is_blocked(address) { - return Some(CheckTransactionResponse::Failed(vec![address.to_string()])); - } - } - Some(CheckTransactionResponse::Passed) - } else { - None - } - } - - if let Some(result) = check_completed(fetched) { - return result; + match check_for_blocked_input_addresses(fetched) { + // If some input addresses are missing, try to fetch them and try again. + Err(CheckTxInputsError::MissingInputAddresses) => (), + result => return result.into(), } let mut futures = vec![]; @@ -279,12 +266,58 @@ pub trait FetchEnv { return err; } // Check again to see if we have completed - match state::get_fetch_status(txid).and_then(|result| match result { - FetchTxStatus::Fetched(fetched) => check_completed(&fetched), - _ => None, - }) { - Some(result) => result, - None => CheckTransactionRetriable::Pending.into(), + if let Some(FetchTxStatus::Fetched(fetched)) = state::get_fetch_status(txid) { + check_for_blocked_input_addresses(&fetched).into() + } else { + CheckTransactionRetriable::Pending.into() + } + } +} + +#[derive(Debug, Clone)] +pub enum CheckTxInputsError { + MissingInputAddresses, + BlockedInputAddresses(Vec), +} + +impl From for CheckTransactionResponse { + fn from(error: CheckTxInputsError) -> Self { + match error { + CheckTxInputsError::MissingInputAddresses => CheckTransactionRetriable::Pending.into(), + CheckTxInputsError::BlockedInputAddresses(blocked) => { + CheckTransactionResponse::Failed(blocked) + } } } } + +impl From for CheckTransactionQueryResponse { + fn from(error: CheckTxInputsError) -> Self { + match error { + CheckTxInputsError::MissingInputAddresses => CheckTransactionQueryResponse::Unknown, + CheckTxInputsError::BlockedInputAddresses(blocked) => { + CheckTransactionQueryResponse::Failed(blocked) + } + } + } +} + +/// Return `Ok` if no input address is blocked, and an `Err` if either one of the input +/// addresses is blocked, or one of the input addresses is not available. +pub fn check_for_blocked_input_addresses(fetched: &FetchedTx) -> Result<(), CheckTxInputsError> { + if fetched.input_addresses.iter().any(|x| x.is_none()) { + return Err(CheckTxInputsError::MissingInputAddresses); + } + let blocked: Vec = fetched + .input_addresses + .iter() + .flatten() + .filter(|address| is_blocked(address)) + .map(|address| address.to_string()) + .collect(); + if blocked.is_empty() { + Ok(()) + } else { + Err(CheckTxInputsError::BlockedInputAddresses(blocked)) + } +} diff --git a/rs/bitcoin/checker/src/main.rs b/rs/bitcoin/checker/src/main.rs index e81f92263fc..bd30cbb2a77 100644 --- a/rs/bitcoin/checker/src/main.rs +++ b/rs/bitcoin/checker/src/main.rs @@ -3,9 +3,10 @@ use candid::Nat; use ic_btc_checker::{ blocklist::is_blocked, get_tx_cycle_cost, BtcNetwork, CheckAddressArgs, CheckAddressResponse, CheckArg, CheckMode, CheckTransactionArgs, CheckTransactionIrrecoverableError, - CheckTransactionResponse, CheckTransactionRetriable, CheckTransactionStatus, - CheckTransactionStrArgs, CHECK_TRANSACTION_CYCLES_REQUIRED, - CHECK_TRANSACTION_CYCLES_SERVICE_FEE, RETRY_MAX_RESPONSE_BYTES, + CheckTransactionQueryArgs, CheckTransactionQueryResponse, CheckTransactionResponse, + CheckTransactionRetriable, CheckTransactionStatus, CheckTransactionStrArgs, + CHECK_TRANSACTION_CYCLES_REQUIRED, CHECK_TRANSACTION_CYCLES_SERVICE_FEE, + RETRY_MAX_RESPONSE_BYTES, }; use ic_btc_interface::Txid; use ic_canister_log::{export as export_logs, log}; @@ -23,9 +24,9 @@ mod logs; mod providers; mod state; -use fetch::{FetchEnv, FetchResult, TryFetchResult}; +use fetch::{check_for_blocked_input_addresses, FetchEnv, FetchResult, TryFetchResult}; use logs::{Log, LogEntry, Priority, DEBUG, WARN}; -use state::{get_config, set_config, Config, FetchGuardError, HttpGetTxError}; +use state::{get_config, set_config, Config, FetchGuardError, FetchTxStatus, HttpGetTxError}; #[derive(PartialOrd, Ord, PartialEq, Eq)] enum HttpsOutcallStatus { @@ -105,15 +106,23 @@ fn check_address(args: CheckAddressArgs) -> CheckAddressResponse { /// together with a text description. #[ic_cdk::update] async fn check_transaction(args: CheckTransactionArgs) -> CheckTransactionResponse { - check_transaction_with(|| Txid::try_from(args.txid.as_ref()).map_err(|err| err.to_string())) - .await + check_transaction_with(|| Txid::try_from(args)).await } #[ic_cdk::update] async fn check_transaction_str(args: CheckTransactionStrArgs) -> CheckTransactionResponse { - use std::str::FromStr; - check_transaction_with(|| Txid::from_str(args.txid.as_ref()).map_err(|err| err.to_string())) - .await + check_transaction_with(|| Txid::try_from(args)).await +} + +/// Performs the same logic as `check_transaction`, but only returns `Pass` or `Failed` if the +/// TXID and all of its inputs are available in the heap memory cache, meaning no HTTP outcalls are +/// performed. Returns `Unknown` if the transaction cannot be checked with only cached information. +#[ic_cdk::query] +async fn check_transaction_query(args: CheckTransactionQueryArgs) -> CheckTransactionQueryResponse { + match Txid::try_from(args) { + Ok(txid) => check_fetched_transaction_inputs(txid).await, + Err(err) => panic!("Invalid transaction ID: {}", err), + } } async fn check_transaction_with Result>( @@ -515,6 +524,27 @@ pub async fn check_transaction_inputs(txid: Txid) -> CheckTransactionResponse { } } +/// Check the input addresses of a transaction given its txid without performing any HTTP outcalls. +/// A `Pass` or `Fail` status will only be returned if the txid and all of its inputs were already +/// fetched and available in heap memory. Otherwise, `Unknown` is returned. +pub async fn check_fetched_transaction_inputs(txid: Txid) -> CheckTransactionQueryResponse { + match BtcCheckerCanisterEnv.config().check_mode { + CheckMode::AcceptAll => CheckTransactionQueryResponse::Passed, + CheckMode::RejectAll => CheckTransactionQueryResponse::Failed(Vec::new()), + CheckMode::Normal => match state::get_fetch_status(txid) { + Some(FetchTxStatus::Fetched(fetched)) => { + check_for_blocked_input_addresses(&fetched).into() + } + Some( + FetchTxStatus::PendingOutcall + | FetchTxStatus::PendingRetry { .. } + | FetchTxStatus::Error(_), + ) + | None => CheckTransactionQueryResponse::Unknown, + }, + } +} + fn main() {} #[test] diff --git a/rs/bitcoin/checker/src/types.rs b/rs/bitcoin/checker/src/types.rs index 0a75c661978..8821c136d50 100644 --- a/rs/bitcoin/checker/src/types.rs +++ b/rs/bitcoin/checker/src/types.rs @@ -1,6 +1,7 @@ use candid::{CandidType, Deserialize}; +use ic_btc_interface::Txid; use serde::Serialize; -use std::fmt; +use std::{fmt, str::FromStr}; #[derive(CandidType, Debug, Deserialize, Serialize)] pub struct CheckAddressArgs { @@ -19,11 +20,48 @@ pub struct CheckTransactionArgs { pub txid: Vec, } +impl TryFrom for Txid { + type Error = String; + + fn try_from(args: CheckTransactionArgs) -> Result { + Txid::try_from(args.txid.as_ref()).map_err(|err| err.to_string()) + } +} + #[derive(CandidType, Debug, Deserialize, Serialize)] pub struct CheckTransactionStrArgs { pub txid: String, } +impl TryFrom for Txid { + type Error = String; + + fn try_from(args: CheckTransactionStrArgs) -> Result { + Txid::from_str(args.txid.as_ref()).map_err(|err| err.to_string()) + } +} + +#[derive(CandidType, Debug, Deserialize, Serialize)] +pub enum CheckTransactionQueryArgs { + TxIdBin(Vec), + TxIdStr(String), +} + +impl TryFrom for Txid { + type Error = String; + + fn try_from(args: CheckTransactionQueryArgs) -> Result { + match args { + CheckTransactionQueryArgs::TxIdBin(bytes) => { + Txid::try_from(bytes.as_ref()).map_err(|err| err.to_string()) + } + CheckTransactionQueryArgs::TxIdStr(string) => { + Txid::from_str(&string).map_err(|err| err.to_string()) + } + } + } +} + #[derive(CandidType, Debug, Clone, Deserialize, Serialize)] pub enum CheckTransactionResponse { /// When check finishes and all input addresses passed. @@ -56,16 +94,6 @@ pub enum CheckTransactionRetriable { TransientInternalError(String), } -#[derive(CandidType, Debug, Clone, Deserialize, Serialize)] -pub enum CheckTransactionIrrecoverableError { - /// Response size is too large (> `RETRY_MAX_RESPONSE_BYTES`) when fetching the transaction data of a txid. - ResponseTooLarge { txid: Vec }, - /// Invalid transaction id because it fails to decode. - InvalidTransactionId(String), - /// Invalid transaction. - InvalidTransaction(String), -} - impl From for CheckTransactionResponse { fn from(err: CheckTransactionIrrecoverableError) -> CheckTransactionResponse { CheckTransactionResponse::Unknown(CheckTransactionStatus::Error(err)) @@ -84,6 +112,52 @@ impl From for CheckTransactionResponse { } } +impl From> for CheckTransactionResponse +where + E: Into, +{ + fn from(result: Result<(), E>) -> Self { + match result { + Ok(()) => Self::Passed, + Err(err) => err.into(), + } + } +} + +#[derive(CandidType, Debug, Clone, Deserialize, Serialize)] +pub enum CheckTransactionIrrecoverableError { + /// Response size is too large (> `RETRY_MAX_RESPONSE_BYTES`) when fetching the transaction data of a txid. + ResponseTooLarge { txid: Vec }, + /// Invalid transaction id because it fails to decode. + InvalidTransactionId(String), + /// Invalid transaction. + InvalidTransaction(String), +} + +#[derive(CandidType, Debug, Clone, Deserialize, Serialize)] +pub enum CheckTransactionQueryResponse { + /// When check finishes and all input addresses passed. + Passed, + /// When check finishes and one or more input addresses failed. + /// The list of failed addresses are returned as a best effort, which may be non-exhaustive. + Failed(Vec), + /// The result is not available, but may be obtainable via a call to the non-query version + /// of `check_transaction`. + Unknown, +} + +impl From> for CheckTransactionQueryResponse +where + E: Into, +{ + fn from(result: Result<(), E>) -> Self { + match result { + Ok(()) => Self::Passed, + Err(err) => err.into(), + } + } +} + #[derive(CandidType, Clone, Debug, Deserialize, Serialize)] pub struct InitArg { pub btc_network: BtcNetwork, diff --git a/rs/bitcoin/checker/tests/tests.rs b/rs/bitcoin/checker/tests/tests.rs index 426816e3e82..9f431f4a93d 100644 --- a/rs/bitcoin/checker/tests/tests.rs +++ b/rs/bitcoin/checker/tests/tests.rs @@ -2,9 +2,10 @@ use candid::{decode_one, Encode, Principal}; use ic_base_types::PrincipalId; use ic_btc_checker::{ blocklist, get_tx_cycle_cost, BtcNetwork, CheckAddressArgs, CheckAddressResponse, CheckArg, - CheckMode, CheckTransactionArgs, CheckTransactionIrrecoverableError, CheckTransactionResponse, - CheckTransactionRetriable, CheckTransactionStatus, CheckTransactionStrArgs, InitArg, - UpgradeArg, CHECK_TRANSACTION_CYCLES_REQUIRED, CHECK_TRANSACTION_CYCLES_SERVICE_FEE, + CheckMode, CheckTransactionArgs, CheckTransactionIrrecoverableError, CheckTransactionQueryArgs, + CheckTransactionQueryResponse, CheckTransactionResponse, CheckTransactionRetriable, + CheckTransactionStatus, CheckTransactionStrArgs, InitArg, UpgradeArg, + CHECK_TRANSACTION_CYCLES_REQUIRED, CHECK_TRANSACTION_CYCLES_SERVICE_FEE, INITIAL_MAX_RESPONSE_BYTES, }; use ic_btc_interface::Txid; @@ -20,7 +21,7 @@ use pocket_ic::{ CanisterHttpHeader, CanisterHttpReject, CanisterHttpReply, CanisterHttpRequest, CanisterHttpResponse, MockCanisterHttpResponse, RawMessageId, }, - query_candid, PocketIc, PocketIcBuilder, RejectResponse, + query_candid, PocketIc, PocketIcBuilder, RejectCode, RejectResponse, }; use std::str::FromStr; @@ -116,6 +117,14 @@ impl Setup { self.env .submit_call(self.caller, self.controller, "update", payload) } + + fn query_btc_checker(&self, method: &str, args: I) -> Result + where + I: candid::CandidType, + O: for<'a> candid::utils::ArgumentDecoder<'a>, + { + query_candid(&self.env, self.btc_checker_canister, method, (args,)) + } } #[test] @@ -172,7 +181,7 @@ fn test_check_address() { result ); - // Test with an malformed address + // Test with a malformed address let result = query_candid::<_, (CheckAddressResponse,)>( &env, btc_checker_canister, @@ -181,9 +190,10 @@ fn test_check_address() { address: "not an address".to_string(), },), ); + assert!(result.is_err_and(|err| format!("{:?}", err).contains("Invalid Bitcoin address"))); - // Test with an testnet address + // Test with a testnet address let result = query_candid::<_, (CheckAddressResponse,)>( &env, btc_checker_canister, @@ -288,73 +298,8 @@ fn test_check_transaction_passed() { let call_id = setup .submit_btc_checker_call(method, arg, CHECK_TRANSACTION_CYCLES_REQUIRED) .expect("submit_call failed to return call id"); - // The response body used for testing below is generated from the output of - // - // curl -H 'User-Agent: bitcoin-value-collector' https://btcscan.org/api/tx/{txid}/raw - // - // There wll be two outcalls because the canister will first fetch the above - // given txid, and then fetch the vout[0] from the returned transaction body. - - let canister_http_requests = tick_until_next_request(env); - let body = b"\ -\x02\x00\x00\x00\x01\x17\x34\x3a\xab\xa9\x67\x67\x2f\x17\xef\x0a\xbf\x4b\xb1\x14\xad\x19\x63\xe0\ -\x7d\xd2\xf2\x05\xaa\x25\xa4\xda\x50\x3e\xdb\x01\xab\x01\x00\x00\x00\x6a\x47\x30\x44\x02\x20\x21\ -\x81\xb5\x9c\xa7\xed\x7e\x2c\x8e\x06\x96\x52\xb0\x7e\xd2\x10\x24\x9e\x83\x37\xec\xc5\x35\xca\x6b\ -\x75\x3c\x02\x44\x89\xe4\x5d\x02\x20\x2a\xc7\x55\xcb\x55\x97\xf1\xcc\x2c\xad\x32\xb8\xa4\x33\xf1\ -\x79\x6b\x5f\x51\x76\x71\x6d\xa9\x22\x2c\x65\xf9\x44\xaf\xd1\x3d\xa8\x01\x21\x02\xc4\xc6\x9e\x4d\ -\x36\x4b\x3e\xdf\x84\xb5\x20\xa0\x18\xd5\x7e\x71\xfa\xce\x19\x7e\xc8\xf9\x46\x43\x60\x7e\x4a\xca\ -\x70\xdc\x82\xc1\xfd\xff\xff\xff\x02\x10\x27\x00\x00\x00\x00\x00\x00\x19\x76\xa9\x14\x11\xb3\x66\ -\xed\xfc\x0a\x8b\x66\xfe\xeb\xae\x5c\x2e\x25\xa7\xb6\xa5\xd1\xcf\x31\x88\xac\x7c\x2e\x00\x00\x00\ -\x00\x00\x00\x19\x76\xa9\x14\xb9\x73\x68\xd8\xbf\x0a\x37\x69\x00\x85\x16\x57\xf3\x7f\xbe\x73\xa6\ -\x56\x61\x33\x88\xac\x14\xa4\x0c\x00" - .to_vec(); - env.mock_canister_http_response(MockCanisterHttpResponse { - subnet_id: canister_http_requests[0].subnet_id, - request_id: canister_http_requests[0].request_id, - response: CanisterHttpResponse::CanisterHttpReply(CanisterHttpReply { - status: 200, - headers: vec![], - body, - }), - additional_responses: vec![], - }); - let canister_http_requests = tick_until_next_request(env); - let body = b"\ -\x02\x00\x00\x00\x01\x82\xc8\x5d\xe7\x4d\x19\xbb\x36\x16\x2f\xca\xef\xc7\xe7\x70\x15\x65\xb0\x2d\ -\xf6\x06\x0f\x8e\xcf\x49\x64\x63\x37\xfc\xe8\x59\x37\x07\x00\x00\x00\x6a\x47\x30\x44\x02\x20\x15\ -\xf2\xc7\x7a\x3b\x95\x13\x73\x7a\xa2\x86\xb3\xe6\x06\xf9\xb6\x82\x1c\x6d\x5d\x35\xe5\xa9\x58\xe0\ -\x1f\x65\x76\xec\xdf\xac\x76\x02\x20\x4e\xad\x06\x1d\xe8\x3c\x5b\x07\x25\x8e\xfd\x2f\x44\x3d\xeb\ -\xc8\x47\x25\x2b\xfc\xf4\x24\xb3\x75\x8f\xd1\x57\x92\xef\xf4\xa4\xaa\x01\x21\x02\xc4\xc6\x9e\x4d\ -\x36\x4b\x3e\xdf\x84\xb5\x20\xa0\x18\xd5\x7e\x71\xfa\xce\x19\x7e\xc8\xf9\x46\x43\x60\x7e\x4a\xca\ -\x70\xdc\x82\xc1\xfd\xff\xff\xff\x02\x10\x27\x00\x00\x00\x00\x00\x00\x19\x76\xa9\x14\x62\xe9\x07\ -\xb1\x5c\xbf\x27\xd5\x42\x53\x99\xeb\xf6\xf0\xfb\x50\xeb\xb8\x8f\x18\x88\xac\x00\x96\x00\x00\x00\ -\x00\x00\x00\x19\x76\xa9\x14\xb9\x73\x68\xd8\xbf\x0a\x37\x69\x00\x85\x16\x57\xf3\x7f\xbe\x73\xa6\ -\x56\x61\x33\x88\xac\xb3\xa3\x0c\x00" - .to_vec(); - env.mock_canister_http_response(MockCanisterHttpResponse { - subnet_id: canister_http_requests[0].subnet_id, - request_id: canister_http_requests[0].request_id, - response: CanisterHttpResponse::CanisterHttpReply(CanisterHttpReply { - status: 200, - headers: vec![], - body: body.clone(), - }), - // Fill additional responses with different headers to test if the transform - // function does its job by clearing the headers. - additional_responses: (1..13) - .map(|i| { - CanisterHttpResponse::CanisterHttpReply(CanisterHttpReply { - status: 200, - headers: vec![CanisterHttpHeader { - name: format!("name-{}", i), - value: format!("{}", i), - }], - body: body.clone(), - }) - }) - .collect(), - }); + mock_fetch_txids_responses(env); let result = env .await_call(call_id) @@ -377,7 +322,7 @@ fn test_check_transaction_passed() { }; // With default installation - test_normal_operation("check_transaction", check_transaction_args.clone()); + test_normal_operation("check_transaction", check_transaction_args); // Test CheckMode::RejectAll env.tick(); @@ -481,6 +426,77 @@ fn test_check_transaction_passed() { test_normal_operation("check_transaction_str", check_transaction_str_args); } +/// Mock the response for the HTTP outcalls fetching the transaction inputs for txid +/// `c80763842edc9a697a2114517cf0c138c5403a761ef63cfad1fa6993fa3475ed`. There will be +/// two outcalls because the canister will first fetch the input txid, and then fetch +/// the `vout[0]` from the returned transaction body. The response bodies are generated +/// from the output of: +/// ```shell +/// curl -H 'User-Agent: bitcoin-value-collector' https://btcscan.org/api/tx/{txid}/raw +/// ``` +fn mock_fetch_txids_responses(env: &PocketIc) { + let canister_http_requests = tick_until_next_request(env); + let body = b"\ +\x02\x00\x00\x00\x01\x17\x34\x3a\xab\xa9\x67\x67\x2f\x17\xef\x0a\xbf\x4b\xb1\x14\xad\x19\x63\xe0\ +\x7d\xd2\xf2\x05\xaa\x25\xa4\xda\x50\x3e\xdb\x01\xab\x01\x00\x00\x00\x6a\x47\x30\x44\x02\x20\x21\ +\x81\xb5\x9c\xa7\xed\x7e\x2c\x8e\x06\x96\x52\xb0\x7e\xd2\x10\x24\x9e\x83\x37\xec\xc5\x35\xca\x6b\ +\x75\x3c\x02\x44\x89\xe4\x5d\x02\x20\x2a\xc7\x55\xcb\x55\x97\xf1\xcc\x2c\xad\x32\xb8\xa4\x33\xf1\ +\x79\x6b\x5f\x51\x76\x71\x6d\xa9\x22\x2c\x65\xf9\x44\xaf\xd1\x3d\xa8\x01\x21\x02\xc4\xc6\x9e\x4d\ +\x36\x4b\x3e\xdf\x84\xb5\x20\xa0\x18\xd5\x7e\x71\xfa\xce\x19\x7e\xc8\xf9\x46\x43\x60\x7e\x4a\xca\ +\x70\xdc\x82\xc1\xfd\xff\xff\xff\x02\x10\x27\x00\x00\x00\x00\x00\x00\x19\x76\xa9\x14\x11\xb3\x66\ +\xed\xfc\x0a\x8b\x66\xfe\xeb\xae\x5c\x2e\x25\xa7\xb6\xa5\xd1\xcf\x31\x88\xac\x7c\x2e\x00\x00\x00\ +\x00\x00\x00\x19\x76\xa9\x14\xb9\x73\x68\xd8\xbf\x0a\x37\x69\x00\x85\x16\x57\xf3\x7f\xbe\x73\xa6\ +\x56\x61\x33\x88\xac\x14\xa4\x0c\x00" + .to_vec(); + env.mock_canister_http_response(MockCanisterHttpResponse { + subnet_id: canister_http_requests[0].subnet_id, + request_id: canister_http_requests[0].request_id, + response: CanisterHttpResponse::CanisterHttpReply(CanisterHttpReply { + status: 200, + headers: vec![], + body, + }), + additional_responses: vec![], + }); + + let canister_http_requests = tick_until_next_request(env); + let body = b"\ +\x02\x00\x00\x00\x01\x82\xc8\x5d\xe7\x4d\x19\xbb\x36\x16\x2f\xca\xef\xc7\xe7\x70\x15\x65\xb0\x2d\ +\xf6\x06\x0f\x8e\xcf\x49\x64\x63\x37\xfc\xe8\x59\x37\x07\x00\x00\x00\x6a\x47\x30\x44\x02\x20\x15\ +\xf2\xc7\x7a\x3b\x95\x13\x73\x7a\xa2\x86\xb3\xe6\x06\xf9\xb6\x82\x1c\x6d\x5d\x35\xe5\xa9\x58\xe0\ +\x1f\x65\x76\xec\xdf\xac\x76\x02\x20\x4e\xad\x06\x1d\xe8\x3c\x5b\x07\x25\x8e\xfd\x2f\x44\x3d\xeb\ +\xc8\x47\x25\x2b\xfc\xf4\x24\xb3\x75\x8f\xd1\x57\x92\xef\xf4\xa4\xaa\x01\x21\x02\xc4\xc6\x9e\x4d\ +\x36\x4b\x3e\xdf\x84\xb5\x20\xa0\x18\xd5\x7e\x71\xfa\xce\x19\x7e\xc8\xf9\x46\x43\x60\x7e\x4a\xca\ +\x70\xdc\x82\xc1\xfd\xff\xff\xff\x02\x10\x27\x00\x00\x00\x00\x00\x00\x19\x76\xa9\x14\x62\xe9\x07\ +\xb1\x5c\xbf\x27\xd5\x42\x53\x99\xeb\xf6\xf0\xfb\x50\xeb\xb8\x8f\x18\x88\xac\x00\x96\x00\x00\x00\ +\x00\x00\x00\x19\x76\xa9\x14\xb9\x73\x68\xd8\xbf\x0a\x37\x69\x00\x85\x16\x57\xf3\x7f\xbe\x73\xa6\ +\x56\x61\x33\x88\xac\xb3\xa3\x0c\x00" + .to_vec(); + env.mock_canister_http_response(MockCanisterHttpResponse { + subnet_id: canister_http_requests[0].subnet_id, + request_id: canister_http_requests[0].request_id, + response: CanisterHttpResponse::CanisterHttpReply(CanisterHttpReply { + status: 200, + headers: vec![], + body: body.clone(), + }), + // Fill additional responses with different headers to test if the transform + // function does its job by clearing the headers. + additional_responses: (1..13) + .map(|i| { + CanisterHttpResponse::CanisterHttpReply(CanisterHttpReply { + status: 200, + headers: vec![CanisterHttpHeader { + name: format!("name-{}", i), + value: format!("{}", i), + }], + body: body.clone(), + }) + }) + .collect(), + }); +} + #[test] fn test_check_transaction_error() { let setup = Setup::new(BtcNetwork::Mainnet); @@ -765,6 +781,109 @@ fn test_check_transaction_error() { r#"btc_checker_http_calls_total\{provider=\"[a-z.]*\",status=\"IcError\(2\)\"\} 1 \d+"#, ); } +#[test] +fn test_check_transaction_query_unknown() { + let setup = Setup::new(BtcNetwork::Mainnet); + let txid = + Txid::from_str("c80763842edc9a697a2114517cf0c138c5403a761ef63cfad1fa6993fa3475ed").unwrap(); + + let (result,): (CheckTransactionQueryResponse,) = setup + .query_btc_checker( + "check_transaction_query", + CheckTransactionQueryArgs::TxIdBin(txid.as_ref().to_vec()), + ) + .expect("the fetch request didn't finish"); + assert!(matches!(result, CheckTransactionQueryResponse::Unknown)); +} + +#[test] +fn test_check_transaction_query_error() { + let setup = Setup::new(BtcNetwork::Mainnet); + let txid = + Txid::from_str("a80763842edc9a697a2114517cf0c138c5403a761ef63cfad1fa6993fa3475ed").unwrap(); + + // Tests for malformed txids + let too_short_txid_str = "a80763842edc9a697a2114517cf0c138c5403a761ef63cfad1fa6993".to_string(); + let too_short_txid_bin = txid.as_ref()[..=28].to_vec(); + for arg in &[ + CheckTransactionQueryArgs::TxIdBin(too_short_txid_bin), + CheckTransactionQueryArgs::TxIdStr(too_short_txid_str), + ] { + let result: Result<(CheckTransactionQueryResponse,), RejectResponse> = + setup.query_btc_checker("check_transaction_query", arg); + assert!(matches!( + result, + Err(RejectResponse { + reject_code: RejectCode::CanisterError, + .. + }) + )); + } +} + +#[test] +fn test_check_transaction_query_already_fetched() { + let setup = Setup::new(BtcNetwork::Mainnet); + let txid = + Txid::from_str("c80763842edc9a697a2114517cf0c138c5403a761ef63cfad1fa6993fa3475ed").unwrap(); + + // Pre-fetch the txid inputs and outputs with the update method + let check_transaction_args = CheckTransactionArgs { + txid: txid.as_ref().to_vec(), + }; + let call_id = setup + .submit_btc_checker_call( + "check_transaction", + Encode!(&check_transaction_args).unwrap(), + CHECK_TRANSACTION_CYCLES_REQUIRED, + ) + .expect("submit_call failed to return call id"); + mock_fetch_txids_responses(&setup.env); + let result = setup + .env + .await_call(call_id) + .expect("the fetch request didn't finish"); + assert!(matches!( + decode_one(&result).unwrap(), + CheckTransactionResponse::Passed + )); + + for arg in &[ + CheckTransactionQueryArgs::TxIdBin(txid.as_ref().to_vec()), + CheckTransactionQueryArgs::TxIdStr(txid.to_string()), + ] { + let (result,): (CheckTransactionQueryResponse,) = setup + .query_btc_checker("check_transaction_query", arg) + .expect("the fetch request didn't finish"); + assert!(matches!(result, CheckTransactionQueryResponse::Passed)); + } + + // Test for blocked addresses + setup.env.tick(); + setup + .env + .upgrade_canister( + setup.btc_checker_canister, + btc_checker_wasm(), + Encode!(&CheckArg::UpgradeArg(Some(UpgradeArg { + check_mode: Some(CheckMode::RejectAll), + ..UpgradeArg::default() + }))) + .unwrap(), + Some(setup.controller), + ) + .unwrap(); + + for arg in &[ + CheckTransactionQueryArgs::TxIdBin(txid.as_ref().to_vec()), + CheckTransactionQueryArgs::TxIdStr(txid.to_string()), + ] { + let (result,): (CheckTransactionQueryResponse,) = setup + .query_btc_checker("check_transaction_query", arg) + .expect("the fetch request didn't finish"); + assert!(matches!(result, CheckTransactionQueryResponse::Failed(_))); + } +} fn tick_until_next_request(env: &PocketIc) -> Vec { for _ in 0..MAX_TICKS { diff --git a/rs/bitcoin/ckbtc/kyt/Cargo.toml b/rs/bitcoin/ckbtc/kyt/Cargo.toml index d2194a93be4..fb2af06db38 100644 --- a/rs/bitcoin/ckbtc/kyt/Cargo.toml +++ b/rs/bitcoin/ckbtc/kyt/Cargo.toml @@ -24,7 +24,7 @@ time = { workspace = true } [dev-dependencies] assert_matches = { workspace = true } candid_parser = { workspace = true } -ic-management-canister-types = { path = "../../../types/management_canister_types" } +ic-management-canister-types-private = { path = "../../../types/management_canister_types" } ic-state-machine-tests = { path = "../../../state_machine_tests" } ic-test-utilities-load-wasm = { path = "../../../test_utilities/load_wasm" } ic-types = { path = "../../../types/types" } diff --git a/rs/bitcoin/ckbtc/kyt/tests/tests.rs b/rs/bitcoin/ckbtc/kyt/tests/tests.rs index bfcef5f6bdd..b2bf62aad3f 100644 --- a/rs/bitcoin/ckbtc/kyt/tests/tests.rs +++ b/rs/bitcoin/ckbtc/kyt/tests/tests.rs @@ -4,7 +4,7 @@ use ic_ckbtc_kyt::{ Alert, AlertLevel, DepositRequest, Error as KytError, ExposureType, FetchAlertsResponse, InitArg, KytMode, LifecycleArg, SetApiKeyArg, }; -use ic_management_canister_types::CanisterHttpResponsePayload; +use ic_management_canister_types_private::CanisterHttpResponsePayload; use ic_state_machine_tests::{StateMachine, WasmResult}; use ic_test_utilities_load_wasm::load_wasm; use ic_types::canister_http::CanisterHttpRequestContext; diff --git a/rs/bitcoin/ckbtc/mainnet/minter_upgrade_2025_02_06.md b/rs/bitcoin/ckbtc/mainnet/minter_upgrade_2025_02_06.md new file mode 100644 index 00000000000..7fd3629cb9e --- /dev/null +++ b/rs/bitcoin/ckbtc/mainnet/minter_upgrade_2025_02_06.md @@ -0,0 +1,54 @@ +# Proposal to upgrade the ckBTC minter canister + +Repository: `https://github.com/dfinity/ic.git` + +Git hash: `552cd582607508df70533f21e3c0bfce19f8e46b` + +New compressed Wasm hash: `8da4947f698ef5f034e41b1879bc8f51dc9dc9442a8dabe36df000d5d094e0ef` + +Upgrade args hash: `445734292959382834da46c68370d87f8117d50271f6b8a97d5eb8dadac8cb94` + +Target canister: `mqygn-kiaaa-aaaar-qaadq-cai` + +Previous ckBTC minter proposal: https://dashboard.internetcomputer.org/proposal/134970 + +--- + +## Motivation + +Update the ckBTC minter to include the latest code changes, notably: + +* Remove empty ReceivedUtxos events from event log +* Upgrade bitcoin crate +* Place `update_balance` and `retrieve_btc` guards on user ledger accounts to improve concurrency + +## Upgrade args + +``` +git fetch +git checkout 552cd582607508df70533f21e3c0bfce19f8e46b +cd rs/bitcoin/ckbtc/minter +didc encode -d ckbtc_minter.did -t '(MinterArg)' '(variant { Upgrade = null })' | xxd -r -p | sha256sum +``` + +## Release Notes + +``` +git log --format='%C(auto) %h %s' 744f4683df2ca79f5f537b3db48a1c03d4ff084e..552cd582607508df70533f21e3c0bfce19f8e46b -- rs/bitcoin/ckbtc/minter +552cd58260 feat(ckbtc): Place update_balance and retrieve_btc guards on user accounts (#3811) +97bcf0945c chore(crypto): CRP-2693 Move ic-crypto-secp256k1 to packages (#3784) +0c343040da chore(ckbtc): Separate event types for mainnet and testnet logs (#3720) +967fe21189 chore: bitcoin crate upgrade (#3080) +f52dbf1b84 chore(ckbtc): Remove empty ReceivedUtxos events from event log (#3434) + ``` + +## Wasm Verification + +Verify that the hash of the gzipped WASM matches the proposed hash. + +``` +git fetch +git checkout 552cd582607508df70533f21e3c0bfce19f8e46b +"./ci/container/build-ic.sh" "--canisters" +sha256sum ./artifacts/canisters/ic-ckbtc-minter.wasm.gz +``` diff --git a/rs/bitcoin/ckbtc/minter/BUILD.bazel b/rs/bitcoin/ckbtc/minter/BUILD.bazel index 8e942337897..b2d364f1585 100644 --- a/rs/bitcoin/ckbtc/minter/BUILD.bazel +++ b/rs/bitcoin/ckbtc/minter/BUILD.bazel @@ -6,11 +6,11 @@ package(default_visibility = ["//visibility:public"]) LIB_DEPS = [ # Keep sorted. + "//packages/ic-dummy-getrandom-for-wasm", + "//packages/ic-secp256k1", "//packages/icrc-ledger-client-cdk:icrc_ledger_client_cdk", "//packages/icrc-ledger-types:icrc_ledger_types", "//rs/bitcoin/checker:btc_checker_lib", - "//rs/crypto/getrandom_for_wasm", - "//rs/crypto/secp256k1", "//rs/crypto/sha2", "//rs/ledger_suite/common/ledger_core", "//rs/ledger_suite/icrc1/ledger", @@ -79,8 +79,8 @@ alias( deps = [ # Keep sorted. ":ckbtc_minter_lib", + "//packages/ic-dummy-getrandom-for-wasm", "//packages/icrc-ledger-types:icrc_ledger_types", - "//rs/crypto/getrandom_for_wasm", "//rs/rust_canisters/canister_log", "//rs/rust_canisters/http_types", "@crate_index//:candid", diff --git a/rs/bitcoin/ckbtc/minter/Cargo.toml b/rs/bitcoin/ckbtc/minter/Cargo.toml index c15f8898b5f..7a4299f3254 100644 --- a/rs/bitcoin/ckbtc/minter/Cargo.toml +++ b/rs/bitcoin/ckbtc/minter/Cargo.toml @@ -24,13 +24,13 @@ ic-canister-log = { path = "../../../rust_canisters/canister_log" } ic-canisters-http-types = { path = "../../../rust_canisters/http_types" } ic-cdk = { workspace = true } ic-cdk-macros = { workspace = true } -ic-crypto-secp256k1 = { path = "../../../crypto/secp256k1" } -ic-crypto-getrandom-for-wasm = { path = "../../../crypto/getrandom_for_wasm" } ic-crypto-sha2 = { path = "../../../crypto/sha2" } +ic-dummy-getrandom-for-wasm = { path = "../../../../packages/ic-dummy-getrandom-for-wasm" } ic-icrc1 = { path = "../../../ledger_suite/icrc1" } ic-ledger-core = { path = "../../../ledger_suite/common/ledger_core" } -ic-management-canister-types = { path = "../../../types/management_canister_types" } +ic-management-canister-types-private = { path = "../../../types/management_canister_types" } ic-metrics-encoder = "1" +ic-secp256k1 = { path = "../../../../packages/ic-secp256k1" } ic-stable-structures = { workspace = true } ic-utils-ensure = { path = "../../../utils/ensure" } ic0 = "0.18.9" diff --git a/rs/bitcoin/ckbtc/minter/ckbtc_minter.did b/rs/bitcoin/ckbtc/minter/ckbtc_minter.did index 95dea05324a..7965f88745d 100644 --- a/rs/bitcoin/ckbtc/minter/ckbtc_minter.did +++ b/rs/bitcoin/ckbtc/minter/ckbtc_minter.did @@ -34,6 +34,7 @@ type DefiniteCanisterSettings = record { type LogVisibility = variant { controllers; public; + allowed_viewers : vec principal; }; type RetrieveBtcArgs = record { @@ -399,6 +400,10 @@ type EventType = variant { utxo : Utxo; account : Account; }; + checked_utxo_mint_unknown : record { + utxo : Utxo; + account : Account; + }; ignored_utxo : record { utxo: Utxo; }; suspended_utxo : record { utxo: Utxo; account: Account; reason: SuspendedReason }; retrieve_btc_kyt_failed : record { diff --git a/rs/bitcoin/ckbtc/minter/src/address.rs b/rs/bitcoin/ckbtc/minter/src/address.rs index d503545900c..6f7af7b90d5 100644 --- a/rs/bitcoin/ckbtc/minter/src/address.rs +++ b/rs/bitcoin/ckbtc/minter/src/address.rs @@ -99,7 +99,7 @@ pub fn derivation_path(account: &Account) -> Vec { /// Returns a valid extended BIP-32 derivation path from an Account (Principal + subaccount) pub fn derive_public_key(ecdsa_public_key: &ECDSAPublicKey, account: &Account) -> ECDSAPublicKey { - use ic_crypto_secp256k1::{DerivationIndex, DerivationPath, PublicKey}; + use ic_secp256k1::{DerivationIndex, DerivationPath, PublicKey}; let path = DerivationPath::new( derivation_path(account) diff --git a/rs/bitcoin/ckbtc/minter/src/dashboard.rs b/rs/bitcoin/ckbtc/minter/src/dashboard.rs index f2c6d614e35..346ca78a80e 100644 --- a/rs/bitcoin/ckbtc/minter/src/dashboard.rs +++ b/rs/bitcoin/ckbtc/minter/src/dashboard.rs @@ -128,6 +128,20 @@ pub fn build_dashboard(account_to_utxos_start: u64) -> Vec { {} +

Mint status unknown utxos

+ + + + + + + + + + + {} + +
TxidVoutHeightValue (BTC)

Quarantined utxos

@@ -182,6 +196,7 @@ pub fn build_dashboard(account_to_utxos_start: u64) -> Vec { build_submitted_transactions(s), build_finalized_requests(s), build_unconfirmed_change(s), + build_mint_unknown_utxos(s), build_quarantined_utxos(s), build_ignored_utxos(s), build_account_to_utxos_table(s, account_to_utxos_start, DEFAULT_PAGE_SIZE), @@ -439,6 +454,27 @@ pub fn build_finalized_requests(s: &CkBtcMinterState) -> String { }) } +pub fn build_mint_unknown_utxos(s: &CkBtcMinterState) -> String { + with_utf8_buffer(|buf| { + for utxo in s.mint_status_unknown_utxos() { + writeln!( + buf, + " + + + + + ", + txid_link(s, &utxo.outpoint.txid), + utxo.outpoint.vout, + utxo.height, + DisplayAmount(utxo.value) + ) + .unwrap() + } + }) +} + pub fn build_quarantined_utxos(s: &CkBtcMinterState) -> String { with_utf8_buffer(|buf| { for utxo in s.quarantined_utxos() { @@ -508,16 +544,16 @@ pub fn build_unconfirmed_change(s: &CkBtcMinterState) -> String { pub fn build_update_balance_principals(s: &CkBtcMinterState) -> String { with_utf8_buffer(|buf| { - for p in &s.update_balance_principals { - writeln!(buf, "
  • {}
  • ", p).unwrap(); + for account in &s.update_balance_accounts { + writeln!(buf, "
  • {}
  • ", account).unwrap(); } }) } pub fn build_retrieve_btc_principals(s: &CkBtcMinterState) -> String { with_utf8_buffer(|buf| { - for p in &s.retrieve_btc_principals { - writeln!(buf, "
  • {}
  • ", p).unwrap(); + for account in &s.retrieve_btc_accounts { + writeln!(buf, "
  • {}
  • ", account).unwrap(); } }) } diff --git a/rs/bitcoin/ckbtc/minter/src/guard.rs b/rs/bitcoin/ckbtc/minter/src/guard.rs index 954bc2abc1e..70aee1f35f5 100644 --- a/rs/bitcoin/ckbtc/minter/src/guard.rs +++ b/rs/bitcoin/ckbtc/minter/src/guard.rs @@ -1,5 +1,5 @@ use crate::state::{mutate_state, CkBtcMinterState}; -use candid::Principal; +use icrc_ledger_types::icrc1::account::Account; use std::collections::BTreeSet; use std::marker::PhantomData; @@ -12,21 +12,21 @@ pub enum GuardError { } pub trait PendingRequests { - fn pending_requests(state: &mut CkBtcMinterState) -> &mut BTreeSet; + fn pending_requests(state: &mut CkBtcMinterState) -> &mut BTreeSet; } pub struct PendingBalanceUpdates; impl PendingRequests for PendingBalanceUpdates { - fn pending_requests(state: &mut CkBtcMinterState) -> &mut BTreeSet { - &mut state.update_balance_principals + fn pending_requests(state: &mut CkBtcMinterState) -> &mut BTreeSet { + &mut state.update_balance_accounts } } pub struct RetrieveBtcUpdates; impl PendingRequests for RetrieveBtcUpdates { - fn pending_requests(state: &mut CkBtcMinterState) -> &mut BTreeSet { - &mut state.retrieve_btc_principals + fn pending_requests(state: &mut CkBtcMinterState) -> &mut BTreeSet { + &mut state.retrieve_btc_accounts } } @@ -34,7 +34,7 @@ impl PendingRequests for RetrieveBtcUpdates { /// executed [MAX_CONCURRENT] or more times in parallel. #[must_use] pub struct Guard { - principal: Principal, + account: Account, _marker: PhantomData, } @@ -42,18 +42,18 @@ impl Guard { /// Attempts to create a new guard for the current block. Fails if there is /// already a pending request for the specified [principal] or if there /// are at least [MAX_CONCURRENT] pending requests. - pub fn new(principal: Principal) -> Result { + pub fn new(account: Account) -> Result { mutate_state(|s| { - let principals = PR::pending_requests(s); - if principals.contains(&principal) { + let accounts = PR::pending_requests(s); + if accounts.contains(&account) { return Err(GuardError::AlreadyProcessing); } - if principals.len() >= MAX_CONCURRENT { + if accounts.len() >= MAX_CONCURRENT { return Err(GuardError::TooManyConcurrentRequests); } - principals.insert(principal); + accounts.insert(account); Ok(Self { - principal, + account, _marker: PhantomData, }) }) @@ -62,7 +62,7 @@ impl Guard { impl Drop for Guard { fn drop(&mut self) { - mutate_state(|s| PR::pending_requests(s).remove(&self.principal)); + mutate_state(|s| PR::pending_requests(s).remove(&self.account)); } } @@ -89,12 +89,12 @@ impl Drop for TimerLogicGuard { } } -pub fn balance_update_guard(p: Principal) -> Result, GuardError> { - Guard::new(p) +pub fn balance_update_guard(account: Account) -> Result, GuardError> { + Guard::new(account) } -pub fn retrieve_btc_guard(p: Principal) -> Result, GuardError> { - Guard::new(p) +pub fn retrieve_btc_guard(account: Account) -> Result, GuardError> { + Guard::new(account) } #[cfg(test)] @@ -107,12 +107,19 @@ mod tests { use candid::Principal; use ic_base_types::CanisterId; - use super::{balance_update_guard, TimerLogicGuard}; + use super::{balance_update_guard, Account, TimerLogicGuard}; fn test_principal(id: u64) -> Principal { Principal::try_from_slice(&id.to_le_bytes()).unwrap() } + fn test_account(id: u64, sub: Option) -> Account { + Account { + owner: test_principal(id), + subaccount: sub.map(|i| [i; 32]), + } + } + #[allow(deprecated)] fn test_state_args() -> InitArgs { InitArgs { @@ -131,36 +138,43 @@ mod tests { } #[test] - fn guard_limits_one_principal() { + fn guard_limits_one_account() { // test that two guards for the same principal cannot exist in the same block // and that a guard is properly dropped at end of the block init(test_state_args()); - let p = test_principal(0); + // a1 and a2 are effectively the same Account + let a1 = test_account(0, None); + let a2 = test_account(0, Some(0)); { - let _guard = balance_update_guard(p).unwrap(); - let res = balance_update_guard(p).err(); + let _guard = balance_update_guard(a1).unwrap(); + let res = balance_update_guard(a2).err(); assert_eq!(res, Some(GuardError::AlreadyProcessing)); } - let _ = balance_update_guard(p).unwrap(); + let _ = balance_update_guard(a1).unwrap(); } #[test] - fn guard_prevents_more_than_max_concurrent_principals() { + fn guard_prevents_more_than_max_concurrent_accounts() { // test that at most MAX_CONCURRENT guards can be created if each one // is for a different principal init(test_state_args()); - let guards: Vec<_> = (0..MAX_CONCURRENT) + let guards: Vec<_> = (0..MAX_CONCURRENT / 2) .map(|id| { - balance_update_guard(test_principal(id as u64)).unwrap_or_else(|e| { - panic!("Could not create guard for principal num {}: {:#?}", id, e) + balance_update_guard(test_account(0, Some(id as u8))).unwrap_or_else(|e| { + panic!("Could not create guard for subaccount num {}: {:#?}", id, e) }) }) + .chain((MAX_CONCURRENT / 2..MAX_CONCURRENT).map(|id| { + balance_update_guard(test_account(id as u64, None)).unwrap_or_else(|e| { + panic!("Could not create guard for principal num {}: {:#?}", id, e) + }) + })) .collect(); assert_eq!(guards.len(), MAX_CONCURRENT); - let pid = test_principal(MAX_CONCURRENT as u64 + 1); - let res = balance_update_guard(pid).err(); + let account = test_account(MAX_CONCURRENT as u64 + 1, None); + let res = balance_update_guard(account).err(); assert_eq!(res, Some(GuardError::TooManyConcurrentRequests)); } diff --git a/rs/bitcoin/ckbtc/minter/src/lib.rs b/rs/bitcoin/ckbtc/minter/src/lib.rs index 3d156535210..ec626711ce1 100644 --- a/rs/bitcoin/ckbtc/minter/src/lib.rs +++ b/rs/bitcoin/ckbtc/minter/src/lib.rs @@ -10,7 +10,7 @@ use ic_btc_interface::{ GetUtxosRequest, GetUtxosResponse, MillisatoshiPerByte, Network, OutPoint, Satoshi, Txid, Utxo, }; use ic_canister_log::log; -use ic_management_canister_types::DerivationPath; +use ic_management_canister_types_private::DerivationPath; use icrc_ledger_types::icrc1::account::Account; use icrc_ledger_types::icrc1::transfer::Memo; use scopeguard::{guard, ScopeGuard}; diff --git a/rs/bitcoin/ckbtc/minter/src/management.rs b/rs/bitcoin/ckbtc/minter/src/management.rs index 82ffab97dbc..67646099663 100644 --- a/rs/bitcoin/ckbtc/minter/src/management.rs +++ b/rs/bitcoin/ckbtc/minter/src/management.rs @@ -15,7 +15,7 @@ use ic_cdk::api::{ call::RejectionCode, management_canister::bitcoin::{BitcoinNetwork, UtxoFilter}, }; -use ic_management_canister_types::{ +use ic_management_canister_types_private::{ DerivationPath, ECDSAPublicKeyArgs, ECDSAPublicKeyResponse, EcdsaCurve, EcdsaKeyId, }; use serde::de::DeserializeOwned; diff --git a/rs/bitcoin/ckbtc/minter/src/metrics.rs b/rs/bitcoin/ckbtc/minter/src/metrics.rs index 672683731a9..03baedce85a 100644 --- a/rs/bitcoin/ckbtc/minter/src/metrics.rs +++ b/rs/bitcoin/ckbtc/minter/src/metrics.rs @@ -225,13 +225,13 @@ pub fn encode_metrics( metrics.encode_gauge( "ckbtc_minter_concurrent_update_balance_count", - state::read_state(|s| s.update_balance_principals.len()) as f64, + state::read_state(|s| s.update_balance_accounts.len()) as f64, "Total number of concurrent update_balance requests.", )?; metrics.encode_gauge( "ckbtc_minter_concurrent_retrieve_btc_count", - state::read_state(|s| s.retrieve_btc_principals.len()) as f64, + state::read_state(|s| s.retrieve_btc_accounts.len()) as f64, "Total number of concurrent retrieve_btc requests.", )?; @@ -271,6 +271,12 @@ pub fn encode_metrics( "Total number of suspended UTXOs due to being marked as tainted.", )?; + metrics.encode_gauge( + "ckbtc_minter_mint_status_unknown_utxos_count", + state::read_state(|s| s.mint_status_unknown_utxos().count()) as f64, + "Total number of UTXOs with unknown mint status.", + )?; + let mut histogram_vec = metrics.histogram_vec( "ckbtc_minter_update_calls_latency", "The latency of ckBTC minter `update_balance` calls in milliseconds.", diff --git a/rs/bitcoin/ckbtc/minter/src/state.rs b/rs/bitcoin/ckbtc/minter/src/state.rs index 75638fc1973..feddc12aee8 100644 --- a/rs/bitcoin/ckbtc/minter/src/state.rs +++ b/rs/bitcoin/ckbtc/minter/src/state.rs @@ -249,20 +249,8 @@ pub enum UtxoCheckStatus { Clean, /// The UTXO in question is tainted. Tainted, -} - -impl UtxoCheckStatus { - pub fn from_clean_flag(clean: bool) -> Self { - if clean { - Self::Clean - } else { - Self::Tainted - } - } - - pub fn is_clean(self) -> bool { - self == Self::Clean - } + /// The UTXO is clean but minting failed. + CleanButMintUnknown, } /// Relevant data for a checked UTXO. The UUID and `kyt_provider` are kept for @@ -301,11 +289,11 @@ pub struct CkBtcMinterState { /// before being sent. pub max_time_in_queue_nanos: u64, - /// Per-principal lock for update_balance - pub update_balance_principals: BTreeSet, + /// Per-account lock for update_balance + pub update_balance_accounts: BTreeSet, - /// Per-principal lock for retrieve_btc - pub retrieve_btc_principals: BTreeSet, + /// Per-account lock for retrieve_btc + pub retrieve_btc_accounts: BTreeSet, /// Minimum amount of bitcoin that can be retrieved pub retrieve_btc_min_amount: u64, @@ -367,14 +355,13 @@ pub struct CkBtcMinterState { pub utxos_state_addresses: BTreeMap>, /// This map contains the UTXOs we removed due to a transaction finalization - /// while there was a concurrent update_balance call for the principal whose - /// UTXOs participated in the transaction. The UTXOs can belong to any - /// subaccount of the principal. + /// while there was a concurrent update_balance call for the account whose + /// UTXOs participated in the transaction. /// /// We insert a new entry into this map if we discover a concurrent /// update_balance calls during a transaction finalization and remove the /// entry once the update_balance call completes. - pub finalized_utxos: BTreeMap>, + pub finalized_utxos: BTreeMap>, /// Process one timer event at a time. pub is_timer_running: bool, @@ -696,9 +683,9 @@ impl CkBtcMinterState { fn forget_utxo(&mut self, utxo: &Utxo) { if let Some(account) = self.outpoint_account.remove(&utxo.outpoint) { - if self.update_balance_principals.contains(&account.owner) { + if self.update_balance_accounts.contains(&account) { self.finalized_utxos - .entry(account.owner) + .entry(account) .or_default() .insert(utxo.clone()); } @@ -932,7 +919,7 @@ impl CkBtcMinterState { /// Return UTXOs of the given account that are known to the minter. pub fn known_utxos_for_account(&self, account: &Account) -> Vec { let maybe_existing_utxos = self.utxos_state_addresses.get(account); - let maybe_finalized_utxos = self.finalized_utxos.get(&account.owner); + let maybe_finalized_utxos = self.finalized_utxos.get(account); match (maybe_existing_utxos, maybe_finalized_utxos) { (Some(existing_utxos), Some(finalized_utxos)) => existing_utxos .union(finalized_utxos) @@ -965,7 +952,7 @@ impl CkBtcMinterState { .unwrap_or(false) || self .finalized_utxos - .get(&account.owner) + .get(account) .map(|utxos| utxos.contains(utxo)) .unwrap_or(false) }; @@ -1063,6 +1050,24 @@ impl CkBtcMinterState { } } + /// Marks the given UTXO as successfully checked but minting failed. + fn mark_utxo_checked_mint_unknown(&mut self, utxo: Utxo, account: &Account) { + // It should have already been removed from suspended_utxos + debug_assert_eq!( + self.suspended_utxos.contains_utxo(&utxo, account), + (None, None), + "BUG: UTXO was still suspended and cannot be marked as mint unknown" + ); + self.checked_utxos.insert( + utxo, + CheckedUtxo { + uuid: None, + status: UtxoCheckStatus::CleanButMintUnknown, + kyt_provider: None, + }, + ); + } + /// Marks the given UTXO as successfully checked. fn mark_utxo_checked_v2(&mut self, utxo: Utxo, account: &Account) { self.suspended_utxos.remove(account, &utxo); @@ -1278,6 +1283,16 @@ impl CkBtcMinterState { SuspendedReason::Quarantined => Some(u), }) } + + pub fn mint_status_unknown_utxos(&self) -> impl Iterator { + self.checked_utxos.iter().filter_map(|(utxo, checked)| { + if checked.status == UtxoCheckStatus::CleanButMintUnknown { + Some(utxo) + } else { + None + } + }) + } } #[derive(Eq, PartialEq, Debug, Default)] @@ -1452,8 +1467,8 @@ impl From for CkBtcMinterState { .min_confirmations .unwrap_or(crate::lifecycle::init::DEFAULT_MIN_CONFIRMATIONS), max_time_in_queue_nanos: args.max_time_in_queue_nanos, - update_balance_principals: Default::default(), - retrieve_btc_principals: Default::default(), + update_balance_accounts: Default::default(), + retrieve_btc_accounts: Default::default(), retrieve_btc_min_amount: args.retrieve_btc_min_amount, fee_based_retrieve_btc_min_amount: args.retrieve_btc_min_amount, pending_retrieve_btc_requests: Default::default(), diff --git a/rs/bitcoin/ckbtc/minter/src/state/audit.rs b/rs/bitcoin/ckbtc/minter/src/state/audit.rs index 993f128bf68..48986842949 100644 --- a/rs/bitcoin/ckbtc/minter/src/state/audit.rs +++ b/rs/bitcoin/ckbtc/minter/src/state/audit.rs @@ -115,6 +115,22 @@ pub fn mark_utxo_checked( state.mark_utxo_checked_v2(utxo, &account); } +pub fn mark_utxo_checked_mint_unknown( + state: &mut CkBtcMinterState, + utxo: Utxo, + account: Account, + runtime: &R, +) { + record_event( + EventType::CheckedUtxoMintUnknown { + utxo: utxo.clone(), + account, + }, + runtime, + ); + state.mark_utxo_checked_mint_unknown(utxo, &account); +} + pub fn quarantine_utxo( state: &mut CkBtcMinterState, utxo: Utxo, diff --git a/rs/bitcoin/ckbtc/minter/src/state/eventlog.rs b/rs/bitcoin/ckbtc/minter/src/state/eventlog.rs index 3c834e7dee3..25d00394c08 100644 --- a/rs/bitcoin/ckbtc/minter/src/state/eventlog.rs +++ b/rs/bitcoin/ckbtc/minter/src/state/eventlog.rs @@ -3,7 +3,7 @@ use crate::lifecycle::upgrade::UpgradeArgs; use crate::state::invariants::CheckInvariants; use crate::state::{ ChangeOutput, CkBtcMinterState, FinalizedBtcRetrieval, FinalizedStatus, Overdraft, - RetrieveBtcRequest, SubmittedBtcTransaction, SuspendedReason, UtxoCheckStatus, + RetrieveBtcRequest, SubmittedBtcTransaction, SuspendedReason, }; use crate::state::{ReimburseDepositTask, ReimbursedDeposit, ReimbursementReason}; use candid::Principal; @@ -202,6 +202,10 @@ mod event { /// The mint block on the ledger. mint_block_index: u64, }, + + /// Indicates an UTXO is checked to be clean and pre-mint + #[serde(rename = "checked_utxo_mint_unknown")] + CheckedUtxoMintUnknown { account: Account, utxo: Utxo }, } } @@ -366,18 +370,17 @@ pub fn replay( uuid, clean, kyt_provider, - } => match UtxoCheckStatus::from_clean_flag(clean) { - UtxoCheckStatus::Clean => { + } => { + if clean { state.mark_utxo_checked( utxo, if uuid.is_empty() { None } else { Some(uuid) }, kyt_provider, ); - } - UtxoCheckStatus::Tainted => { + } else { state.discard_utxo_without_account(utxo, SuspendedReason::Quarantined); } - }, + } EventType::CheckedUtxoV2 { utxo, account } => { state.mark_utxo_checked_v2(utxo, &account); } @@ -442,6 +445,9 @@ pub fn replay( }, ); } + EventType::CheckedUtxoMintUnknown { utxo, account } => { + state.mark_utxo_checked_mint_unknown(utxo, &account); + } } } diff --git a/rs/bitcoin/ckbtc/minter/src/updates/get_btc_address.rs b/rs/bitcoin/ckbtc/minter/src/updates/get_btc_address.rs index de9195720eb..080d3af5733 100644 --- a/rs/bitcoin/ckbtc/minter/src/updates/get_btc_address.rs +++ b/rs/bitcoin/ckbtc/minter/src/updates/get_btc_address.rs @@ -5,7 +5,7 @@ use crate::{ }; use candid::{CandidType, Deserialize, Principal}; use ic_canister_log::log; -use ic_management_canister_types::DerivationPath; +use ic_management_canister_types_private::DerivationPath; use icrc_ledger_types::icrc1::account::{Account, Subaccount}; use serde::Serialize; diff --git a/rs/bitcoin/ckbtc/minter/src/updates/retrieve_btc.rs b/rs/bitcoin/ckbtc/minter/src/updates/retrieve_btc.rs index 5db9ab841fc..b968d42dd4f 100644 --- a/rs/bitcoin/ckbtc/minter/src/updates/retrieve_btc.rs +++ b/rs/bitcoin/ckbtc/minter/src/updates/retrieve_btc.rs @@ -165,7 +165,10 @@ pub async fn retrieve_btc(args: RetrieveBtcArgs) -> Result = storage::events().map(|event| event.payload).collect(); + + mock_get_utxos_for_account( + &mut runtime, + account, + vec![checked_but_mint_unknown_utxo.clone(), utxo.clone()], + ); + expect_check_transaction_returning( + &mut runtime, + utxo.clone(), + CheckTransactionResponse::Passed, + ); + runtime + .expect_mint_ckbtc() + .times(1) + .withf(move |amount, account_, _memo| amount == &minted_amount && account_ == &account) + .return_const(Ok(1)); + mock_schedule_now_process_logic(&mut runtime); + let result = update_balance( + UpdateBalanceArgs { + owner: Some(account.owner), + subaccount: account.subaccount, + }, + &runtime, + ) + .await; + + assert_eq!(suspended_utxo(&checked_but_mint_unknown_utxo), None); + assert_eq!(suspended_utxo(&utxo), None); + // Only the 2nd utxo is minted + assert_eq!( + result, + Ok(vec![UtxoStatus::Minted { + block_index: 1, + minted_amount, + utxo: utxo.clone() + }]) + ); + assert_has_new_events( + &events_before, + &[ + checked_utxo_event(utxo.clone(), account), + EventType::ReceivedUtxos { + mint_txid: Some(1), + to_account: account, + utxos: vec![utxo], + }, + ], + ); + } + #[tokio::test] async fn should_observe_latency_metrics() { init_state_with_ecdsa_public_key(); diff --git a/rs/bitcoin/ckbtc/minter/src/updates/update_balance.rs b/rs/bitcoin/ckbtc/minter/src/updates/update_balance.rs index 8cddb3a16ad..12c18ba6d5e 100644 --- a/rs/bitcoin/ckbtc/minter/src/updates/update_balance.rs +++ b/rs/bitcoin/ckbtc/minter/src/updates/update_balance.rs @@ -159,12 +159,12 @@ pub async fn update_balance( .map_err(UpdateBalanceError::TemporarilyUnavailable)?; init_ecdsa_public_key().await; - let _guard = balance_update_guard(args.owner.unwrap_or(caller))?; let caller_account = Account { owner: args.owner.unwrap_or(caller), subaccount: args.subaccount, }; + let _guard = balance_update_guard(caller_account)?; let address = state::read_state(|s| { get_btc_address::account_to_p2wpkh_address_from_state(s, &caller_account) @@ -187,8 +187,8 @@ pub async fn update_balance( let (processable_utxos, suspended_utxos) = state::read_state(|s| s.processable_utxos_for_account(utxos, &caller_account, &now)); - // Remove pending finalized transactions for the affected principal. - state::mutate_state(|s| s.finalized_utxos.remove(&caller_account.owner)); + // Remove pending finalized transactions for the affected account. + state::mutate_state(|s| s.finalized_utxos.remove(&caller_account)); let satoshis_to_mint = processable_utxos.iter().map(|u| u.value).sum::(); @@ -243,7 +243,7 @@ pub async fn update_balance( } let token_name = match btc_network { - ic_management_canister_types::BitcoinNetwork::Mainnet => "ckBTC", + ic_management_canister_types_private::BitcoinNetwork::Mainnet => "ckBTC", _ => "ckTESTBTC", }; @@ -265,21 +265,23 @@ pub async fn update_balance( continue; } let status = check_utxo(&utxo, &args, runtime).await?; - mutate_state(|s| match status { + match status { + // Skip utxos that are already checked but has unknown mint status + UtxoCheckStatus::CleanButMintUnknown => continue, UtxoCheckStatus::Clean => { - state::audit::mark_utxo_checked(s, utxo.clone(), caller_account, runtime); + mutate_state(|s| { + state::audit::mark_utxo_checked(s, utxo.clone(), caller_account, runtime) + }); } UtxoCheckStatus::Tainted => { - state::audit::quarantine_utxo(s, utxo.clone(), caller_account, now, runtime); - } - }); - match status { - UtxoCheckStatus::Tainted => { + mutate_state(|s| { + state::audit::quarantine_utxo(s, utxo.clone(), caller_account, now, runtime) + }); utxo_statuses.push(UtxoStatus::Tainted(utxo.clone())); continue; } - UtxoCheckStatus::Clean => {} - } + }; + let amount = utxo.value - check_fee; let memo = MintMemo::Convert { txid: Some(utxo.outpoint.txid.as_ref()), @@ -287,6 +289,18 @@ pub async fn update_balance( kyt_fee: Some(check_fee), }; + // After the call to `mint_ckbtc` returns, in a very unlikely situation the + // execution may panic/trap without persisting state changes and then we will + // have no idea whether the mint actually succeeded or not. If this happens + // the use of the guard below will help set the utxo to `CleanButMintUnknown` + // status so that it will not be minted again. Utxos with this status will + // require manual intervention. + let guard = scopeguard::guard((utxo.clone(), caller_account), |(utxo, account)| { + mutate_state(|s| { + state::audit::mark_utxo_checked_mint_unknown(s, utxo, account, runtime) + }); + }); + match runtime .mint_ckbtc(amount, caller_account, crate::memo::encode(&memo).into()) .await @@ -323,6 +337,10 @@ pub async fn update_balance( utxo_statuses.push(UtxoStatus::Checked(utxo)); } } + // Defuse the guard. Note that In case of a panic (either before or after this point) + // the defuse will not be effective (due to state rollback), and the guard that was + // setup before the `mint_ckbtc` async call will be invoked. + scopeguard::ScopeGuard::into_inner(guard); } schedule_now(TaskType::ProcessLogic, runtime); diff --git a/rs/bitcoin/ckbtc/minter/test_resources/mainnet_events.gz b/rs/bitcoin/ckbtc/minter/test_resources/mainnet_events.gz index 074834bdb27..8c1a4ea3d4a 100644 Binary files a/rs/bitcoin/ckbtc/minter/test_resources/mainnet_events.gz and b/rs/bitcoin/ckbtc/minter/test_resources/mainnet_events.gz differ diff --git a/rs/bitcoin/ckbtc/minter/tests/replay_events.rs b/rs/bitcoin/ckbtc/minter/tests/replay_events.rs index 238e635218c..48f0688be4a 100644 --- a/rs/bitcoin/ckbtc/minter/tests/replay_events.rs +++ b/rs/bitcoin/ckbtc/minter/tests/replay_events.rs @@ -1,3 +1,10 @@ +//! To refresh the stored events on disk, call the tests as follows +//! ``` +//! bazel test --spawn_strategy=standalone //rs/bitcoin/ckbtc/minter:ckbtc_minter_replay_events_tests --test_env=RETRIEVE_MINTER_EVENTS=true --test_arg "should_replay_events_for_mainnet" --test_timeout 900 +//! ``` +//! The parameter `spawn_strategy=standalone` is needed, because the events will be fetched from the running canister and the default sandbox doesn't allow it. +//! The parameter `test_env=RETRIEVE_MINTER_EVENTS=true` is needed to enable the fetching of the events. + use candid::{CandidType, Deserialize, Principal}; use ic_agent::Agent; use ic_ckbtc_minter::state::eventlog::{replay, Event, EventType}; @@ -18,7 +25,7 @@ fn assert_useless_events_is_empty(events: impl Iterator) { assert_eq!(count, 0); } -async fn should_migrate_events_for(file: GetEventsFile) -> CkBtcMinterState { +async fn should_migrate_events_for(file: impl GetEventsFile) -> CkBtcMinterState { use ic_ckbtc_minter::storage::{decode_event, encode_event, migrate_events}; use ic_stable_structures::{ log::Log as StableLog, @@ -53,44 +60,38 @@ async fn should_migrate_events_for(file: GetEventsFile) -> CkBtcMinterState { #[tokio::test] async fn should_migrate_events_for_mainnet() { - let state = should_migrate_events_for(GetEventsFile::Mainnet).await; + let state = should_migrate_events_for(Mainnet).await; assert_eq!(state.btc_network, Network::Mainnet); - assert_eq!(state.get_total_btc_managed(), 21_723_786_340); + assert_eq!(state.get_total_btc_managed(), 20_209_150_152); } #[tokio::test] async fn should_migrate_events_for_testnet() { - let state = should_migrate_events_for(GetEventsFile::Testnet).await; + let state = should_migrate_events_for(Testnet).await; assert_eq!(state.btc_network, Network::Testnet); - assert_eq!(state.get_total_btc_managed(), 16578205978); + assert_eq!(state.get_total_btc_managed(), 16_578_205_978); } #[tokio::test] async fn should_replay_events_for_mainnet() { - GetEventsFile::Mainnet - .retrieve_and_store_events_if_env() - .await; + Mainnet.retrieve_and_store_events_if_env().await; - let state = - replay::(GetEventsFile::Mainnet.deserialize().events.into_iter()) - .expect("Failed to replay events"); + let state = replay::(Mainnet.deserialize().events.into_iter()) + .expect("Failed to replay events"); state .check_invariants() .expect("Failed to check invariants"); assert_eq!(state.btc_network, Network::Mainnet); - assert_eq!(state.get_total_btc_managed(), 21_723_786_340); + assert_eq!(state.get_total_btc_managed(), 20_209_150_152); } #[tokio::test] async fn should_replay_events_for_testnet() { - GetEventsFile::Testnet - .retrieve_and_store_events_if_env() - .await; + Testnet.retrieve_and_store_events_if_env().await; - let state = - replay::(GetEventsFile::Testnet.deserialize().events.into_iter()) - .expect("Failed to replay events"); + let state = replay::(Testnet.deserialize().events.into_iter()) + .expect("Failed to replay events"); state .check_invariants() .expect("Failed to check invariants"); @@ -106,19 +107,21 @@ async fn should_replay_events_for_testnet() { #[test] #[ignore] fn should_replay_events_and_check_invariants() { - for file in [GetEventsFile::Mainnet, GetEventsFile::Testnet] { + fn test(file: impl GetEventsFile + std::fmt::Debug) { let events = file.deserialize(); println!("Replaying {} {:?} events", events.total_event_count, file); let _state = replay::(events.events.into_iter()) .expect("Failed to replay events"); } + test(Mainnet); + test(Testnet); } // It's not clear why those events are here in the first place // but this test ensures that the number of such events doesn't grow. #[tokio::test] async fn should_not_grow_number_of_useless_events() { - for file in [GetEventsFile::Mainnet, GetEventsFile::Testnet] { + fn test(file: impl GetEventsFile) -> (u64, Vec) { let events = file.deserialize(); let received_utxo_to_minter_with_empty_utxos = EventType::ReceivedUtxos { mint_txid: None, @@ -128,21 +131,19 @@ async fn should_not_grow_number_of_useless_events() { let useless_events_indexes = assert_useless_events_eq(&events.events, &received_utxo_to_minter_with_empty_utxos); - - match file { - GetEventsFile::Mainnet => { - assert_eq!(events.total_event_count, 432_050); - assert_eq!(useless_events_indexes.len(), 409_141); - assert_eq!(useless_events_indexes.last(), Some(&411_301_usize)); - } - GetEventsFile::Testnet => { - assert_eq!(events.total_event_count, 46_815); - assert_eq!(useless_events_indexes.len(), 4_044); - assert_eq!(useless_events_indexes.last(), Some(&4_614_usize)); - } - } + (events.total_event_count, useless_events_indexes) } + let (total_event_count, useless_events_indexes) = test(Mainnet); + assert_eq!(total_event_count, 443_137); + assert_eq!(useless_events_indexes.len(), 409_141); + assert_eq!(useless_events_indexes.last(), Some(&411_301_usize)); + + let (total_event_count, useless_events_indexes) = test(Testnet); + assert_eq!(total_event_count, 46_815); + assert_eq!(useless_events_indexes.len(), 4_044); + assert_eq!(useless_events_indexes.last(), Some(&4_614_usize)); + fn assert_useless_events_eq( events: &[Event], expected_useless_event: &EventType, @@ -162,18 +163,21 @@ async fn should_not_grow_number_of_useless_events() { } #[derive(Debug)] -enum GetEventsFile { - Mainnet, - Testnet, -} +struct Mainnet; + +#[derive(Debug)] +struct Testnet; + +trait GetEventsFile { + // TODO (XC-261): + // These associated types are meant to deal with the the type difference in existing + // event logs between mainnet (with timestamps) and testnet (without timestamps) + // when we deserialize them for processing. This difference will go away once + // we re-deploy the testnet canister. These types (and the GetEventsFile trait) + // should be consolidated by then. + type EventType: CandidType + for<'a> Deserialize<'a> + Into; + type ResultType: CandidType + for<'a> Deserialize<'a> + Into; -impl GetEventsFile { - /// To refresh the stored events on disk, call the tests as follows - /// ``` - /// bazel test --spawn_strategy=standalone //rs/bitcoin/ckbtc/minter:ckbtc_minter_replay_events_tests --test_env=RETRIEVE_MINTER_EVENTS=true --test_arg "should_replay_events_for_mainnet" --test_timeout 900 - /// ``` - /// The parameter `spawn_strategy=standalone` is needed, because the events will be fetched from the running canister and the default sandbox doesn't allow it. - /// The parameter `test_env=RETRIEVE_MINTER_EVENTS=true` is needed to enable the fetching of the events. async fn retrieve_and_store_events_if_env(&self) { if std::env::var("RETRIEVE_MINTER_EVENTS").map(|s| s.parse().ok().unwrap_or_default()) == Ok(true) @@ -182,6 +186,31 @@ impl GetEventsFile { } } + async fn get_events( + &self, + agent: &Agent, + minter_id: &Principal, + start: u64, + length: u64, + ) -> Vec { + use candid::{Decode, Encode}; + use ic_ckbtc_minter::state::eventlog::GetEventsArg; + + let arg = GetEventsArg { start, length }; + + let raw_result = agent + .update(minter_id, "get_events") + .with_arg(Encode!(&arg).unwrap()) + .call_and_wait() + .await + .expect("Failed to call get_events"); + Decode!(&raw_result, Vec) + .unwrap() + .into_iter() + .map(|x| x.into()) + .collect() + } + async fn retrieve_and_store_events(&self) { use candid::Encode; use flate2::bufread::GzEncoder; @@ -199,13 +228,14 @@ impl GetEventsFile { const MAX_EVENTS_PER_QUERY: u64 = 2000; let mut events = Vec::new(); loop { - let fetched_events = get_events( - &agent, - &self.minter_canister_id(), - events.len() as u64, - MAX_EVENTS_PER_QUERY, - ) - .await; + let fetched_events = self + .get_events( + &agent, + &self.minter_canister_id(), + events.len() as u64, + MAX_EVENTS_PER_QUERY, + ) + .await; if fetched_events.is_empty() { break; } @@ -231,12 +261,7 @@ impl GetEventsFile { .expect("BUG: failed to write events"); } - fn minter_canister_id(&self) -> Principal { - match self { - GetEventsFile::Mainnet => Principal::from_text("mqygn-kiaaa-aaaar-qaadq-cai").unwrap(), - GetEventsFile::Testnet => Principal::from_text("ml52i-qqaaa-aaaar-qaaba-cai").unwrap(), - } - } + fn minter_canister_id(&self) -> Principal; fn path_to_events_file(&self) -> PathBuf { let mut path = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()); @@ -244,12 +269,7 @@ impl GetEventsFile { path } - fn file_name(&self) -> &str { - match self { - GetEventsFile::Mainnet => "mainnet_events.gz", - GetEventsFile::Testnet => "testnet_events.gz", - } - } + fn file_name(&self) -> &str; fn deserialize(&self) -> GetEventsResult { use candid::Decode; @@ -262,42 +282,37 @@ impl GetEventsFile { let mut decompressed_buffer = Vec::new(); gz.read_to_end(&mut decompressed_buffer) .expect("BUG: failed to decompress events"); - // TODO XC-261 The logic here assumes the compressed events in the file still use the - // 'old' Candid interface (i.e. a vector of `EventTypes`). Once the deployed minter - // canister on mainnet/testnet return a result with the new interface, the explicit - // conversion from `EventType` to `Event` must be removed. - Decode!(&decompressed_buffer, GetEventTypesResult) + Decode!(&decompressed_buffer, Self::ResultType) .expect("Failed to decode events") .into() } } -async fn get_events(agent: &Agent, minter_id: &Principal, start: u64, length: u64) -> Vec { - use candid::{Decode, Encode}; - use ic_ckbtc_minter::state::eventlog::GetEventsArg; - - let arg = GetEventsArg { start, length }; - - let raw_result = agent - .update(minter_id, "get_events") - .with_arg(Encode!(&arg).unwrap()) - .call_and_wait() - .await - .expect("Failed to call get_events"); - // TODO XC-261 The logic here assumes the result we get from the minter canister `get_events` - // endpoint still uses the 'old' Candid interface (i.e. a vector of `EventTypes`). Once the - // deployed minter canisters on mainnet/testnet return a result with the new interface, the - // explicit conversion from `EventType` to `Event` must be removed. - Decode!(&raw_result, Vec) - .unwrap() - .into_iter() - .map(Event::from) - .collect() +impl GetEventsFile for Mainnet { + type EventType = Event; + type ResultType = GetEventsResult; + fn minter_canister_id(&self) -> Principal { + Principal::from_text("mqygn-kiaaa-aaaar-qaadq-cai").unwrap() + } + fn file_name(&self) -> &str { + "mainnet_events.gz" + } +} + +impl GetEventsFile for Testnet { + type EventType = EventType; + type ResultType = GetEventsWithoutTimestampsResult; + fn minter_canister_id(&self) -> Principal { + Principal::from_text("ml52i-qqaaa-aaaar-qaaba-cai").unwrap() + } + fn file_name(&self) -> &str { + "testnet_events.gz" + } } // TODO XC-261: Remove #[derive(Clone, Debug, CandidType, Deserialize)] -pub struct GetEventTypesResult { +pub struct GetEventsWithoutTimestampsResult { pub events: Vec, pub total_event_count: u64, } @@ -309,8 +324,8 @@ pub struct GetEventsResult { } // TODO XC-261: Remove -impl From for GetEventsResult { - fn from(value: GetEventTypesResult) -> Self { +impl From for GetEventsResult { + fn from(value: GetEventsWithoutTimestampsResult) -> Self { Self { events: value.events.into_iter().map(Event::from).collect(), total_event_count: value.total_event_count, diff --git a/rs/bitcoin/validation/BUILD.bazel b/rs/bitcoin/validation/BUILD.bazel index 259fa9534cf..b54cfbdc888 100644 --- a/rs/bitcoin/validation/BUILD.bazel +++ b/rs/bitcoin/validation/BUILD.bazel @@ -14,6 +14,7 @@ DEV_DEPENDENCIES = [ "@crate_index//:csv", "@crate_index//:hex", "@crate_index//:proptest", + "@crate_index//:rstest", ] MACRO_DEV_DEPENDENCIES = [] diff --git a/rs/bitcoin/validation/Cargo.toml b/rs/bitcoin/validation/Cargo.toml index 752eea92d36..e0f27a008b8 100644 --- a/rs/bitcoin/validation/Cargo.toml +++ b/rs/bitcoin/validation/Cargo.toml @@ -15,3 +15,4 @@ hex = { workspace = true } [dev-dependencies] csv = "1.1" proptest = "0.9.4" +rstest = { workspace = true } diff --git a/rs/bitcoin/validation/src/constants.rs b/rs/bitcoin/validation/src/constants.rs index 5a632b27808..618a657c1eb 100644 --- a/rs/bitcoin/validation/src/constants.rs +++ b/rs/bitcoin/validation/src/constants.rs @@ -57,11 +57,18 @@ const TESTNET: &[(BlockHeight, &str)] = &[ (546, "000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70") ]; +/// Bitcoin testnet checkpoints +#[rustfmt::skip] +const TESTNET4: &[(BlockHeight, &str)] = &[ + (64000, "000000000deb369dca3115f66e208733066f44c8cc177edd4b5f86869e6355b5") +]; + /// Returns the maximum difficulty target depending on the network pub fn max_target(network: &Network) -> Target { match network { Network::Bitcoin => Target::MAX_ATTAINABLE_MAINNET, Network::Testnet => Target::MAX_ATTAINABLE_TESTNET, + Network::Testnet4 => Target::MAX_ATTAINABLE_TESTNET, Network::Regtest => Target::MAX_ATTAINABLE_REGTEST, Network::Signet => Target::MAX_ATTAINABLE_SIGNET, &other => unreachable!("Unsupported network: {:?}", other), @@ -72,7 +79,7 @@ pub fn max_target(network: &Network) -> Target { /// readjusted in the network after a fixed time interval. pub fn no_pow_retargeting(network: &Network) -> bool { match network { - Network::Bitcoin | Network::Testnet | Network::Signet => false, + Network::Bitcoin | Network::Testnet | Network::Signet | Network::Testnet4 => false, Network::Regtest => true, &other => unreachable!("Unsupported network: {:?}", other), } @@ -83,6 +90,7 @@ pub fn pow_limit_bits(network: &Network) -> CompactTarget { CompactTarget::from_consensus(match network { Network::Bitcoin => 0x1d00ffff, Network::Testnet => 0x1d00ffff, + Network::Testnet4 => 0x1d00ffff, Network::Regtest => 0x207fffff, Network::Signet => 0x1e0377ae, &other => unreachable!("Unsupported network: {:?}", other), @@ -94,7 +102,7 @@ pub fn checkpoints(network: &Network) -> HashMap { let points = match network { Network::Bitcoin => BITCOIN, Network::Testnet => TESTNET, - Network::Testnet4 => &[], + Network::Testnet4 => TESTNET4, Network::Signet => &[], Network::Regtest => &[], _ => &[], @@ -114,7 +122,7 @@ pub fn latest_checkpoint_height(network: &Network, current_height: BlockHeight) let points = match network { Network::Bitcoin => BITCOIN, Network::Testnet => TESTNET, - Network::Testnet4 => &[], + Network::Testnet4 => TESTNET4, Network::Signet => &[], Network::Regtest => &[], _ => &[], diff --git a/rs/bitcoin/validation/src/header.rs b/rs/bitcoin/validation/src/header.rs index ef7769ebaf4..c7166c9afdb 100644 --- a/rs/bitcoin/validation/src/header.rs +++ b/rs/bitcoin/validation/src/header.rs @@ -91,7 +91,11 @@ pub fn validate_header( if let Err(err) = header.validate_pow(Target::from_compact(compact_target)) { match err { ValidationError::BadProofOfWork => println!("bad proof of work"), - ValidationError::BadTarget => println!("bad target"), + ValidationError::BadTarget => println!( + "bad target {:?}, {:?}", + Target::from_compact(compact_target), + header.target() + ), _ => {} }; return Err(ValidateHeaderError::InvalidPoWForComputedTarget); @@ -164,7 +168,7 @@ fn get_next_compact_target( timestamp: u32, ) -> CompactTarget { match network { - Network::Testnet | Network::Regtest => { + Network::Testnet | Network::Regtest | Network::Testnet4 => { if (prev_height + 1) % DIFFICULTY_ADJUSTMENT_INTERVAL != 0 { // This if statements is reached only for Regtest and Testnet networks // Here is the quote from "https://en.bitcoin.it/wiki/Testnet" @@ -206,8 +210,9 @@ fn find_next_difficulty_in_chain( ) -> CompactTarget { // This is the maximum difficulty target for the network let pow_limit_bits = pow_limit_bits(network); + match network { - Network::Testnet | Network::Regtest => { + Network::Testnet | Network::Regtest | Network::Testnet4 => { let mut current_header = *prev_header; let mut current_height = prev_height; let mut current_hash = current_header.block_hash(); @@ -282,7 +287,20 @@ fn compute_next_difficulty( let actual_interval = std::cmp::max((prev_header.time as i64) - (last_adjustment_time as i64), 0) as u64; - CompactTarget::from_next_work_required(prev_header.bits, actual_interval, *network) + //TODO: ideally from_next_work_required works by itself + // On Testnet networks, prev_header.bits could be different than last_adjustment_header.bits + // if prev_header took more than 20 minutes to be created. + // Testnet3 (mistakenly) uses the temporary difficulty drop of prev_header to calculate + // the difficulty of th next epoch; this results in the whole epoch having a very low difficulty, + // and therefore likely blockstorms. + // Testnet4 uses the last_adjustment_header.bits to calculate the next epoch's difficulty, making it + // more stable. + //TODO(mihailjianu): add a test for testnet4. + let previous_difficulty = match network { + Network::Testnet4 => last_adjustment_header.bits, + _ => prev_header.bits, + }; + CompactTarget::from_next_work_required(previous_difficulty, actual_interval, *network) } #[cfg(test)] @@ -295,6 +313,8 @@ mod test { }; use csv::Reader; + use rstest::rstest; + use super::*; use crate::constants::test::{ MAINNET_HEADER_586656, MAINNET_HEADER_705600, MAINNET_HEADER_705601, MAINNET_HEADER_705602, @@ -559,9 +579,49 @@ mod test { } #[test] - fn test_compute_next_difficulty_for_backdated_blocks() { + fn test_compute_next_difficulty_for_temporary_difficulty_drops_testnet4() { + // Arrange + let network = Network::Testnet4; + let chain_length = DIFFICULTY_ADJUSTMENT_INTERVAL - 1; // To trigger the difficulty adjustment. + let genesis_difficulty = CompactTarget::from_consensus(473956288); + + // Create the genesis header and initialize the header store with 2014 blocks + let genesis_header = genesis_header(genesis_difficulty); + let mut store = SimpleHeaderStore::new(genesis_header, 0); + let mut last_header = genesis_header; + for _ in 1..(chain_length - 1) { + let new_header = BlockHeader { + prev_blockhash: last_header.block_hash(), + time: last_header.time + 1, + ..last_header + }; + store.add(new_header); + last_header = new_header; + } + // Add the last header in the epoch, which has the lowest difficulty, or highest possible target. + // This can happen if the block is created more than 20 minutes after the previous block. + let last_header_in_epoch = BlockHeader { + prev_blockhash: last_header.block_hash(), + time: last_header.time + 1, + bits: max_target(&network).to_compact_lossy(), + ..last_header + }; + store.add(last_header_in_epoch); + + // Act. + let difficulty = + compute_next_difficulty(&network, &store, &last_header_in_epoch, chain_length); + + // Assert. + // Note: testnet3 would produce 473956288, as it depends on the previous header's difficulty. + assert_eq!(difficulty, CompactTarget::from_consensus(470810608)); + } + + #[rstest] + #[case(Network::Testnet)] + #[case(Network::Testnet4)] + fn test_compute_next_difficulty_for_backdated_blocks(#[case] network: Network) { // Arrange: Set up the test network and parameters - let network = Network::Testnet; let chain_length = DIFFICULTY_ADJUSTMENT_INTERVAL - 1; // To trigger the difficulty adjustment. let genesis_difficulty = CompactTarget::from_consensus(486604799); diff --git a/rs/boundary_node/ic_boundary/BUILD.bazel b/rs/boundary_node/ic_boundary/BUILD.bazel index 2a95d624a98..02aeebd1837 100644 --- a/rs/boundary_node/ic_boundary/BUILD.bazel +++ b/rs/boundary_node/ic_boundary/BUILD.bazel @@ -5,14 +5,14 @@ package(default_visibility = ["//visibility:public"]) DEPENDENCIES = [ # Keep sorted. - "//rs/boundary_node/anonymization/client", + "//packages/ic-ed25519", "//rs/boundary_node/rate_limits/api:rate_limits_api", + "//rs/boundary_node/salt_sharing/api:salt_sharing_api", "//rs/canister_client", "//rs/canister_client/sender", "//rs/certification/test-utils", "//rs/config", "//rs/crypto", - "//rs/crypto/ed25519", "//rs/crypto/tree_hash", "//rs/crypto/utils/basic_sig", "//rs/crypto/utils/threshold_sig_der", diff --git a/rs/boundary_node/ic_boundary/Cargo.toml b/rs/boundary_node/ic_boundary/Cargo.toml index dfc8567888a..689a0a216ca 100644 --- a/rs/boundary_node/ic_boundary/Cargo.toml +++ b/rs/boundary_node/ic_boundary/Cargo.toml @@ -16,7 +16,6 @@ tls = [] [dependencies] anyhow = { workspace = true } -anonymization-client = { path = "../anonymization/client" } arc-swap = "1.7.1" async-scoped = { version = "0.9", features = ["use-tokio"] } async-trait = { workspace = true } @@ -41,11 +40,11 @@ ic-canister-client-sender = { path = "../../canister_client/sender" } ic-certification-test-utils = { path = "../../certification/test-utils" } ic-config = { path = "../../config" } ic-crypto = { path = "../../crypto" } -ic-crypto-ed25519 = { path = "../../crypto/ed25519" } ic-crypto-tree-hash = { path = "../../crypto/tree_hash" } ic-crypto-utils-basic-sig = { path = "../../crypto/utils/basic_sig" } ic-crypto-utils-threshold-sig-der = { path = "../../crypto/utils/threshold_sig_der" } ic-crypto-utils-tls = { path = "../../crypto/utils/tls" } +ic-ed25519 = { path = "../../../packages/ic-ed25519" } ic-interfaces = { path = "../../interfaces" } ic-interfaces-registry = { path = "../../interfaces/registry" } ic-limits = { path = "../../limits" } @@ -72,6 +71,7 @@ prometheus = { workspace = true } rand = { workspace = true } ratelimit = "0.9.1" rate-limits-api = { path = "../rate_limits/api" } +salt-sharing-api = { path = "../salt_sharing/api" } rcgen = { workspace = true } regex = { workspace = true } reqwest = { workspace = true } diff --git a/rs/boundary_node/ic_boundary/src/cli.rs b/rs/boundary_node/ic_boundary/src/cli.rs index 8ca8c993d02..9dd64cd29da 100644 --- a/rs/boundary_node/ic_boundary/src/cli.rs +++ b/rs/boundary_node/ic_boundary/src/cli.rs @@ -241,6 +241,10 @@ pub struct Observability { /// Log Anonymization Canister ID #[clap(env, long)] pub obs_log_anonymization_canister_id: Option, + + /// Frequency to poll the canister for the anonymization salt + #[clap(env, long, default_value = "60s", value_parser = parse_duration)] + pub obs_log_anonymization_poll_interval: Duration, } #[derive(Args)] diff --git a/rs/boundary_node/ic_boundary/src/core.rs b/rs/boundary_node/ic_boundary/src/core.rs index 8c06873aa21..a2d96354941 100644 --- a/rs/boundary_node/ic_boundary/src/core.rs +++ b/rs/boundary_node/ic_boundary/src/core.rs @@ -6,11 +6,6 @@ use std::{ time::{Duration, Instant}, }; -use anonymization_client::{ - Canister as AnonymizationCanister, - CanisterMethodsBuilder as AnonymizationCanisterMethodsBuilder, Track, - Tracker as AnonymizationTracker, -}; use anyhow::{anyhow, Context, Error}; use arc_swap::ArcSwapOption; use async_scoped::TokioScope; @@ -49,7 +44,6 @@ use ic_registry_replicator::RegistryReplicator; use ic_types::{crypto::threshold_sig::ThresholdSigPublicKey, messages::MessageId}; use nix::unistd::{getpgid, setpgid, Pid}; use prometheus::Registry; -use rand::rngs::OsRng; use tokio::sync::watch; use tokio_util::sync::CancellationToken; use tower::{limit::ConcurrencyLimitLayer, util::MapResponseLayer, ServiceBuilder}; @@ -73,6 +67,7 @@ use crate::{ rate_limiting::{generic, RateLimit}, retry::{retry_request, RetryParams}, routes::{self, ErrorCause, Health, Lookup, Proxy, ProxyRouter, RootKey}, + salt_fetcher::AnonymizationSaltFetcher, snapshot::{ generate_stub_snapshot, generate_stub_subnet, RegistrySnapshot, SnapshotPersister, Snapshotter, @@ -447,15 +442,24 @@ pub async fn main(cli: Cli) -> Result<(), Error> { } // HTTP Logs Anonymization - let tracker = if let Some(v) = cli.obs.obs_log_anonymization_canister_id { - let canister = AnonymizationCanister::new(agent.clone().unwrap(), v); - let cm = AnonymizationCanisterMethodsBuilder::new(canister) - .with_metrics(&metrics_registry) - .build(); - Some(AnonymizationTracker::new(Box::new(OsRng), cm)?) - } else { - None - }; + let salt_fetcher = cli + .obs + .obs_log_anonymization_canister_id + .and_then(|canister_id| { + agent.as_ref().map(|agent| { + Arc::new(AnonymizationSaltFetcher::new( + agent.clone(), + canister_id, + cli.obs.obs_log_anonymization_poll_interval, + anonymization_salt, + &metrics_registry, + )) + }) + }); + + if let Some(fetcher) = salt_fetcher { + runners.push(Box::new(fetcher)); + } TokioScope::scope_and_block(move |s| { if let Some(v) = registry_replicator { @@ -470,16 +474,6 @@ pub async fn main(cli: Cli) -> Result<(), Error> { }); } - // Anonymization Tracker - if let Some(mut t) = tracker { - s.spawn(async move { - t.track(|value| { - anonymization_salt.store(Some(Arc::new(value))); - }) - .await - }); - } - // HTTP servers s.spawn(async move { metrics_server diff --git a/rs/boundary_node/ic_boundary/src/lib.rs b/rs/boundary_node/ic_boundary/src/lib.rs index 768c8119df5..789c3023745 100644 --- a/rs/boundary_node/ic_boundary/src/lib.rs +++ b/rs/boundary_node/ic_boundary/src/lib.rs @@ -12,6 +12,7 @@ mod persist; mod rate_limiting; mod retry; mod routes; +mod salt_fetcher; mod snapshot; #[cfg(any(test, feature = "bench"))] pub mod test_utils; diff --git a/rs/boundary_node/ic_boundary/src/main.rs b/rs/boundary_node/ic_boundary/src/main.rs index e12c4d5b2dd..dc98bdc8aa2 100644 --- a/rs/boundary_node/ic_boundary/src/main.rs +++ b/rs/boundary_node/ic_boundary/src/main.rs @@ -19,6 +19,7 @@ mod persist; mod rate_limiting; mod retry; mod routes; +mod salt_fetcher; mod snapshot; #[cfg(any(test, feature = "bench"))] pub mod test_utils; diff --git a/rs/boundary_node/ic_boundary/src/salt_fetcher.rs b/rs/boundary_node/ic_boundary/src/salt_fetcher.rs new file mode 100644 index 00000000000..53db6b80117 --- /dev/null +++ b/rs/boundary_node/ic_boundary/src/salt_fetcher.rs @@ -0,0 +1,155 @@ +use crate::core::Run; +use anyhow::Error; +use arc_swap::ArcSwapOption; +use async_trait::async_trait; +use candid::Principal; +use candid::{Decode, Encode}; +use ic_canister_client::Agent; +use ic_types::CanisterId; +use prometheus::{ + register_int_counter_vec_with_registry, register_int_gauge_with_registry, IntCounterVec, + IntGauge, Registry, +}; +use salt_sharing_api::GetSaltResponse; +use std::time::{SystemTime, UNIX_EPOCH}; +use std::{sync::Arc, time::Duration}; +use tokio::time::sleep; +use tracing::warn; + +const SERVICE: &str = "AnonymizationSaltFetcher"; +const METRIC_PREFIX: &str = "anonymization_salt"; + +fn nonce() -> Vec { + SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_nanos() + .to_le_bytes() + .to_vec() +} + +struct Metrics { + last_successful_fetch: IntGauge, + fetches: IntCounterVec, + last_salt_id: IntGauge, +} + +impl Metrics { + fn new(registry: &Registry) -> Self { + Self { + last_successful_fetch: register_int_gauge_with_registry!( + format!("{METRIC_PREFIX}_last_successful_fetch"), + format!("The Unix timestamp of the last successful salt fetch"), + registry + ) + .unwrap(), + + last_salt_id: register_int_gauge_with_registry!( + format!("{METRIC_PREFIX}_last_salt_id"), + format!("ID of the latest fetched salt"), + registry, + ) + .unwrap(), + + fetches: register_int_counter_vec_with_registry!( + format!("{METRIC_PREFIX}_fetches"), + format!("Count of salt fetches and their outcome"), + &["result"], + registry + ) + .unwrap(), + } + } +} + +pub struct AnonymizationSaltFetcher { + agent: Agent, + canister_id: CanisterId, + polling_interval: Duration, + anonymization_salt: Arc>>, + metrics: Metrics, +} + +impl AnonymizationSaltFetcher { + pub fn new( + agent: Agent, + canister_id: Principal, + polling_interval: Duration, + anonymization_salt: Arc>>, + registry: &Registry, + ) -> Self { + Self { + agent, + canister_id: CanisterId::try_from_principal_id(canister_id.into()).unwrap(), + anonymization_salt, + polling_interval, + metrics: Metrics::new(registry), + } + } +} + +#[async_trait] +impl Run for Arc { + async fn run(&mut self) -> Result<(), Error> { + loop { + let query_response = match self + .agent + .execute_update( + &self.canister_id, + &self.canister_id, + "get_salt", + Encode!().unwrap(), + nonce(), + ) + .await + { + Ok(response) => match response { + Some(response) => response, + None => { + warn!("{SERVICE}: got empty response from the canister"); + continue; + } + }, + Err(err) => { + warn!("{SERVICE}: failed to get salt from the canister: {err:#}"); + continue; + } + }; + + let salt_response = match Decode!(&query_response, GetSaltResponse) { + Ok(response) => response, + Err(err) => { + warn!("{SERVICE}: failed to decode candid response: {err:?}"); + continue; + } + }; + + let status = if salt_response.is_ok() { + "success" + } else { + "failure" + }; + self.metrics.fetches.with_label_values(&[status]).inc(); + + match salt_response { + Ok(resp) => { + // Overwrite salt used for hashing sensitive data + self.anonymization_salt.store(Some(Arc::new(resp.salt))); + // Update metrics + self.metrics.last_salt_id.set(resp.salt_id as i64); + self.metrics.last_successful_fetch.set( + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs() as i64, + ); + } + Err(err) => { + warn!("{SERVICE}: get_salt failed: {err:?}"); + } + } + + sleep(self.polling_interval).await; + } + } +} diff --git a/rs/boundary_node/ic_boundary/src/test_utils.rs b/rs/boundary_node/ic_boundary/src/test_utils.rs index 5fd9ddbdecd..625ddd786f4 100644 --- a/rs/boundary_node/ic_boundary/src/test_utils.rs +++ b/rs/boundary_node/ic_boundary/src/test_utils.rs @@ -133,7 +133,6 @@ pub fn test_subnet_record() -> SubnetRecord { max_number_of_canisters: 0, ssh_readonly_access: vec![], ssh_backup_access: vec![], - ecdsa_config: None, chain_key_config: None, } } diff --git a/rs/boundary_node/ic_boundary/src/tls_verify.rs b/rs/boundary_node/ic_boundary/src/tls_verify.rs index b2ab1e99161..f7f8ecaf84c 100644 --- a/rs/boundary_node/ic_boundary/src/tls_verify.rs +++ b/rs/boundary_node/ic_boundary/src/tls_verify.rs @@ -114,7 +114,7 @@ impl ServerCertVerifier for TlsVerifier { .map_err(|_x| RustlsError::InvalidCertificate(CertificateError::BadEncoding))?; // Verify the provided self-signed certificate using the public key from registry - let node_tls_pubkey_from_registry = ic_crypto_ed25519::PublicKey::deserialize_raw( + let node_tls_pubkey_from_registry = ic_ed25519::PublicKey::deserialize_raw( &node_cert .tbs_certificate .subject_pki diff --git a/rs/boundary_node/salt_sharing/BUILD.bazel b/rs/boundary_node/salt_sharing/BUILD.bazel new file mode 100644 index 00000000000..33ec3de1cfc --- /dev/null +++ b/rs/boundary_node/salt_sharing/BUILD.bazel @@ -0,0 +1,46 @@ +load("@rules_rust//rust:defs.bzl", "rust_test") +load("//bazel:canisters.bzl", "rust_canister") + +package(default_visibility = ["//visibility:public"]) + +DEPENDENCIES = [ + # Keep sorted. + "//rs/boundary_node/salt_sharing/api:salt_sharing_api", + "//rs/nns/constants", + "//rs/rust_canisters/canister_log", + "//rs/rust_canisters/http_types", + "@crate_index//:candid", + "@crate_index//:ic-cdk", + "@crate_index//:ic-cdk-timers", + "@crate_index//:ic-stable-structures", + "@crate_index//:prometheus", + "@crate_index//:serde", + "@crate_index//:serde_cbor", + "@crate_index//:serde_json", + "@crate_index//:time", +] + +MACRO_DEPENDENCIES = [ + # Keep sorted. + "@crate_index//:ic-cdk-macros", +] + +rust_canister( + name = "salt_sharing_canister", + srcs = glob(["canister/**/*.rs"]), + crate_name = "salt_sharing_canister", + crate_root = "canister/lib.rs", + proc_macro_deps = MACRO_DEPENDENCIES, + service_file = "canister/salt_sharing_canister.did", + deps = DEPENDENCIES, +) + +rust_test( + name = "unit_tests", + srcs = glob(["canister/**/*.rs"]), + crate_name = "salt_sharing_canister", + crate_root = "canister/lib.rs", + data = ["canister/salt_sharing_canister.did"], + proc_macro_deps = MACRO_DEPENDENCIES, + deps = DEPENDENCIES + ["@crate_index//:candid_parser"], +) diff --git a/rs/boundary_node/salt_sharing/Cargo.toml b/rs/boundary_node/salt_sharing/Cargo.toml new file mode 100644 index 00000000000..5c2ffceebf7 --- /dev/null +++ b/rs/boundary_node/salt_sharing/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "salt_sharing" +version.workspace = true +authors.workspace = true +edition.workspace = true +description.workspace = true +documentation.workspace = true + +[dependencies] +candid = { workspace = true } +ic-canisters-http-types = { path = "../../rust_canisters/http_types" } +ic-canister-log = { path = "../../rust_canisters/canister_log" } +ic-cdk = { workspace = true } +ic-cdk-macros = { workspace = true } +ic-cdk-timers = { workspace = true } +ic-nns-constants = { path = "../../nns/constants" } +ic-stable-structures = { workspace = true } +prometheus = {workspace = true } +salt-sharing-api = { path = "./api" } +serde = { workspace = true } +serde_cbor = { workspace = true } +serde_json = { workspace = true } +time = { workspace = true } + +[dev-dependencies] +candid_parser = { workspace = true } + +[lib] +crate-type = ["cdylib"] +path = "canister/lib.rs" diff --git a/rs/boundary_node/salt_sharing/api/BUILD.bazel b/rs/boundary_node/salt_sharing/api/BUILD.bazel new file mode 100644 index 00000000000..e7c3c2e9298 --- /dev/null +++ b/rs/boundary_node/salt_sharing/api/BUILD.bazel @@ -0,0 +1,18 @@ +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//visibility:public"]) + +DEPENDENCIES = [ + # Keep sorted. + "@crate_index//:candid", + "@crate_index//:serde", +] + +rust_library( + name = "salt_sharing_api", + srcs = glob(["src/**/*.rs"]), + aliases = {}, + crate_name = "salt_sharing_api", + proc_macro_deps = [], + deps = DEPENDENCIES, +) diff --git a/rs/boundary_node/salt_sharing/api/Cargo.toml b/rs/boundary_node/salt_sharing/api/Cargo.toml new file mode 100644 index 00000000000..254b0c40b9c --- /dev/null +++ b/rs/boundary_node/salt_sharing/api/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "salt-sharing-api" +version.workspace = true +authors.workspace = true +edition.workspace = true +description.workspace = true +documentation.workspace = true + +[dependencies] +candid = { workspace = true } +serde = { workspace = true } + +[dev-dependencies] + +[lib] +path = "src/lib.rs" diff --git a/rs/boundary_node/salt_sharing/api/src/lib.rs b/rs/boundary_node/salt_sharing/api/src/lib.rs new file mode 100644 index 00000000000..80685552c01 --- /dev/null +++ b/rs/boundary_node/salt_sharing/api/src/lib.rs @@ -0,0 +1,37 @@ +use candid::{CandidType, Principal}; +use serde::{Deserialize, Serialize}; + +pub type GetSaltResponse = Result; + +#[derive(CandidType, Deserialize, Debug, Clone)] +pub enum SaltGenerationStrategy { + StartOfMonth, +} + +#[derive(CandidType, Deserialize, Debug, Clone)] +pub struct InitArg { + pub regenerate_now: bool, + pub salt_generation_strategy: SaltGenerationStrategy, + pub registry_polling_interval_secs: u64, +} + +#[derive(CandidType, Deserialize, Debug, Clone)] +pub struct SaltResponse { + pub salt: Vec, + pub salt_id: u64, +} + +#[derive(CandidType, Deserialize, Debug, Clone, PartialEq)] +pub enum GetSaltError { + SaltNotInitialized, + Unauthorized, + Internal(String), +} + +#[derive(CandidType, Serialize, Deserialize, Clone, PartialEq, Debug, Eq)] +pub struct ApiBoundaryNodeIdRecord { + pub id: Option, +} + +#[derive(CandidType, Deserialize, Clone, Copy, PartialEq, Eq)] +pub struct GetApiBoundaryNodeIdsRequest {} diff --git a/rs/boundary_node/salt_sharing/canister/canister.rs b/rs/boundary_node/salt_sharing/canister/canister.rs new file mode 100644 index 00000000000..a35c9f19efa --- /dev/null +++ b/rs/boundary_node/salt_sharing/canister/canister.rs @@ -0,0 +1,132 @@ +use crate::helpers::{init_async, is_api_boundary_node_principal}; +use crate::logs::export_logs_as_http_response; +use crate::metrics::{export_metrics_as_http_response, METRICS}; +use crate::storage::SALT; +use ic_canisters_http_types::{HttpRequest, HttpResponse, HttpResponseBuilder}; +use ic_cdk::api::call::{accept_message, method_name}; +use ic_cdk::{api::time, spawn}; +use ic_cdk::{caller, trap}; +use ic_cdk_macros::{init, inspect_message, post_upgrade, query}; +use ic_cdk_timers::set_timer; +use salt_sharing_api::{GetSaltError, GetSaltResponse, InitArg, SaltResponse}; +use std::time::Duration; + +const REPLICATED_QUERY_METHOD: &str = "get_salt"; + +// Inspect the ingress messages in the pre-consensus phase and reject early, if the conditions are not met +#[inspect_message] +fn inspect_message() { + let caller_id = caller(); + let called_method = method_name(); + + if called_method == REPLICATED_QUERY_METHOD && is_api_boundary_node_principal(&caller_id) { + accept_message(); + } else { + trap("message_inspection_failed: method call is prohibited in the current context"); + } +} + +// Runs when canister is first installed +#[init] +fn init(init_arg: InitArg) { + set_timer(Duration::ZERO, || { + spawn(async { init_async(init_arg).await }); + }); + // Update metric. + let current_time = time() as i64; + METRICS.with(|cell| { + cell.borrow_mut() + .last_canister_change_time + .set(current_time); + }); +} + +// Runs on every canister upgrade +#[post_upgrade] +fn post_upgrade(init_arg: InitArg) { + // Run the same initialization logic + init(init_arg); +} + +#[query] +fn get_salt() -> GetSaltResponse { + let caller_id = caller(); + if is_api_boundary_node_principal(&caller_id) { + let stored_salt = SALT + .with(|cell| cell.borrow().get(&())) + .ok_or(GetSaltError::SaltNotInitialized)?; + + return Ok(SaltResponse { + salt: stored_salt.salt, + salt_id: stored_salt.salt_id, + }); + } + Err(GetSaltError::Unauthorized) +} + +#[query(decoding_quota = 10000)] +fn http_request(request: HttpRequest) -> HttpResponse { + match request.path() { + "/metrics" => export_metrics_as_http_response(), + "/logs" => export_logs_as_http_response(request), + _ => HttpResponseBuilder::not_found().build(), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn check_candid_interface_compatibility() { + use candid_parser::utils::{service_equal, CandidSource}; + + fn source_to_str(source: &CandidSource) -> String { + match source { + CandidSource::File(f) => { + std::fs::read_to_string(f).unwrap_or_else(|_| "".to_string()) + } + CandidSource::Text(t) => t.to_string(), + } + } + + fn check_service_equal( + new_name: &str, + new: CandidSource, + old_name: &str, + old: CandidSource, + ) { + let new_str = source_to_str(&new); + let old_str = source_to_str(&old); + match service_equal(new, old) { + Ok(_) => {} + Err(e) => { + eprintln!( + "{} is not compatible with {}!\n\n\ + {}:\n\ + {}\n\n\ + {}:\n\ + {}\n", + new_name, old_name, new_name, new_str, old_name, old_str + ); + panic!("{:?}", e); + } + } + } + + candid::export_service!(); + + let new_interface = __export_service(); + + // check the public interface against the actual one + let old_interface = std::path::PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()) + .join("canister/salt_sharing_canister.did"); + + check_service_equal( + "actual rate-limit candid interface", + candid_parser::utils::CandidSource::Text(&new_interface), + "declared candid interface in interface.did file", + candid_parser::utils::CandidSource::File(old_interface.as_path()), + ); + } +} diff --git a/rs/boundary_node/salt_sharing/canister/helpers.rs b/rs/boundary_node/salt_sharing/canister/helpers.rs new file mode 100644 index 00000000000..7fa68a90b23 --- /dev/null +++ b/rs/boundary_node/salt_sharing/canister/helpers.rs @@ -0,0 +1,136 @@ +use std::{collections::HashSet, time::Duration}; + +use crate::{ + logs::P0, + metrics::METRICS, + storage::{StorableSalt, API_BOUNDARY_NODE_PRINCIPALS, SALT, SALT_SIZE}, + time::delay_till_next_month, +}; +use candid::Principal; +use ic_canister_log::log; +use ic_cdk::{api::time, call, spawn}; +use ic_cdk_timers::{set_timer, set_timer_interval}; +use ic_nns_constants::REGISTRY_CANISTER_ID; +use salt_sharing_api::{ + ApiBoundaryNodeIdRecord, GetApiBoundaryNodeIdsRequest, InitArg, SaltGenerationStrategy, +}; + +const REGISTRY_CANISTER_METHOD: &str = "get_api_boundary_node_ids"; + +pub async fn init_async(init_arg: InitArg) { + if !is_salt_init() || init_arg.regenerate_now { + if let Err(err) = try_regenerate_salt().await { + log!(P0, "[init_regenerate_salt_failed]: {err}"); + } + } + // Start salt generation schedule based on the argument. + match init_arg.salt_generation_strategy { + SaltGenerationStrategy::StartOfMonth => schedule_monthly_salt_generation(), + } + // Set up periodical job to get all API boundary node IDs from the registry. + let period = Duration::from_secs(init_arg.registry_polling_interval_secs); + set_timer_interval(period, || spawn(poll_api_boundary_nodes())); +} + +// Sets an execution timer (delayed future task) and returns immediately. +pub fn schedule_monthly_salt_generation() { + let delay = delay_till_next_month(time()); + set_timer(delay, || { + spawn(async { + if let Err(err) = try_regenerate_salt().await { + log!(P0, "[scheduled_regenerate_salt_failed]: {err}"); + } + // Function is called recursively to schedule next execution + schedule_monthly_salt_generation(); + }); + }); +} + +pub fn is_salt_init() -> bool { + SALT.with(|cell| cell.borrow().get(&())).is_some() +} + +// Regenerate salt and store it in the stable memory +// Can only fail, if the calls to management canister fail. +pub async fn try_regenerate_salt() -> Result<(), String> { + // Closure for getting random bytes from the IC. + let rnd_call = |attempt: u32| async move { + ic_cdk::call(Principal::management_canister(), "raw_rand", ()) + .await + .map_err(|err| { + format!( + "Call {attempt} to raw_rand failed: code={:?}, err={}", + err.0, err.1 + ) + }) + }; + + let (rnd_bytes_1,): ([u8; 32],) = rnd_call(1).await?; + let (rnd_bytes_2,): ([u8; 32],) = rnd_call(2).await?; + + // Concatenate arrays to form an array of 64 random bytes. + let mut salt = [rnd_bytes_1, rnd_bytes_2].concat(); + salt.truncate(SALT_SIZE); + + let stored_salt = StorableSalt { + salt, + salt_id: time(), + }; + + SALT.with(|cell| { + cell.borrow_mut().insert((), stored_salt); + }); + + Ok(()) +} + +pub async fn poll_api_boundary_nodes() { + let canister_id = Principal::from(REGISTRY_CANISTER_ID); + + let (call_status, message) = match call::<_, (Result, String>,)>( + canister_id, + REGISTRY_CANISTER_METHOD, + (&GetApiBoundaryNodeIdsRequest {},), + ) + .await + { + Ok((Ok(api_bn_records),)) => { + // Set authorized readers of salt. + let principals: HashSet<_> = api_bn_records.into_iter().filter_map(|n| n.id).collect(); + API_BOUNDARY_NODE_PRINCIPALS.with(|cell| *cell.borrow_mut() = principals); + // Update metric. + let current_time = time() as i64; + METRICS.with(|cell| { + cell.borrow_mut() + .last_successful_registry_poll_time + .set(current_time); + }); + ("success", "") + } + Ok((Err(err),)) => { + log!( + P0, + "[poll_api_boundary_nodes]: failed to fetch nodes from registry {err:?}", + ); + ("failure", "calling_canister_method_failed") + } + Err(err) => { + log!( + P0, + "[poll_api_boundary_nodes]: failed to fetch nodes from registry {err:?}", + ); + ("failure", "canister_call_rejected") + } + }; + // Update metric. + METRICS.with(|cell| { + cell.borrow_mut() + .registry_poll_calls + .with_label_values(&[call_status, message]) + .inc(); + }); +} + +pub fn is_api_boundary_node_principal(principal: &Principal) -> bool { + API_BOUNDARY_NODE_PRINCIPALS.with(|cell| cell.borrow().contains(principal)) +} diff --git a/rs/boundary_node/salt_sharing/canister/lib.rs b/rs/boundary_node/salt_sharing/canister/lib.rs new file mode 100644 index 00000000000..e217982777b --- /dev/null +++ b/rs/boundary_node/salt_sharing/canister/lib.rs @@ -0,0 +1,16 @@ +#[cfg(any(target_family = "wasm", test))] +mod canister; +#[allow(dead_code)] +#[cfg(any(target_family = "wasm", test))] +mod helpers; +#[allow(dead_code)] +mod logs; +#[allow(dead_code)] +mod metrics; +#[allow(dead_code)] +mod storage; +#[allow(dead_code)] +mod time; + +#[allow(dead_code)] +fn main() {} diff --git a/rs/boundary_node/salt_sharing/canister/logs.rs b/rs/boundary_node/salt_sharing/canister/logs.rs new file mode 100644 index 00000000000..ff375832733 --- /dev/null +++ b/rs/boundary_node/salt_sharing/canister/logs.rs @@ -0,0 +1,78 @@ +use candid::Deserialize; +use ic_canister_log::{declare_log_buffer, export as export_logs}; +use ic_canisters_http_types::{HttpRequest, HttpResponse, HttpResponseBuilder}; +use std::str::FromStr; + +// High-priority messages. +declare_log_buffer!(name = P0, capacity = 1000); + +// Low-priority info messages. +declare_log_buffer!(name = P1, capacity = 1000); + +#[derive(Clone, Debug, Default, Deserialize, serde::Serialize)] +pub struct Log { + pub entries: Vec, +} + +#[derive(Clone, Debug, Deserialize, serde::Serialize)] +pub struct LogEntry { + pub timestamp: u64, + pub priority: Priority, + pub file: String, + pub line: u32, + pub message: String, + pub counter: u64, +} + +#[derive(Clone, Debug, Deserialize, serde::Serialize)] +pub enum Priority { + P0, + P1, +} + +pub fn export_logs_as_http_response(request: HttpRequest) -> HttpResponse { + let max_skip_timestamp = match request.raw_query_param("time") { + Some(arg) => match u64::from_str(arg) { + Ok(value) => value, + Err(_) => { + return HttpResponseBuilder::bad_request() + .with_body_and_content_length("failed to parse the 'time' parameter") + .build() + } + }, + None => 0, + }; + + let mut entries: Log = Default::default(); + + for entry in export_logs(&P0) { + entries.entries.push(LogEntry { + timestamp: entry.timestamp, + counter: entry.counter, + priority: Priority::P0, + file: entry.file.to_string(), + line: entry.line, + message: entry.message, + }); + } + + for entry in export_logs(&P1) { + entries.entries.push(LogEntry { + timestamp: entry.timestamp, + counter: entry.counter, + priority: Priority::P1, + file: entry.file.to_string(), + line: entry.line, + message: entry.message, + }); + } + + entries + .entries + .retain(|entry| entry.timestamp >= max_skip_timestamp); + + HttpResponseBuilder::ok() + .header("Content-Type", "application/json; charset=utf-8") + .with_body_and_content_length(serde_json::to_string(&entries).unwrap_or_default()) + .build() +} diff --git a/rs/boundary_node/salt_sharing/canister/metrics.rs b/rs/boundary_node/salt_sharing/canister/metrics.rs new file mode 100644 index 00000000000..073021f44b5 --- /dev/null +++ b/rs/boundary_node/salt_sharing/canister/metrics.rs @@ -0,0 +1,115 @@ +use ic_canisters_http_types::{HttpResponse, HttpResponseBuilder}; +use ic_cdk::api::stable::WASM_PAGE_SIZE_IN_BYTES; +use prometheus::{ + CounterVec, Encoder, Gauge, IntGauge, Opts, Registry, Result as PrometheusResult, TextEncoder, +}; +use std::{borrow::BorrowMut, cell::RefCell}; + +use crate::storage::{API_BOUNDARY_NODE_PRINCIPALS, SALT}; + +thread_local! { + pub static METRICS: RefCell = RefCell::new(CanisterMetrics::new().expect("failed to create Prometheus metrics")); +} + +/// Represents all metrics collected in the canister +pub struct CanisterMetrics { + pub registry: Registry, // Prometheus registry + pub last_salt_id: IntGauge, + pub api_boundary_nodes_count: IntGauge, + pub last_canister_change_time: IntGauge, + pub last_successful_registry_poll_time: IntGauge, + pub registry_poll_calls: CounterVec, + pub stable_memory_size: Gauge, +} + +impl CanisterMetrics { + pub fn new() -> PrometheusResult { + let registry = Registry::new(); + + let last_salt_id = IntGauge::new("last_salt_id", "ID of the latest salt")?; + + let api_boundary_nodes_count = IntGauge::new( + "api_boundary_nodes_count", + "Number of API boundary nodes with read access to salt.", + )?; + + let last_canister_change_time = IntGauge::new( + "last_successful_canister_upgrade", + "The Unix timestamp of the last successful canister upgrade", + )?; + + let last_successful_registry_poll_time = IntGauge::new( + "last_successful_registry_poll", + "The Unix timestamp of the last successful poll of the API boundary nodes from registry canister", + )?; + + let registry_poll_calls = CounterVec::new( + Opts::new( + "registry_poll_calls", + "Number of registry polling calls with the status and message (in case of error)", + ), + &["status", "message"], + )?; + + let stable_memory_size = Gauge::new( + "stable_memory_bytes", + "Size of the stable memory allocated by this canister in bytes.", + )?; + + // Register all metrics in the registry + registry.register(Box::new(last_salt_id.clone()))?; + registry.register(Box::new(api_boundary_nodes_count.clone()))?; + registry.register(Box::new(last_canister_change_time.clone()))?; + registry.register(Box::new(last_successful_registry_poll_time.clone()))?; + registry.register(Box::new(registry_poll_calls.clone()))?; + registry.register(Box::new(stable_memory_size.clone()))?; + + Ok(Self { + registry, + last_salt_id, + api_boundary_nodes_count, + last_canister_change_time, + last_successful_registry_poll_time, + registry_poll_calls, + stable_memory_size, + }) + } +} + +pub fn export_metrics_as_http_response() -> HttpResponse { + // Certain metrics need to be recomputed + recompute_metrics(); + + let mut buffer = vec![]; + let encoder = TextEncoder::new(); + let registry = METRICS.with(|cell| cell.borrow().registry.clone()); + let metrics_family = registry.gather(); + + match encoder.encode(&metrics_family, &mut buffer) { + Ok(()) => HttpResponseBuilder::ok() + .header("Content-Type", "text/plain") + .with_body_and_content_length(buffer) + .build(), + Err(err) => { + // Return an HTTP 500 error with detailed error information + HttpResponseBuilder::server_error(format!("Failed to encode metrics: {:?}", err)) + .build() + } + } +} + +pub fn recompute_metrics() { + METRICS.with(|cell| { + let mut cell = cell.borrow_mut(); + + let memory = (ic_cdk::api::stable::stable_size() * WASM_PAGE_SIZE_IN_BYTES) as f64; + cell.stable_memory_size.borrow_mut().set(memory); + + let api_bns_count = API_BOUNDARY_NODE_PRINCIPALS.with(|cell| cell.borrow().len()); + cell.api_boundary_nodes_count.set(api_bns_count as i64); + + if let Some(stored_salt) = SALT.with(|cell| cell.borrow().get(&())) { + cell.last_salt_id.set(stored_salt.salt_id as i64); + } + }); +} diff --git a/rs/boundary_node/salt_sharing/canister/salt_sharing_canister.did b/rs/boundary_node/salt_sharing/canister/salt_sharing_canister.did index 74530ee8d8c..43937702712 100644 --- a/rs/boundary_node/salt_sharing/canister/salt_sharing_canister.did +++ b/rs/boundary_node/salt_sharing/canister/salt_sharing_canister.did @@ -11,10 +11,12 @@ type GetSaltResponse = variant { // Comprehensive error for salt retrieval type GetSaltError = variant { + // Salt generation is still pending. Retry later + SaltNotInitialized; // Indicates an unauthorized attempt to get the salt Unauthorized; // Captures all unexpected internal errors during process - Internal: text; + Internal: text; }; // Salt response containing salt itself and additional metadata @@ -41,26 +43,20 @@ type SaltGenerationStrategy = variant { // Generates a new salt at 00:00:00 UTC on the first day of the next calendar month // Handles calendar edge cases including: transitions between months (December-January), leap years StartOfMonth; - // Generates a new salt at fixed intervals from an unspecified reference point - FixedIntervalSecs: nat64; }; // Initialization arguments used when installing/upgrading/reinstalling the canister -type InitArgs = record { +type InitArg = record { + // If true salt is regenerated immediately and subsequently based on the chosen strategy + regenerate_now: bool; // Strategy defining salt generation - // If specified: - // - salt is regenerated immediately - // - subsequent strategy is based on the variant - // If not specified: - // - preserve previously configured strategy - // - no immediate salt regeneration - salt_generation_strategy: opt SaltGenerationStrategy; + salt_generation_strategy: SaltGenerationStrategy; // Interval (in seconds) for polling API boundary node IDs from the registry // The first polling operation occurs immediately registry_polling_interval_secs: nat64; }; -service : (InitArgs) -> { +service : (InitArg) -> { // Fetches the current salt (randomly generated value to be added to data before hashing) get_salt: () -> (GetSaltResponse) query; // Canister metrics (Http Interface) diff --git a/rs/boundary_node/salt_sharing/canister/storage.rs b/rs/boundary_node/salt_sharing/canister/storage.rs new file mode 100644 index 00000000000..10619395b5f --- /dev/null +++ b/rs/boundary_node/salt_sharing/canister/storage.rs @@ -0,0 +1,53 @@ +use candid::Principal; +use ic_stable_structures::{ + memory_manager::{MemoryId, MemoryManager, VirtualMemory}, + storable::Bound, + DefaultMemoryImpl, StableBTreeMap, Storable, +}; +use serde::{Deserialize, Serialize}; +use serde_cbor::{from_slice, to_vec}; +use std::{borrow::Cow, cell::RefCell, collections::HashSet}; + +pub type Timestamp = u64; +pub const SALT_SIZE: usize = 64; + +type Memory = VirtualMemory; +pub type StableMap = StableBTreeMap; + +const MEMORY_ID_SALT: MemoryId = MemoryId::new(0); + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct StorableSalt { + // A cryptographic salt. Represents a random value to be added to input data before hashing. + pub salt: Vec, + // The timestamp (in nanoseconds) when the cryptographic salt was regenerated. + // Allows to track updates, ensuring it is refreshed periodically to maintain security. + pub salt_id: Timestamp, +} + +impl Storable for StorableSalt { + fn to_bytes(&self) -> Cow<[u8]> { + Cow::Owned(to_vec(&self).expect("StorableSalt serialization failed")) + } + + fn from_bytes(bytes: Cow<[u8]>) -> Self { + from_slice(&bytes).expect("StorableSalt deserialization failed") + } + + const BOUND: Bound = Bound::Unbounded; +} + +// Declare storage variables +// NOTE: initialization is lazy +thread_local! { + static MEMORY_MANAGER: RefCell> = + RefCell::new(MemoryManager::init(DefaultMemoryImpl::default())); + + // A cryptographic salt stored in stable memory to ensure persistence across upgrades. + pub static SALT: RefCell> = RefCell::new( + StableMap::init(MEMORY_MANAGER.with(|m| m.borrow().get(MEMORY_ID_SALT))) + ); + + // Authorized principals allowed to retrieve the salt from the canister. + pub static API_BOUNDARY_NODE_PRINCIPALS: RefCell> = RefCell::new(HashSet::new()); +} diff --git a/rs/boundary_node/salt_sharing/canister/time.rs b/rs/boundary_node/salt_sharing/canister/time.rs new file mode 100644 index 00000000000..64544b993f5 --- /dev/null +++ b/rs/boundary_node/salt_sharing/canister/time.rs @@ -0,0 +1,93 @@ +use std::time::Duration; + +use time::{Date, Month, OffsetDateTime, PrimitiveDateTime, Time}; + +fn next_month_date(current_time: OffsetDateTime) -> OffsetDateTime { + // Get the current year, month, and day. + let year = current_time.year(); + let month = current_time.month(); + + // Calculate the next month and year. + let (next_month, next_year) = if month == Month::December { + (Month::January, year + 1) + } else { + (month.next(), year) + }; + + // Create the first moment of the next month. + PrimitiveDateTime::new( + Date::from_calendar_date(next_year, next_month, 1).expect("Invalid date"), + Time::MIDNIGHT, + ) + .assume_utc() +} + +pub fn delay_till_next_month(current_time_ns: u64) -> Duration { + let current_time = OffsetDateTime::from_unix_timestamp_nanos(current_time_ns as i128) + .expect("Invalid current_time_ns value"); + let next_month = next_month_date(current_time); + (next_month - current_time).unsigned_abs() +} + +#[cfg(test)] +mod tests { + use time::{Date, UtcOffset}; + + use super::*; + + #[test] + fn test_delay_till_next_month() { + let minute_sec = 60; + let hour_sec = minute_sec * 60; + let day_sec = hour_sec * 24; + + // 27.02.2024 11:30 UTC (leap year) -> delay 2 days, 12 hours, 30 mins + let from_dt = OffsetDateTime::new_in_offset( + Date::from_calendar_date(2024, Month::February, 27).unwrap(), + Time::from_hms_nano(11, 30, 0, 0).unwrap(), + UtcOffset::from_hms(0, 0, 0).unwrap(), + ); + let time = from_dt.unix_timestamp_nanos() as u64; + let delay = delay_till_next_month(time); + assert_eq!( + delay, + Duration::from_secs(2 * day_sec + 12 * hour_sec + 30 * minute_sec) + ); + + // 27.02.2025 11:30 UTC (non-leap year) -> delay 1 day, 12 hours, 30 mins + let from_dt = OffsetDateTime::new_in_offset( + Date::from_calendar_date(2025, Month::February, 27).unwrap(), + Time::from_hms_nano(11, 30, 0, 0).unwrap(), + UtcOffset::from_hms(0, 0, 0).unwrap(), + ); + let time = from_dt.unix_timestamp_nanos() as u64; + let delay = delay_till_next_month(time); + assert_eq!( + delay, + Duration::from_secs(day_sec + 12 * hour_sec + 30 * minute_sec) + ); + + // 27.12.2024 11:35 UTC (December-January) -> delay 4 days, 12 hours, 25 mins + let from_dt = OffsetDateTime::new_in_offset( + Date::from_calendar_date(2024, Month::December, 27).unwrap(), + Time::from_hms_nano(11, 35, 0, 0).unwrap(), + UtcOffset::from_hms(0, 0, 0).unwrap(), + ); + let time = from_dt.unix_timestamp_nanos() as u64; + let delay = delay_till_next_month(time); + assert_eq!( + delay, + Duration::from_secs(4 * day_sec + 12 * hour_sec + 25 * minute_sec) + ); + // Verify that the date after delay is exactly the start of next month + let time_after_delay_ns = time + delay.as_nanos() as u64; + let dt_after_delay = + OffsetDateTime::from_unix_timestamp_nanos(time_after_delay_ns as i128).unwrap(); + let expected_dt = OffsetDateTime::new_in_offset( + Date::from_calendar_date(2025, Month::January, 1).unwrap(), + Time::from_hms_nano(0, 0, 0, 0).unwrap(), + UtcOffset::from_hms(0, 0, 0).unwrap(), + ); + assert_eq!(dt_after_delay, expected_dt); + } +} diff --git a/rs/boundary_node/salt_sharing/dfx.json b/rs/boundary_node/salt_sharing/dfx.json new file mode 100644 index 00000000000..446964a69a9 --- /dev/null +++ b/rs/boundary_node/salt_sharing/dfx.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "canisters": { + "salt_sharing": { + "type": "rust", + "package": "salt_sharing", + "candid": "canister/salt_sharing_canister.did", + "gzip": true + } + }, + "defaults": { + "build": { + "packtool": "" + } + }, + "networks": { + "local": { + "bind": "127.0.0.1:8080", + "type": "ephemeral" + } + } + } diff --git a/rs/boundary_node/salt_sharing/integration_tests/BUILD.bazel b/rs/boundary_node/salt_sharing/integration_tests/BUILD.bazel new file mode 100644 index 00000000000..27d9a3c84a3 --- /dev/null +++ b/rs/boundary_node/salt_sharing/integration_tests/BUILD.bazel @@ -0,0 +1,69 @@ +load("@rules_rust//rust:defs.bzl", "rust_library") +load("//bazel:defs.bzl", "rust_test_suite_with_extra_srcs") + +package(default_visibility = ["//visibility:public"]) + +DEPENDENCIES = [ + # Keep sorted. + "//rs/boundary_node/salt_sharing/api:salt_sharing_api", + "//rs/nervous_system/integration_tests:nervous_system_integration_tests", + "//rs/rust_canisters/http_types", + "//rs/types/base_types", + "@crate_index//:assert_matches", + "@crate_index//:candid", + "@crate_index//:chrono", + "@crate_index//:serde", + "@crate_index//:serde_json", + "@crate_index//:tokio", +] + select({ + "@rules_rust//rust/platform:wasm32-unknown-unknown": [], + "//conditions:default": [ + "//packages/pocket-ic", + "//rs/crypto/sha2", + "//rs/nns/constants", + "//rs/registry/keys", + "//rs/registry/transport", + "//rs/rust_canisters/canister_test", + "//rs/nns/test_utils:test_utils", + ], +}) + +DEV_DATA = [ + "@mainnet_nns_registry_canister//file", + "//rs/registry/canister:registry-canister", + "//rs/pocket_ic_server:pocket-ic-server", + "//rs/boundary_node/salt_sharing:salt_sharing_canister", +] + +DEV_ENV = { + "CARGO_MANIFEST_DIR": "rs/nns/integration_tests", + "REGISTRY_CANISTER_WASM_PATH": "$(rootpath //rs/registry/canister:registry-canister)", + "MAINNET_REGISTRY_CANISTER_WASM_PATH": "$(rootpath @mainnet_nns_registry_canister//file)", + "POCKET_IC_BIN": "$(rootpath //rs/pocket_ic_server:pocket-ic-server)", + "SALT_SHARING_CANISTER_WASM_PATH": "$(rootpath //rs/boundary_node/salt_sharing:salt_sharing_canister)", +} + +rust_library( + name = "salt_sharing_canister_integration_tests", + testonly = True, + srcs = glob(["src/**/*.rs"]), + aliases = {}, + crate_name = "salt_sharing_canister_integration_tests", + proc_macro_deps = [], + deps = DEPENDENCIES, +) + +rust_test_suite_with_extra_srcs( + name = "integration_tests_test", + srcs = glob( + ["tests/**/*.rs"], + ), + aliases = {}, + data = DEV_DATA, + env = DEV_ENV, + extra_srcs = [], + flaky = False, + proc_macro_deps = [], + tags = [], + deps = [":salt_sharing_canister_integration_tests"] + DEPENDENCIES, +) diff --git a/rs/boundary_node/salt_sharing/integration_tests/Cargo.toml b/rs/boundary_node/salt_sharing/integration_tests/Cargo.toml new file mode 100644 index 00000000000..62d1288df5a --- /dev/null +++ b/rs/boundary_node/salt_sharing/integration_tests/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "salt-sharing-canister-integration-tests" +version.workspace = true +authors.workspace = true +edition.workspace = true +description.workspace = true +documentation.workspace = true + +[dependencies] +salt-sharing-api = { path = "../api" } +ic-nervous-system-integration-tests = { path = "../../../nervous_system/integration_tests" } +ic-base-types = { path = "../../../types/base_types" } +ic-canisters-http-types = { path = "../../rust_canisters/http_types" } +assert_matches = { workspace = true } +candid = { workspace = true } +serde = { workspace = true } +tokio = { workspace = true } + +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +pocket-ic = { path = "../../../../packages/pocket-ic" } +ic-crypto-sha2 = { path = "../../../crypto/sha2" } +ic-nns-constants = { path = "../../../nns/constants" } +ic-registry-keys = { path = "../../../registry/keys" } +ic-registry-transport = { path = "../../../registry/transport" } +canister-test = { path = "../../../rust_canisters/canister_test" } +ic-nns-test-utils = { path = "../../../nns/test_utils" } + diff --git a/rs/boundary_node/salt_sharing/integration_tests/src/lib.rs b/rs/boundary_node/salt_sharing/integration_tests/src/lib.rs new file mode 100644 index 00000000000..6783d8618b7 --- /dev/null +++ b/rs/boundary_node/salt_sharing/integration_tests/src/lib.rs @@ -0,0 +1,14 @@ +//! Integration tests for the salt-sharing canister. +//! +//! Each test creates a PocketIc instance, installs the registry and salt-sharing canisters, and then +//! proceeds to perform operations and verify they completed successfully, and +//! that the state is the expected one. State inspection is done via the public +//! canister API. +//! +//! This is not a library at all. However, if this was under `tests/`, then each +//! file would become its own crate, and the tests would run sequentially. By +//! pretending it's a library with several modules inside, `cargo test` is +//! supposed to run all tests in parallel, because they are all in the same +//! crate. + +pub mod pocket_ic_helpers; diff --git a/rs/boundary_node/salt_sharing/integration_tests/src/pocket_ic_helpers.rs b/rs/boundary_node/salt_sharing/integration_tests/src/pocket_ic_helpers.rs new file mode 100644 index 00000000000..8cd92d55988 --- /dev/null +++ b/rs/boundary_node/salt_sharing/integration_tests/src/pocket_ic_helpers.rs @@ -0,0 +1,162 @@ +use candid::{CandidType, Decode, Encode, Principal}; +use canister_test::Project; +use canister_test::Wasm; +use ic_crypto_sha2::Sha256; +use ic_nns_constants::{REGISTRY_CANISTER_ID, ROOT_CANISTER_ID}; +use ic_nns_test_utils::common::{ + build_mainnet_registry_wasm, build_registry_wasm, NnsInitPayloadsBuilder, +}; +use ic_registry_transport::pb::v1::RegistryAtomicMutateRequest; +use pocket_ic::{management_canister::CanisterSettings, nonblocking::PocketIc, PocketIcBuilder}; +use salt_sharing_api::InitArg; +use serde::de::DeserializeOwned; + +/// Builds the WASM for the salt-sharing canister. +pub fn build_salt_sharing_wasm() -> Wasm { + Project::cargo_bin_maybe_from_env("salt-sharing-canister", &[]) +} + +pub async fn install_registry_canister( + pocket_ic: &PocketIc, + with_mainnet_nns_canister_versions: bool, + custom_initial_registry_mutations: Option>, +) { + let mut nns_init_payload_builder = NnsInitPayloadsBuilder::new(); + + if let Some(custom_initial_registry_mutations) = custom_initial_registry_mutations { + nns_init_payload_builder.with_initial_mutations(custom_initial_registry_mutations); + } else { + nns_init_payload_builder.with_initial_invariant_compliant_mutations(); + } + + let nns_init_payload = nns_init_payload_builder.build(); + + let registry_wasm = if with_mainnet_nns_canister_versions { + build_mainnet_registry_wasm() + } else { + build_registry_wasm() + }; + + ic_nervous_system_integration_tests::pocket_ic_helpers::install_canister( + pocket_ic, + "registry canister", + REGISTRY_CANISTER_ID, + Encode!(&nns_init_payload.registry).unwrap(), + registry_wasm, + Some(ROOT_CANISTER_ID.get()), + ) + .await; +} + +pub async fn install_canister( + pocket_ic: &PocketIc, + canister_name: &str, + subnet_id: Principal, + arg: Vec, + wasm: Wasm, +) -> Principal { + let memory_allocation = None; + let controllers = None; + let sender = None; + + let settings = Some(CanisterSettings { + memory_allocation, + controllers, + ..Default::default() + }); + + let canister_id = pocket_ic + .create_canister_on_subnet(sender, settings, subnet_id) + .await; + + pocket_ic + .install_canister(canister_id, wasm.bytes(), arg, sender) + .await; + + println!( + "Installed {canister_name} with canister_id = {canister_id} on subnet_id = {subnet_id}", + ); + + canister_id +} + +pub async fn get_installed_wasm_hash(pocket_ic: &PocketIc, canister_id: Principal) -> [u8; 32] { + let module_hash = pocket_ic + .canister_status(canister_id, None) + .await + .unwrap() + .module_hash + .unwrap(); + + module_hash.try_into().unwrap_or_else(|v: Vec<_>| { + panic!("Expected a Vec of length 32 but it has {} bytes.", v.len()) + }) +} + +pub async fn canister_call( + pocket_ic: &PocketIc, + method: &str, + method_type: &str, + canister_id: Principal, + sender: Principal, + payload: Vec, +) -> Result { + let result = match method_type { + "query" => pocket_ic + .query_call(canister_id, sender, method, payload) + .await + .map_err(|err| err.to_string())?, + "update" => pocket_ic + .update_call(canister_id, sender, method, payload) + .await + .map_err(|err| err.to_string())?, + _ => panic!("{method_type} is not allowed"), + }; + + let decoded: R = Decode!(&result, R).unwrap(); + + Ok(decoded) +} + +pub async fn setup_subnets_and_registry_canister() -> PocketIc { + let pocket_ic = PocketIcBuilder::new() + .with_nns_subnet() + .with_ii_subnet() + .build_async() + .await; + + // Install registry canister. It is the only canister that salt-sharing canister interacts with. + let with_mainnet_nns_canister_versions = false; + install_registry_canister(&pocket_ic, with_mainnet_nns_canister_versions, None).await; + + pocket_ic +} + +pub async fn install_salt_sharing_canister_on_ii_subnet( + pocket_ic: &PocketIc, + init_arg: InitArg, +) -> (Principal, Wasm) { + let wasm = build_salt_sharing_wasm(); + let wasm_hash = Sha256::hash(&wasm.clone().bytes()); + + let ii_subnet_id = { + let topology = pocket_ic.topology().await; + topology.get_ii().unwrap() + }; + + let canister_id = install_canister( + pocket_ic, + "salt-sharing canister", + ii_subnet_id, + Encode!(&init_arg).unwrap(), + wasm.clone(), + ) + .await; + + assert_eq!( + get_installed_wasm_hash(pocket_ic, canister_id).await, + wasm_hash, + ); + + (canister_id, wasm) +} diff --git a/rs/boundary_node/salt_sharing/integration_tests/tests/salt_sharing_canister_tests.rs b/rs/boundary_node/salt_sharing/integration_tests/tests/salt_sharing_canister_tests.rs new file mode 100644 index 00000000000..96cfb28964d --- /dev/null +++ b/rs/boundary_node/salt_sharing/integration_tests/tests/salt_sharing_canister_tests.rs @@ -0,0 +1,197 @@ +use candid::{Encode, Principal}; +use ic_canisters_http_types::{HttpRequest, HttpResponse}; +use pocket_ic::nonblocking::PocketIc; +use salt_sharing_api::{GetSaltError, GetSaltResponse, InitArg, SaltGenerationStrategy}; +use salt_sharing_canister_integration_tests::pocket_ic_helpers::{ + canister_call, install_salt_sharing_canister_on_ii_subnet, setup_subnets_and_registry_canister, +}; +use std::time::SystemTime; + +use chrono::{TimeZone, Utc}; +use std::str::FromStr; + +// Make IC progress by this (ad-hoc) number of blocks to observe the effect of the inter-canister calls and timers +const TICKS: u32 = 100; +// This metric is exposed by the canister and corresponds to a timestamp when the salt was last regenerated +const SALT_METRIC: &str = "last_salt_id"; +const UPGRADE_METRIC: &str = "last_successful_canister_upgrade"; + +#[tokio::test] +async fn main() { + let pocket_ic = setup_subnets_and_registry_canister().await; + // Set system time on the IC. + let time = SystemTime::from(Utc.with_ymd_and_hms(2024, 2, 25, 0, 0, 0).unwrap()); + pocket_ic.set_time(time).await; + // Install salt canister + let init_payload = InitArg { + regenerate_now: true, + salt_generation_strategy: SaltGenerationStrategy::StartOfMonth, + registry_polling_interval_secs: 60, + }; + let (canister_id, wasm) = + install_salt_sharing_canister_on_ii_subnet(&pocket_ic, init_payload).await; + // Check access control + let response: GetSaltResponse = canister_call( + &pocket_ic, + "get_salt", + "query", + canister_id, + Principal::anonymous(), + Encode!(&b"").unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.unwrap_err(), GetSaltError::Unauthorized); + // Check access control (inspect_message hook) + let response: Result = canister_call( + &pocket_ic, + "get_salt", + "update", + canister_id, + Principal::anonymous(), + Encode!(&b"").unwrap(), + ) + .await; + let err_msg = response.unwrap_err(); + assert!(err_msg + .contains("message_inspection_failed: method call is prohibited in the current context")); + // Initialize metrics extractor for the canister, which helps to make indirect assertions about canister state + let metrics_extractor = MetricsExtractor { + canister_id, + pocket_ic: &pocket_ic, + }; + // Salt should not be initialized immediately after canister's installation + let salt_id = metrics_extractor + .try_get_metric::(SALT_METRIC) + .await + .unwrap(); + assert_eq!(salt_id, 0); + // But once some rounds pass, salt should be initialized + tick_n_times(&pocket_ic, TICKS).await; + let salt_id = metrics_extractor + .try_get_metric::(SALT_METRIC) + .await + .unwrap(); + assert!(salt_id > 0); + // Till the very last day of the month salt should not be regenerated (note leap year) + let time = SystemTime::from(Utc.with_ymd_and_hms(2024, 2, 29, 0, 0, 0).unwrap()); + pocket_ic.set_time(time).await; + tick_n_times(&pocket_ic, TICKS).await; + let salt_id_0 = metrics_extractor + .try_get_metric::(SALT_METRIC) + .await + .unwrap(); + assert_eq!(salt_id_0, salt_id); + // But on the first calendar day of next month salt should be regenerated + let time = SystemTime::from(Utc.with_ymd_and_hms(2024, 3, 1, 0, 0, 0).unwrap()); + pocket_ic.set_time(time).await; + tick_n_times(&pocket_ic, TICKS).await; + let salt_id_1 = metrics_extractor + .try_get_metric::(SALT_METRIC) + .await + .unwrap(); + assert!(salt_id_1 > salt_id_0); + // Now we upgrade the canister without immediate salt regeneration + let canister_upgrade_time_1 = metrics_extractor + .try_get_metric::(UPGRADE_METRIC) + .await + .unwrap(); + let init_payload = InitArg { + regenerate_now: false, // do not regenerate salt immediately + salt_generation_strategy: SaltGenerationStrategy::StartOfMonth, + registry_polling_interval_secs: 60, + }; + pocket_ic + .upgrade_canister( + canister_id, + wasm.clone().bytes(), + Encode!(&init_payload).unwrap(), + None, + ) + .await + .expect("failed to upgrade canister"); + tick_n_times(&pocket_ic, TICKS).await; + let last_salt_id_upgraded = metrics_extractor + .try_get_metric::(SALT_METRIC) + .await + .unwrap(); + assert_eq!(last_salt_id_upgraded, salt_id_1); + let canister_upgrade_time_2 = metrics_extractor + .try_get_metric::(UPGRADE_METRIC) + .await + .unwrap(); + assert!(canister_upgrade_time_2 > canister_upgrade_time_1); + // Now we upgrade canister with an immediate salt regeneration + let init_payload = InitArg { + regenerate_now: true, // regenerate salt on upgrade + salt_generation_strategy: SaltGenerationStrategy::StartOfMonth, + registry_polling_interval_secs: 60, + }; + pocket_ic + .upgrade_canister( + canister_id, + wasm.bytes(), + Encode!(&init_payload).unwrap(), + None, + ) + .await + .expect("failed to upgrade canister"); + tick_n_times(&pocket_ic, TICKS).await; + let last_salt_id_upgraded = metrics_extractor + .try_get_metric::(SALT_METRIC) + .await + .unwrap(); + assert!(last_salt_id_upgraded > salt_id_1); + let canister_upgrade_time_3 = metrics_extractor + .try_get_metric::(UPGRADE_METRIC) + .await + .unwrap(); + assert!(canister_upgrade_time_3 > canister_upgrade_time_2); +} + +struct MetricsExtractor<'a> { + canister_id: Principal, + pocket_ic: &'a PocketIc, +} + +impl MetricsExtractor<'_> { + pub async fn try_get_metric(&self, pattern: &str) -> Result + where + T: FromStr, + { + let request = HttpRequest { + method: "GET".to_string(), + url: "/metrics".to_string(), + headers: vec![], + body: vec![].into(), + }; + + let response: HttpResponse = canister_call( + self.pocket_ic, + "http_request", + "query", + self.canister_id, + Principal::anonymous(), + Encode!(&request).map_err(|_| "failed to encode request".to_string())?, + ) + .await + .map_err(|_| "http request failed".to_string())?; + + let metrics = String::from_utf8_lossy(&response.body) + .lines() + .map(str::to_string) + .collect::>(); + + metrics + .into_iter() + .find(|metric| metric.starts_with(pattern)) + .and_then(|metric| metric.split_whitespace().nth(1)?.parse().ok()) + .ok_or_else(|| "metric not found".to_string()) + } +} + +async fn tick_n_times(pocket_ic: &PocketIc, n: u32) { + for _ in 0..n { + pocket_ic.tick().await; + } +} diff --git a/rs/canister_client/BUILD.bazel b/rs/canister_client/BUILD.bazel index 85ddd2fce44..26b397de8bb 100644 --- a/rs/canister_client/BUILD.bazel +++ b/rs/canister_client/BUILD.bazel @@ -18,11 +18,11 @@ package(default_visibility = [ DEPENDENCIES = [ # Keep sorted. + "//packages/ic-secp256k1", "//rs/canister_client/read_state_response_parser", "//rs/canister_client/sender", "//rs/canonical_state", "//rs/certification", - "//rs/crypto/secp256k1", "//rs/crypto/tree_hash", "//rs/protobuf", "//rs/tree_deserializer", diff --git a/rs/canister_client/Cargo.toml b/rs/canister_client/Cargo.toml index c285522c6d0..ab37bb5a0b5 100644 --- a/rs/canister_client/Cargo.toml +++ b/rs/canister_client/Cargo.toml @@ -16,11 +16,11 @@ http-body-util = { workspace = true } ic-canister-client-sender = { path = "./sender" } ic-canonical-state = { path = "../canonical_state" } ic-certification = { path = "../certification" } -ic-crypto-secp256k1 = { path = "../crypto/secp256k1" } ic-crypto-tree-hash = { path = "../crypto/tree_hash" } -ic-management-canister-types = { path = "../types/management_canister_types" } +ic-management-canister-types-private = { path = "../types/management_canister_types" } ic-protobuf = { path = "../protobuf" } ic-read-state-response-parser = { path = "./read_state_response_parser" } +ic-secp256k1 = { path = "../../packages/ic-secp256k1" } ic-types = { path = "../types/types" } itertools = { workspace = true } prost = { workspace = true } diff --git a/rs/canister_client/sender/BUILD.bazel b/rs/canister_client/sender/BUILD.bazel index 3af179d6c05..1286c742d8c 100644 --- a/rs/canister_client/sender/BUILD.bazel +++ b/rs/canister_client/sender/BUILD.bazel @@ -4,8 +4,8 @@ package(default_visibility = ["//visibility:public"]) DEPENDENCIES = [ # Keep sorted. - "//rs/crypto/ed25519", - "//rs/crypto/secp256k1", + "//packages/ic-ed25519", + "//packages/ic-secp256k1", "//rs/types/base_types", "//rs/types/types", "@crate_index//:rand", diff --git a/rs/canister_client/sender/Cargo.toml b/rs/canister_client/sender/Cargo.toml index 1a3ddbff885..bc190491ec8 100644 --- a/rs/canister_client/sender/Cargo.toml +++ b/rs/canister_client/sender/Cargo.toml @@ -8,8 +8,8 @@ documentation.workspace = true [dependencies] ic-base-types = { path = "../../types/base_types" } -ic-crypto-secp256k1 = { path = "../../crypto/secp256k1" } -ic-crypto-ed25519 = { path = "../../crypto/ed25519" } +ic-ed25519 = { path = "../../../packages/ic-ed25519" } +ic-secp256k1 = { path = "../../../packages/ic-secp256k1" } ic-types = { path = "../../types/types" } rand = { workspace = true } rand_chacha = { workspace = true } diff --git a/rs/canister_client/sender/src/lib.rs b/rs/canister_client/sender/src/lib.rs index 560b570e959..cc4f78094c6 100644 --- a/rs/canister_client/sender/src/lib.rs +++ b/rs/canister_client/sender/src/lib.rs @@ -19,9 +19,9 @@ pub type SignMessageId = Arc Result, Box(rng: &mut R) -> Self { let mut rng = ChaCha20Rng::from_seed(rng.gen()); - let key = ic_crypto_ed25519::PrivateKey::generate_using_rng(&mut rng); + let key = ic_ed25519::PrivateKey::generate_using_rng(&mut rng); Self { secret_key: key.serialize_raw(), public_key: key.public_key().serialize_raw(), @@ -41,8 +41,8 @@ impl Ed25519KeyPair { } /// Parses an Ed25519KeyPair from a PEM string. - pub fn from_pem(pem: &str) -> Result { - let key = ic_crypto_ed25519::PrivateKey::deserialize_pkcs8_pem(pem)?; + pub fn from_pem(pem: &str) -> Result { + let key = ic_ed25519::PrivateKey::deserialize_pkcs8_pem(pem)?; Ok(Ed25519KeyPair { secret_key: key.serialize_raw(), public_key: key.public_key().serialize_raw(), @@ -50,12 +50,12 @@ impl Ed25519KeyPair { } pub fn to_pem(&self) -> String { - let key = ic_crypto_ed25519::PrivateKey::deserialize_raw_32(&self.secret_key); - key.serialize_pkcs8_pem(ic_crypto_ed25519::PrivateKeyFormat::Pkcs8v2WithRingBug) + let key = ic_ed25519::PrivateKey::deserialize_raw_32(&self.secret_key); + key.serialize_pkcs8_pem(ic_ed25519::PrivateKeyFormat::Pkcs8v2WithRingBug) } pub fn sign(&self, msg: &[u8]) -> [u8; 64] { - let key = ic_crypto_ed25519::PrivateKey::deserialize_raw_32(&self.secret_key); + let key = ic_ed25519::PrivateKey::deserialize_raw_32(&self.secret_key); key.sign_message(msg) } } @@ -66,11 +66,11 @@ impl Secp256k1KeyPair { } pub fn generate(rng: &mut R) -> Self { let mut rng = ChaCha20Rng::from_seed(rng.gen()); - let sk = ic_crypto_secp256k1::PrivateKey::generate_using_rng(&mut rng); + let sk = ic_secp256k1::PrivateKey::generate_using_rng(&mut rng); let pk = sk.public_key(); Self { sk, pk } } - pub fn get_public_key(&self) -> ic_crypto_secp256k1::PublicKey { + pub fn get_public_key(&self) -> ic_secp256k1::PublicKey { self.pk.clone() } } @@ -135,9 +135,9 @@ impl Sender { pub fn from_secp256k1_keys( sk_bytes: &[u8], pk_bytes: &[u8], - ) -> Result { - let pk = ic_crypto_secp256k1::PublicKey::deserialize_sec1(pk_bytes)?; - let sk = ic_crypto_secp256k1::PrivateKey::deserialize_sec1(sk_bytes)?; + ) -> Result { + let pk = ic_secp256k1::PublicKey::deserialize_sec1(pk_bytes)?; + let sk = ic_secp256k1::PrivateKey::deserialize_sec1(sk_bytes)?; Ok(Sender::SigKeys(SigKeys::EcdsaSecp256k1(Secp256k1KeyPair { sk, pk, diff --git a/rs/canister_client/sender/src/secp256k1_conversions.rs b/rs/canister_client/sender/src/secp256k1_conversions.rs index 1f3b7897d3a..6f99fa9024a 100644 --- a/rs/canister_client/sender/src/secp256k1_conversions.rs +++ b/rs/canister_client/sender/src/secp256k1_conversions.rs @@ -4,7 +4,7 @@ use crate::Secp256k1KeyPair; impl Secp256k1KeyPair { /// Parses a secp256k1 key pair from PEM. pub fn from_pem(pem: &str) -> Result { - let sk = ic_crypto_secp256k1::PrivateKey::deserialize_rfc5915_pem(pem) + let sk = ic_secp256k1::PrivateKey::deserialize_rfc5915_pem(pem) .map_err(|e| format!("{:?}", e))?; let pk = sk.public_key(); @@ -14,7 +14,7 @@ impl Secp256k1KeyPair { /// Parses a secp256k1 key pair from DER in RFC 5915 format pub fn from_der(der: &[u8]) -> Result { - let sk = ic_crypto_secp256k1::PrivateKey::deserialize_rfc5915_der(der) + let sk = ic_secp256k1::PrivateKey::deserialize_rfc5915_der(der) .map_err(|e| format!("{:?}", e))?; let pk = sk.public_key(); diff --git a/rs/canister_client/src/agent.rs b/rs/canister_client/src/agent.rs index 09514bdcf08..f04c1b4f150 100644 --- a/rs/canister_client/src/agent.rs +++ b/rs/canister_client/src/agent.rs @@ -6,7 +6,7 @@ use crate::{ use backoff::backoff::Backoff; use ic_canister_client_sender::Sender; use ic_crypto_tree_hash::Path; -use ic_management_canister_types::{InstallCodeArgs, Method, Payload, IC_00}; +use ic_management_canister_types_private::{InstallCodeArgs, Method, Payload, IC_00}; use ic_protobuf::types::v1 as pb; use ic_read_state_response_parser::{parse_read_state_response, RequestStatus}; use ic_types::{ diff --git a/rs/canister_client/src/cbor.rs b/rs/canister_client/src/cbor.rs index e21b19332cf..170e87a8df5 100644 --- a/rs/canister_client/src/cbor.rs +++ b/rs/canister_client/src/cbor.rs @@ -293,7 +293,7 @@ mod tests { // Set up an arbitrary legal input let (sk, pk) = { let mut rng = ChaChaRng::seed_from_u64(89_u64); - let sk = ic_crypto_secp256k1::PrivateKey::generate_using_rng(&mut rng); + let sk = ic_secp256k1::PrivateKey::generate_using_rng(&mut rng); let pk = sk.public_key(); (sk, pk) }; @@ -412,7 +412,7 @@ mod tests { // Set up an arbitrary legal input let (sk, pk) = { let mut rng = ChaChaRng::seed_from_u64(89_u64); - let sk = ic_crypto_secp256k1::PrivateKey::generate_using_rng(&mut rng); + let sk = ic_secp256k1::PrivateKey::generate_using_rng(&mut rng); let pk = sk.public_key(); (sk, pk) }; diff --git a/rs/canister_sandbox/Cargo.toml b/rs/canister_sandbox/Cargo.toml index bab3c711f6a..fd0f44a6ba7 100644 --- a/rs/canister_sandbox/Cargo.toml +++ b/rs/canister_sandbox/Cargo.toml @@ -46,7 +46,7 @@ threadpool = { workspace = true } which = "4.2.2" [dev-dependencies] -ic-management-canister-types = { path = "../types/management_canister_types" } +ic-management-canister-types-private = { path = "../types/management_canister_types" } ic-registry-routing-table = { path = "../registry/routing_table" } ic-test-utilities = { path = "../test_utilities" } # This makes the dependencies of the binary more consistent diff --git a/rs/canister_sandbox/src/protocol/ctlsvc.rs b/rs/canister_sandbox/src/protocol/ctlsvc.rs index a23ba95830b..c88ea113f35 100644 --- a/rs/canister_sandbox/src/protocol/ctlsvc.rs +++ b/rs/canister_sandbox/src/protocol/ctlsvc.rs @@ -68,7 +68,7 @@ mod tests { }; use ic_replicated_state::{Global, NumWasmPages, PageMap}; use ic_system_api::sandbox_safe_system_state::SystemStateModifications; - use ic_types::{ingress::WasmResult, CanisterLog, NumBytes, NumInstructions}; + use ic_types::{ingress::WasmResult, NumBytes, NumInstructions}; use crate::protocol::{ ctlsvc::{ExecutionFinishedReply, ExecutionPausedReply, ExecutionPausedRequest, Reply}, @@ -105,7 +105,6 @@ mod tests { allocated_message_bytes: NumBytes::new(2000), instance_stats: InstanceStats::default(), system_api_call_counters: SystemApiCallCounters::default(), - canister_log: CanisterLog::default(), }, state: StateModifications { execution_state_modifications: Some(ExecutionStateModifications { diff --git a/rs/canister_sandbox/src/replica_controller/sandboxed_execution_controller.rs b/rs/canister_sandbox/src/replica_controller/sandboxed_execution_controller.rs index 127281459d5..6c2a2561ec4 100644 --- a/rs/canister_sandbox/src/replica_controller/sandboxed_execution_controller.rs +++ b/rs/canister_sandbox/src/replica_controller/sandboxed_execution_controller.rs @@ -286,7 +286,7 @@ impl SandboxedExecutionMetrics { sandboxed_execution_executed_message_slices: metrics_registry.int_counter_vec( "sandboxed_execution_executed_message_slices_total", "Number of executed message slices by type and status.", - &["api_type", "status"], + &["api_type", "status", "wasm_execution_mode"], ), sandboxed_execution_instructions_left_error: metrics_registry.error_counter("sandboxed_execution_invalid_instructions_left"), } @@ -299,9 +299,14 @@ impl SandboxedExecutionMetrics { } /// Helper function to observe executed message slices. - fn observe_executed_message_slice(&self, api_type_label: &str, execution_status: &str) { + fn observe_executed_message_slice( + &self, + api_type_label: &str, + execution_status: &str, + wasm_execution_mode: &str, + ) { self.sandboxed_execution_executed_message_slices - .with_label_values(&[api_type_label, execution_status]) + .with_label_values(&[api_type_label, execution_status, wasm_execution_mode]) .inc(); } } @@ -755,8 +760,11 @@ impl WasmExecutor for SandboxedExecutionController { ) { Ok((wasm_id, compilation_result)) => (wasm_id, compilation_result), Err(err) => { - self.metrics - .observe_executed_message_slice(api_type_label, err.as_str()); + self.metrics.observe_executed_message_slice( + api_type_label, + err.as_str(), + execution_state.wasm_execution_mode.as_str(), + ); return (None, wasm_execution_error(err, message_instruction_limit)); } }; @@ -1508,8 +1516,11 @@ impl SandboxedExecutionController { let mut exec_output = match result { CompletionResult::Paused(slice) => { execution_tracing.observe_slice(&slice, execution_start.elapsed()); - self.metrics - .observe_executed_message_slice(api_type_label, "Paused"); + self.metrics.observe_executed_message_slice( + api_type_label, + "Paused", + execution_state.wasm_execution_mode.as_str(), + ); let paused = Box::new(PausedSandboxExecution { canister_id, sandbox_process, @@ -1530,8 +1541,11 @@ impl SandboxedExecutionController { Ok(None) => "NoResponse", Err(e) => e.as_str(), }; - self.metrics - .observe_executed_message_slice(api_type_label, execution_status); + self.metrics.observe_executed_message_slice( + api_type_label, + execution_status, + execution_state.wasm_execution_mode.as_str(), + ); exec_output } }; @@ -1580,11 +1594,6 @@ impl SandboxedExecutionController { canister_id: CanisterId, sandbox_process: Arc, ) -> CanisterStateChanges { - // If the execution has failed, then we don't apply any changes. - if exec_output.wasm.wasm_result.is_err() { - return CanisterStateChanges::default(); - } - let StateModifications { execution_state_modifications, system_state_modifications, diff --git a/rs/canister_sandbox/src/sandbox_manager.rs b/rs/canister_sandbox/src/sandbox_manager.rs index 2cd78be9028..6f500dd39e9 100644 --- a/rs/canister_sandbox/src/sandbox_manager.rs +++ b/rs/canister_sandbox/src/sandbox_manager.rs @@ -31,7 +31,7 @@ use ic_embedders::{ SerializedModuleBytes, WasmtimeEmbedder, }; use ic_interfaces::execution_environment::{ - ExecutionMode, HypervisorError, HypervisorResult, WasmExecutionOutput, + ExecutionMode, HypervisorError, HypervisorResult, SystemApi, WasmExecutionOutput, }; use ic_logger::ReplicaLogger; use ic_replicated_state::{ @@ -135,10 +135,9 @@ impl Execution { allocated_message_bytes, instance_stats, system_api_call_counters, - canister_log, }, deltas, - instance_or_system_api, + mut instance_or_system_api, ) = ic_embedders::wasm_executor::process( exec_input.func_ref, exec_input.api_type, @@ -157,25 +156,24 @@ impl Execution { Rc::new(out_of_instructions_handler), ); + let system_api = match &mut instance_or_system_api { + // Here we use `store_data_mut` instead of + // `into_store_data` because the later will drop the + // wasmtime Instance which can be an expensive + // operation. Mutating the store instead allows us + // to delay the drop until after the execution + // completed message is sent back to the main + // process. + Ok(instance) => instance + .store_data_mut() + .system_api_mut() + .expect("System api not present in the wasmtime instance"), + Err(system_api) => system_api, + }; + match wasm_result { Ok(_) => { let state_modifications = { - let system_state_modifications = match instance_or_system_api { - // Here we use `store_data_mut` instead of - // `into_store_data` because the later will drop the - // wasmtime Instance which can be an expensive - // operation. Mutating the store instead allows us - // to delay the drop until after the execution - // completed message is sent back to the main - // process. - Ok(mut instance) => instance - .store_data_mut() - .system_api_mut() - .expect("System api not present in the wasmtime instance") - .take_system_state_modifications(), - Err(system_api) => system_api.into_system_state_modifications(), - }; - let execution_state_modifications = deltas.map( |WasmStateChanges { dirty_page_indices, @@ -193,7 +191,7 @@ impl Execution { StateModifications { execution_state_modifications, - system_state_modifications, + system_state_modifications: system_api.take_system_state_modifications(), } }; if state_modifications.execution_state_modifications.is_some() { @@ -209,7 +207,6 @@ impl Execution { num_instructions_left, instance_stats, system_api_call_counters, - canister_log, }; self.sandbox_manager.controller.execution_finished( protocol::ctlsvc::ExecutionFinishedRequest { @@ -229,6 +226,11 @@ impl Execution { // was aborted and the controller removed `exec_id` on its side. } Err(err) => { + // Set the execution error in the system API to capture cases + // where the Wasm execution trapped outside of the system API. + // This is important to ensure that the proper state modifications + // are extracted from the system API. + system_api.set_execution_error(err.clone()); let wasm_output = WasmExecutionOutput { wasm_result: Err(err), num_instructions_left, @@ -236,7 +238,6 @@ impl Execution { allocated_message_bytes, instance_stats, system_api_call_counters, - canister_log, }; self.sandbox_manager.controller.execution_finished( @@ -245,7 +246,13 @@ impl Execution { exec_output: SandboxExecOutput { slice, wasm: wasm_output, - state: StateModifications::default(), + // If the execution resulted in an error, we only want to persist + // the system state modifications. + state: StateModifications { + execution_state_modifications: None, + system_state_modifications: system_api + .take_system_state_modifications(), + }, execute_total_duration: total_timer.elapsed(), execute_run_duration: run_timer.elapsed(), }, diff --git a/rs/canonical_state/Cargo.toml b/rs/canonical_state/Cargo.toml index 0a8355a4a94..3e2e1a8d9a4 100644 --- a/rs/canonical_state/Cargo.toml +++ b/rs/canonical_state/Cargo.toml @@ -30,7 +30,7 @@ assert_matches = { workspace = true } hex = { workspace = true } ic-canonical-state-tree-hash-test-utils = { path = "tree_hash/test_utils" } ic-crypto-sha2 = { path = "../crypto/sha2/" } -ic-management-canister-types = { path = "../types/management_canister_types" } +ic-management-canister-types-private = { path = "../types/management_canister_types" } ic-registry-subnet-features = { path = "../registry/subnet_features" } ic-sys = { path = "../sys" } ic-test-utilities-state = { path = "../test_utilities/state" } diff --git a/rs/canonical_state/src/encoding/tests/compatibility.rs b/rs/canonical_state/src/encoding/tests/compatibility.rs index c451d085f61..c25f417b765 100644 --- a/rs/canonical_state/src/encoding/tests/compatibility.rs +++ b/rs/canonical_state/src/encoding/tests/compatibility.rs @@ -11,7 +11,7 @@ use crate::{all_supported_versions, encoding::*, CertificationVersion}; use assert_matches::assert_matches; use ic_error_types::RejectCode; -use ic_management_canister_types::{ +use ic_management_canister_types_private::{ EcdsaCurve, EcdsaKeyId, MasterPublicKeyId, SchnorrAlgorithm, SchnorrKeyId, }; use ic_registry_subnet_type::SubnetType; diff --git a/rs/config/src/embedders.rs b/rs/config/src/embedders.rs index 837f62f5cbb..c6767a5f4d5 100644 --- a/rs/config/src/embedders.rs +++ b/rs/config/src/embedders.rs @@ -4,7 +4,7 @@ use ic_base_types::NumBytes; use ic_registry_subnet_type::SubnetType; use ic_sys::PAGE_SIZE; use ic_types::{ - NumInstructions, NumOsPages, MAX_STABLE_MEMORY_IN_BYTES, MAX_WASM64_MEMORY_IN_BYTES, + NumInstructions, NumOsPages, SubnetId, MAX_STABLE_MEMORY_IN_BYTES, MAX_WASM64_MEMORY_IN_BYTES, MAX_WASM_MEMORY_IN_BYTES, }; use serde::{Deserialize, Serialize}; @@ -100,7 +100,48 @@ const STABLE_MEMORY_ACCESSED_PAGE_LIMIT_QUERY: NumOsPages = /// also used as the maximum size for the Wasm chunk store of each canister. pub const WASM_MAX_SIZE: NumBytes = NumBytes::new(100 * 1024 * 1024); // 100 MiB -#[derive(Copy, Clone, Eq, PartialEq, Debug, Deserialize, Serialize)] +/// Best-effort responses feature rollout stage. +/// +/// The intent is to incrementally release the feature, first to a limited +/// subset of subnets; then to all application subnets; and finally everywhere; +/// by rolling forward one stage at a time. Rolling back is also supported, +/// including directly to stage 1. +/// +/// Subnets where the feature is disabled silently fall back to guaranteed +/// response calls; and best-effort requests to these subnets are rejected +/// before routing. We choose this over trapping in order to avoid breaking +/// canisters that have started using best-effort calls in case of a roll back. +// +// TODO(MR-649): Drop this once best-effort responses are fully rolled out. +#[derive(Clone, Eq, PartialEq, Debug, Deserialize, Serialize)] +pub enum BestEffortResponsesFeature { + /// Stage 1: Feature is enabled on specific subnets subnets only. Other subnets + /// fall back to guaranteed responses; and best-effort requests to these subnets + /// are rejected before routing. + SpecificSubnets(Vec), + + /// Stage 2: Feature is enabled on application (and verified application) + /// subnets only. System subnets fall back to guaranteed responses; and + /// best-effort requests to system subnets are rejected before routing. + ApplicationSubnetsOnly, + + /// Stage 3: Feature is enabled on all subnets. + Enabled, +} + +impl BestEffortResponsesFeature { + /// Returns `true` if the feature is enabled on the given subnet, having the + /// given subnet type. + pub fn is_enabled_on(&self, subnet_id: &SubnetId, subnet_type: SubnetType) -> bool { + match self { + BestEffortResponsesFeature::SpecificSubnets(subnets) => subnets.contains(subnet_id), + BestEffortResponsesFeature::ApplicationSubnetsOnly => subnet_type != SubnetType::System, + BestEffortResponsesFeature::Enabled => true, + } + } +} + +#[derive(Clone, Eq, PartialEq, Debug, Deserialize, Serialize)] pub struct FeatureFlags { /// If this flag is enabled, then the output of the `debug_print` system-api /// call will be skipped based on heuristics. @@ -110,32 +151,34 @@ pub struct FeatureFlags { pub wasm_native_stable_memory: FlagStatus, /// Indicates whether the support for 64 bit main memory is enabled pub wasm64: FlagStatus, - // TODO(IC-1674): remove this flag once the feature is enabled by default. - /// Indicates whether the best-effort responses feature is enabled. - pub best_effort_responses: FlagStatus, + /// Rollout stage of the best-effort responses feature. + pub best_effort_responses: BestEffortResponsesFeature, /// Collect a backtrace from the canister when it panics. pub canister_backtrace: FlagStatus, } -impl FeatureFlags { - const fn const_default() -> Self { +impl Default for FeatureFlags { + fn default() -> Self { + use ic_types::PrincipalId; + use std::str::FromStr; + let subnet_id = |id_str: &str| SubnetId::new(PrincipalId::from_str(id_str).unwrap()); + let enabled_subnets = vec![ + subnet_id("eq6en-6jqla-fbu5s-daskr-h6hx2-376n5-iqabl-qgrng-gfqmv-n3yjr-mqe"), + subnet_id("2fq7c-slacv-26cgz-vzbx2-2jrcs-5edph-i5s2j-tck77-c3rlz-iobzx-mqe"), + subnet_id("4zbus-z2bmt-ilreg-xakz4-6tyre-hsqj4-slb4g-zjwqo-snjcc-iqphi-3qe"), + ]; + Self { rate_limiting_of_debug_prints: FlagStatus::Enabled, write_barrier: FlagStatus::Disabled, wasm_native_stable_memory: FlagStatus::Enabled, wasm64: FlagStatus::Enabled, - best_effort_responses: FlagStatus::Disabled, + best_effort_responses: BestEffortResponsesFeature::SpecificSubnets(enabled_subnets), canister_backtrace: FlagStatus::Enabled, } } } -impl Default for FeatureFlags { - fn default() -> Self { - Self::const_default() - } -} - #[derive(Copy, Clone, Eq, PartialEq, Debug, Deserialize, Serialize)] pub enum MeteringType { New, @@ -256,7 +299,7 @@ pub struct Config { } impl Config { - pub const fn new() -> Self { + pub fn new() -> Self { Config { query_execution_threads_per_canister: QUERY_EXECUTION_THREADS_PER_CANISTER, max_globals: MAX_GLOBALS, @@ -268,7 +311,7 @@ impl Config { cost_to_compile_wasm_instruction: DEFAULT_COST_TO_COMPILE_WASM_INSTRUCTION, num_rayon_compilation_threads: DEFAULT_WASMTIME_RAYON_COMPILATION_THREADS, num_rayon_page_allocator_threads: DEFAULT_PAGE_ALLOCATOR_THREADS, - feature_flags: FeatureFlags::const_default(), + feature_flags: FeatureFlags::default(), metering_type: MeteringType::New, stable_memory_dirty_page_limit: StableMemoryPageLimit { message: STABLE_MEMORY_DIRTY_PAGE_LIMIT_MESSAGE, @@ -302,3 +345,38 @@ impl Default for Config { Self::new() } } + +#[cfg(test)] +mod tests { + use super::*; + use ic_types::PrincipalId; + + const SUBNET_1: SubnetId = SubnetId::new(PrincipalId::new(1, [1; 29])); + const SUBNET_2: SubnetId = SubnetId::new(PrincipalId::new(1, [2; 29])); + + #[test] + fn test_best_effort_responses_feature_specific_subnets() { + let best_effort_responses = BestEffortResponsesFeature::SpecificSubnets(vec![SUBNET_1]); + + assert!(best_effort_responses.is_enabled_on(&SUBNET_1, SubnetType::Application)); + assert!(best_effort_responses.is_enabled_on(&SUBNET_1, SubnetType::System)); + assert!(!best_effort_responses.is_enabled_on(&SUBNET_2, SubnetType::Application)); + assert!(!best_effort_responses.is_enabled_on(&SUBNET_2, SubnetType::System)); + } + + #[test] + fn test_best_effort_responses_feature_application_subnets_only() { + let best_effort_responses = BestEffortResponsesFeature::ApplicationSubnetsOnly; + + assert!(best_effort_responses.is_enabled_on(&SUBNET_1, SubnetType::Application)); + assert!(!best_effort_responses.is_enabled_on(&SUBNET_1, SubnetType::System)); + } + + #[test] + fn test_best_effort_responses_feature_enabled() { + let best_effort_responses = BestEffortResponsesFeature::Enabled; + + assert!(best_effort_responses.is_enabled_on(&SUBNET_1, SubnetType::Application)); + assert!(best_effort_responses.is_enabled_on(&SUBNET_1, SubnetType::System)); + } +} diff --git a/rs/config/src/execution_environment.rs b/rs/config/src/execution_environment.rs index 84636d07e8f..c504bb03809 100644 --- a/rs/config/src/execution_environment.rs +++ b/rs/config/src/execution_environment.rs @@ -31,7 +31,7 @@ const SUBNET_MEMORY_CAPACITY: NumBytes = NumBytes::new(TIB); /// Guaranteed response message memory usage is calculated as the total size of /// enqueued guaranteed responses; plus the maximum allowed response size per /// reserved guaranteed response slot. -const SUBNET_GUARANTEED_RESPONSE_MESSAGE_MEMORY_CAPACITY: NumBytes = NumBytes::new(25 * GIB); +const SUBNET_GUARANTEED_RESPONSE_MESSAGE_MEMORY_CAPACITY: NumBytes = NumBytes::new(15 * GIB); /// The limit on how much memory may be used by all guaranteed response messages /// on a given subnet at the end of a round. @@ -317,10 +317,6 @@ pub struct Config { /// - let `halfway_to_max = (memory_usage + 4GiB) / 2` /// - use the maximum of `default_wasm_memory_limit` and `halfway_to_max`. pub default_wasm_memory_limit: NumBytes, - - // TODO(EXC-1678): remove after release. - /// Feature flag to enable/disable allowed viewers for canister log visibility. - pub allowed_viewers_feature: FlagStatus, } impl Default for Config { @@ -398,7 +394,6 @@ impl Default for Config { dirty_page_logging: FlagStatus::Disabled, max_canister_http_requests_in_flight: MAX_CANISTER_HTTP_REQUESTS_IN_FLIGHT, default_wasm_memory_limit: DEFAULT_WASM_MEMORY_LIMIT, - allowed_viewers_feature: FlagStatus::Enabled, } } } diff --git a/rs/config/src/state_manager.rs b/rs/config/src/state_manager.rs index 9de0c1bcca7..9ac2a2e1c56 100644 --- a/rs/config/src/state_manager.rs +++ b/rs/config/src/state_manager.rs @@ -4,8 +4,6 @@ use std::path::PathBuf; #[derive(Clone, Eq, PartialEq, Debug, Deserialize, Serialize)] pub struct LsmtConfig { - /// Whether LSMT is enabled or not. - pub lsmt_status: FlagStatus, /// Number of pages per shard in sharded overlays; u64::MAX if unlimited. pub shard_num_pages: u64, } @@ -47,7 +45,6 @@ fn file_backed_memory_allocator_default() -> FlagStatus { pub fn lsmt_config_default() -> LsmtConfig { LsmtConfig { - lsmt_status: FlagStatus::Enabled, // 40GiB // DO NOT CHANGE after LSMT is enabled, as it would crash the new replica trying to merge // old data. diff --git a/rs/consensus/Cargo.toml b/rs/consensus/Cargo.toml index 38bee84bf8a..c12dd9f3f39 100644 --- a/rs/consensus/Cargo.toml +++ b/rs/consensus/Cargo.toml @@ -21,7 +21,7 @@ ic-interfaces-registry = { path = "../interfaces/registry" } ic-interfaces-state-manager = { path = "../interfaces/state_manager" } ic-limits = { path = "../limits" } ic-logger = { path = "../monitoring/logger" } -ic-management-canister-types = { path = "../types/management_canister_types" } +ic-management-canister-types-private = { path = "../types/management_canister_types" } ic-metrics = { path = "../monitoring/metrics" } ic-protobuf = { path = "../protobuf" } ic-registry-client-helpers = { path = "../registry/helpers" } diff --git a/rs/consensus/benches/validate_payload.rs b/rs/consensus/benches/validate_payload.rs index db2b14d1507..babddccd7c9 100644 --- a/rs/consensus/benches/validate_payload.rs +++ b/rs/consensus/benches/validate_payload.rs @@ -32,7 +32,7 @@ use ic_interfaces_state_manager::{CertificationScope, StateManager}; use ic_interfaces_state_manager_mocks::MockStateManager; use ic_limits::MAX_INGRESS_TTL; use ic_logger::replica_logger::no_op_logger; -use ic_management_canister_types::IC_00; +use ic_management_canister_types_private::IC_00; use ic_metrics::MetricsRegistry; use ic_protobuf::types::v1 as pb; use ic_registry_subnet_type::SubnetType; diff --git a/rs/consensus/dkg/BUILD.bazel b/rs/consensus/dkg/BUILD.bazel index 0f5a9ae42c0..80f2f49819a 100644 --- a/rs/consensus/dkg/BUILD.bazel +++ b/rs/consensus/dkg/BUILD.bazel @@ -13,6 +13,7 @@ DEPENDENCIES = [ "//rs/protobuf", "//rs/registry/helpers", "//rs/replicated_state", + "//rs/types/management_canister_types", "//rs/types/types", "@crate_index//:prometheus", "@crate_index//:rayon", @@ -23,7 +24,11 @@ DEV_DEPENDENCIES = [ # Keep sorted. "//rs/artifact_pool", "//rs/consensus/mocks", + "//rs/crypto/temp_crypto", "//rs/crypto/test_utils/ni-dkg", + "//rs/interfaces/registry/mocks", + "//rs/registry/keys", + "//rs/registry/subnet_features", "//rs/test_utilities", "//rs/test_utilities/artifact_pool", "//rs/test_utilities/consensus", @@ -31,6 +36,7 @@ DEV_DEPENDENCIES = [ "//rs/test_utilities/registry", "//rs/test_utilities/state", "//rs/test_utilities/types", + "@crate_index//:prost", ] rust_library( diff --git a/rs/consensus/dkg/Cargo.toml b/rs/consensus/dkg/Cargo.toml index 6d21a754f2a..857873abc1d 100644 --- a/rs/consensus/dkg/Cargo.toml +++ b/rs/consensus/dkg/Cargo.toml @@ -12,6 +12,7 @@ ic-interfaces = { path = "../../interfaces" } ic-interfaces-registry = { path = "../../interfaces/registry" } ic-interfaces-state-manager = { path = "../../interfaces/state_manager" } ic-logger = { path = "../../monitoring/logger" } +ic-management-canister-types-private = { path = "../../types/management_canister_types" } ic-metrics = { path = "../../monitoring/metrics" } ic-protobuf = { path = "../../protobuf" } ic-registry-client-helpers = { path = "../../registry/helpers" } @@ -22,10 +23,16 @@ slog = { workspace = true } rayon = { workspace = true } [dev-dependencies] + +ic-interfaces-registry-mocks = { path = "../../interfaces/registry/mocks" } +ic-test-artifact-pool = { path = "../../test_utilities/artifact_pool" } +prost = { workspace = true } ic-artifact-pool = { path = "../../artifact_pool" } ic-consensus-mocks = { path = "../mocks" } ic-crypto-test-utils-ni-dkg = { path = "../../crypto/test_utils/ni-dkg" } -ic-test-artifact-pool = { path = "../../test_utilities/artifact_pool" } +ic-crypto-temp-crypto = { path = "../../crypto/temp_crypto" } +ic-registry-keys = { path = "../../registry/keys" } +ic-registry-subnet-features = { path = "../../registry/subnet_features" } ic-test-utilities = { path = "../../test_utilities" } ic-test-utilities-consensus = { path = "../../test_utilities/consensus" } ic-test-utilities-logger = { path = "../../test_utilities/logger" } diff --git a/rs/consensus/dkg/src/dkg_key_manager.rs b/rs/consensus/dkg/src/dkg_key_manager.rs index 38b516876bf..5bb7bf33248 100644 --- a/rs/consensus/dkg/src/dkg_key_manager.rs +++ b/rs/consensus/dkg/src/dkg_key_manager.rs @@ -483,8 +483,7 @@ impl DkgKeyManager { .consensus_membership_registry_version .set(summary.registry_version.get() as i64); - for tag in [NiDkgTag::LowThreshold, NiDkgTag::HighThreshold].iter() { - let current_transcript = summary.current_transcript(tag).unwrap(); + for (tag, current_transcript) in summary.current_transcripts() { let metric_label = &format!("{:?}", tag); self.metrics diff --git a/rs/consensus/dkg/src/lib.rs b/rs/consensus/dkg/src/lib.rs index 523a567fbb4..15f1f0e69cf 100644 --- a/rs/consensus/dkg/src/lib.rs +++ b/rs/consensus/dkg/src/lib.rs @@ -5,9 +5,9 @@ use ic_consensus_utils::{bouncer_metrics::BouncerMetrics, crypto::ConsensusCrypto}; use ic_interfaces::{ consensus_pool::ConsensusPoolCache, - crypto::ErrorReproducibility, dkg::{ChangeAction, DkgPool, Mutations}, p2p::consensus::{Bouncer, BouncerFactory, BouncerValue, PoolMutationsProducer}, + validation::ValidationResult, }; use ic_logger::{error, info, ReplicaLogger}; use ic_metrics::{ @@ -17,11 +17,12 @@ use ic_metrics::{ use ic_types::{ consensus::dkg::{DealingContent, DkgMessageId, Message}, crypto::{ - threshold_sig::ni_dkg::{config::NiDkgConfig, NiDkgId, NiDkgTag, NiDkgTargetSubnet}, + threshold_sig::ni_dkg::{config::NiDkgConfig, NiDkgId, NiDkgTargetSubnet}, Signed, }, Height, NodeId, ReplicaVersion, }; +use payload_validator::PayloadValidationError; use prometheus::Histogram; use rayon::prelude::*; use std::{ @@ -54,9 +55,6 @@ const MAX_REMOTE_DKG_ATTEMPTS: u32 = 5; // Generic error string for failed remote DKG requests. const REMOTE_DKG_REPEATED_FAILURE_ERROR: &str = "Attempts to run this DKG repeatedly failed"; -// Currently we assume that we run DKGs for all of these tags. -const TAGS: [NiDkgTag; 2] = [NiDkgTag::LowThreshold, NiDkgTag::HighThreshold]; - struct Metrics { on_state_change_duration: Histogram, on_state_change_processed: Histogram, @@ -233,15 +231,6 @@ impl DkgImpl { return Mutations::new(); } - // If the dealing comes from a non-dealer, reject it. - if !config.dealers().get().contains(dealer_id) { - return get_handle_invalid_change_action( - message, - format!("Replica with Id={:?} is not a dealer.", dealer_id), - ) - .into(); - } - // If we already have a dealing from this dealer, we simply remove the // message from the pool. Multiple distinguishable valid dealings can be // created by an honest node because dkg dealings are not deterministic, @@ -252,49 +241,46 @@ impl DkgImpl { return Mutations::from(ChangeAction::RemoveFromUnvalidated((*message).clone())); } - // Verify the signature and reject if it's invalid, or skip, if there was an error. - match self.crypto.verify(message, config.registry_version()) { - Ok(()) => (), - Err(err) if err.is_reproducible() => { - return get_handle_invalid_change_action( - message, - format!("Invalid signature: {}", err), - ) - .into() - } - Err(err) => { - error!( - self.logger, - "Couldn't verify the signature of a DKG dealing: {}", err - ); - - return Mutations::new(); - } - } - // Verify the dealing and move to validated if it was successful, // reject, if it was rejected, or skip, if there was an error. - match ic_interfaces::crypto::NiDkgAlgorithm::verify_dealing( - &*self.crypto, - config, - *dealer_id, - &message.content.dealing, - ) { + match crypto_validate_dealing(&*self.crypto, config, message) { Ok(()) => ChangeAction::MoveToValidated((*message).clone()).into(), - Err(err) if err.is_reproducible() => get_handle_invalid_change_action( + Err(PayloadValidationError::InvalidArtifact(err)) => get_handle_invalid_change_action( message, - format!("Dealing verification failed: {}", err), + format!("Dealing verification failed: {:?}", err), ) .into(), - Err(err) => { - error!(self.logger, "Couldn't verify a DKG dealing: {}", err); - + Err(PayloadValidationError::ValidationFailed(err)) => { + error!( + self.logger, + "Couldn't verify a DKG dealing from the pool: {:?}", err + ); Mutations::new() } } } } +/// Validate the signature and dealing of the given message against its config +pub(crate) fn crypto_validate_dealing( + crypto: &dyn ConsensusCrypto, + config: &NiDkgConfig, + message: &Message, +) -> ValidationResult { + let dealer = message.signature.signer; + if !config.dealers().get().contains(&dealer) { + return Err(InvalidDkgPayloadReason::InvalidDealer(dealer).into()); + } + crypto.verify(message, config.registry_version())?; + ic_interfaces::crypto::NiDkgAlgorithm::verify_dealing( + crypto, + config, + dealer, + &message.content.dealing, + )?; + Ok(()) +} + fn contains_dkg_messages(dkg_pool: &dyn DkgPool, config: &NiDkgConfig, replica_id: NodeId) -> bool { dkg_pool.get_validated().any(|message| { &message.content.dkg_id == config.dkg_id() && message.signature.signer == replica_id @@ -410,6 +396,7 @@ impl BouncerFactory for DkgBouncer { #[cfg(test)] mod tests { use super::{test_utils::complement_state_manager_with_remote_dkg_requests, *}; + use core::panic; use ic_artifact_pool::dkg_pool::DkgPoolImpl; use ic_consensus_mocks::{ dependencies, dependencies_with_subnet_params, @@ -421,7 +408,9 @@ mod tests { p2p::consensus::{MutablePool, UnvalidatedArtifact}, }; use ic_interfaces_registry::RegistryClient; + use ic_management_canister_types_private::{MasterPublicKeyId, VetKdCurve, VetKdKeyId}; use ic_metrics::MetricsRegistry; + use ic_registry_subnet_features::{ChainKeyConfig, KeyConfig}; use ic_test_artifact_pool::consensus_pool::TestConsensusPool; use ic_test_utilities::crypto::CryptoReturningOk; use ic_test_utilities_logger::with_test_replica_logger; @@ -429,11 +418,14 @@ mod tests { use ic_test_utilities_types::ids::{node_test_id, subnet_test_id}; use ic_types::{ consensus::{Block, BlockPayload}, - crypto::threshold_sig::ni_dkg::{NiDkgDealing, NiDkgId, NiDkgTargetId, NiDkgTargetSubnet}, + crypto::threshold_sig::ni_dkg::{ + NiDkgDealing, NiDkgId, NiDkgMasterPublicKeyId, NiDkgTargetId, NiDkgTargetSubnet, + }, time::UNIX_EPOCH, RegistryVersion, ReplicaVersion, }; use std::{collections::BTreeSet, convert::TryFrom}; + use utils::{tags_iter, vetkd_key_ids_for_subnet}; #[test] // In this test we test the creation of dealing payloads. @@ -444,6 +436,7 @@ mod tests { let dkg_interval_len = 30; let subnet_id = subnet_test_id(222); let initial_registry_version = 112; + let vet_key_ids = vec![NiDkgMasterPublicKeyId::VetKd(test_vet_key())]; let Dependencies { crypto, mut pool, @@ -456,6 +449,7 @@ mod tests { initial_registry_version, SubnetRecordBuilder::from(&nodes) .with_dkg_interval_length(dkg_interval_len) + .with_chain_key_config(test_vet_key_config()) .build(), )], ); @@ -473,13 +467,13 @@ mod tests { logger.clone(), ); - // Creates two dealings for both thresholds and add them to the pool. + // Creates dealings for both thresholds and vet key and add them to the pool. sync_dkg_key_manager(&dkg_key_manager, &pool); let change_set = dkg.on_state_change(&*dkg_pool.read().unwrap()); - assert_eq!(change_set.len(), 2); + assert_eq!(change_set.len(), 3); dkg_pool.write().unwrap().apply(change_set); - // Advance the consensus pool for one round and make sure both dealings made it + // Advance the consensus pool for one round and make sure all dealings made it // into the block. pool.advance_round_normal_operation(); let block = pool.get_cache().finalized_block(); @@ -491,10 +485,10 @@ mod tests { dealings.start_height ) } - assert_eq!(dealings.messages.len(), 2); - for tag in &TAGS { + assert_eq!(dealings.messages.len(), 3); + for tag in tags_iter(&vet_key_ids) { assert!(dealings.messages.iter().any( - |m| m.signature.signer == replica_1 && m.content.dkg_id.dkg_tag == *tag + |m| m.signature.signer == replica_1 && m.content.dkg_id.dkg_tag == tag )); } @@ -507,7 +501,7 @@ mod tests { // Now we empty the dkg pool, add new dealings from this dealer and make sure // they are still not included. - assert_eq!(dkg_pool.read().unwrap().get_validated().count(), 2); + assert_eq!(dkg_pool.read().unwrap().get_validated().count(), 3); dkg_pool .write() .unwrap() @@ -516,10 +510,10 @@ mod tests { assert_eq!(dkg_pool.read().unwrap().get_validated().count(), 0); // Create new dealings; this works, because we cleaned the pool before. let change_set = dkg.on_state_change(&*dkg_pool.read().unwrap()); - assert_eq!(change_set.len(), 2); + assert_eq!(change_set.len(), 3); dkg_pool.write().unwrap().apply(change_set); // Make sure the new dealings are in the pool. - assert_eq!(dkg_pool.read().unwrap().get_validated().count(), 2); + assert_eq!(dkg_pool.read().unwrap().get_validated().count(), 3); // Advance the pool and make sure the dealing are not included. pool.advance_round_normal_operation(); let block = pool.get_cache().finalized_block(); @@ -541,32 +535,31 @@ mod tests { ); let dkg_pool_2 = DkgPoolImpl::new(MetricsRegistry::new(), logger); sync_dkg_key_manager(&dkg_key_manager_2, &pool); - match &dkg_2.on_state_change(&dkg_pool_2).as_slice() { - &[ChangeAction::AddToValidated(message), ChangeAction::AddToValidated(message2)] => - { - dkg_pool.write().unwrap().insert(UnvalidatedArtifact { - message: message.clone(), - peer_id: replica_1, - timestamp: UNIX_EPOCH, - }); - dkg_pool.write().unwrap().insert(UnvalidatedArtifact { - message: message2.clone(), - peer_id: replica_1, - timestamp: UNIX_EPOCH, - }); + let change_set = dkg_2.on_state_change(&dkg_pool_2); + assert_eq!(change_set.len(), 3); + for action in change_set { + match action { + ChangeAction::AddToValidated(message) => { + dkg_pool.write().unwrap().insert(UnvalidatedArtifact { + message: message.clone(), + peer_id: replica_1, + timestamp: UNIX_EPOCH, + }) + } + action => panic!("Unexpected action {:?} in changeset", action), } - val => panic!("Unexpected change set: {:?}", val), - }; + } // Now we validate these dealings on replica 1 and move them to the validated // pool. let change_set = dkg.on_state_change(&*dkg_pool.read().unwrap()); match &change_set.as_slice() { - &[ChangeAction::MoveToValidated(_), ChangeAction::MoveToValidated(_)] => {} + &[ChangeAction::MoveToValidated(_), ChangeAction::MoveToValidated(_), ChangeAction::MoveToValidated(_)] => + {} val => panic!("Unexpected change set: {:?}", val), }; dkg_pool.write().unwrap().apply(change_set); - assert_eq!(dkg_pool.read().unwrap().get_validated().count(), 4); + assert_eq!(dkg_pool.read().unwrap().get_validated().count(), 6); // Now we create a new block and make sure, the dealings made into the payload. pool.advance_round_normal_operation(); @@ -579,10 +572,10 @@ mod tests { dealings.start_height ) } - assert_eq!(dealings.messages.len(), 2); - for tag in &TAGS { + assert_eq!(dealings.messages.len(), 3); + for tag in tags_iter(&vet_key_ids) { assert!(dealings.messages.iter().any( - |m| m.signature.signer == replica_2 && m.content.dkg_id.dkg_tag == *tag + |m| m.signature.signer == replica_2 && m.content.dkg_id.dkg_tag == tag )); } }); @@ -1084,7 +1077,7 @@ mod tests { assert_eq!( reason, &format!( - "Replica with Id={:?} is not a dealer.", + "Dealing verification failed: InvalidDealer({:?})", invalid_dealing_message.signature.signer ) ); @@ -1625,6 +1618,7 @@ mod tests { 5, SubnetRecordBuilder::from(&committee1) .with_dkg_interval_length(dkg_interval_length) + .with_chain_key_config(test_vet_key_config()) .build(), )], ); @@ -1639,14 +1633,24 @@ mod tests { ); let summary = dkg_block.payload.as_ref().as_summary(); let dkg_summary = &summary.dkg; + + let vet_key_ids = vetkd_key_ids_for_subnet( + replica_config.subnet_id, + &*registry, + dkg_summary.registry_version, + ) + .unwrap(); + assert_eq!(dkg_summary.registry_version, RegistryVersion::from(5)); assert_eq!(dkg_summary.height, Height::from(0)); assert_eq!( cup.get_oldest_registry_version_in_use(), RegistryVersion::from(5) ); - for tag in TAGS.iter() { - let current_transcript = dkg_summary.current_transcript(tag).unwrap(); + + assert_eq!(vet_key_ids.len(), 1); + for tag in tags_iter(&vet_key_ids) { + let current_transcript = dkg_summary.current_transcript(&tag).unwrap(); assert_eq!( current_transcript.dkg_id.start_block_height, Height::from(0) @@ -1661,7 +1665,7 @@ mod tests { ); // The genesis summary cannot have next transcripts, instead we'll reuse in // round 1 the active transcripts from round 0. - assert!(dkg_summary.next_transcript(tag).is_none()); + assert!(dkg_summary.next_transcript(&tag).is_none()); } // Advance for one round and update the registry to version 6 with new @@ -1674,6 +1678,7 @@ mod tests { replica_config.subnet_id, SubnetRecordBuilder::from(&committee2) .with_dkg_interval_length(dkg_interval_length) + .with_chain_key_config(test_vet_key_config()) .build(), ); registry.update_to_latest_version(); @@ -1690,6 +1695,14 @@ mod tests { ); let summary = dkg_block.payload.as_ref().as_summary(); let dkg_summary = &summary.dkg; + + let vet_key_ids = vetkd_key_ids_for_subnet( + replica_config.subnet_id, + &*registry, + dkg_summary.registry_version, + ) + .unwrap(); + // This membership registry version corresponds to the registry version from // the block context of the previous summary. assert_eq!(dkg_summary.registry_version, RegistryVersion::from(5)); @@ -1698,9 +1711,11 @@ mod tests { cup.get_oldest_registry_version_in_use(), RegistryVersion::from(5) ); - for tag in TAGS.iter() { + + assert_eq!(vet_key_ids.len(), 1); + for tag in tags_iter(&vet_key_ids) { // We reused the transcript. - let current_transcript = dkg_summary.current_transcript(tag).unwrap(); + let current_transcript = dkg_summary.current_transcript(&tag).unwrap(); assert_eq!( current_transcript.dkg_id.start_block_height, Height::from(0) @@ -1710,7 +1725,7 @@ mod tests { let (_, conf) = dkg_summary .configs .iter() - .find(|(id, _)| id.dkg_tag == *tag) + .find(|(id, _)| id.dkg_tag == tag) .unwrap(); assert_eq!(conf.registry_version(), RegistryVersion::from(6)); assert_eq!( @@ -1729,6 +1744,7 @@ mod tests { replica_config.subnet_id, SubnetRecordBuilder::from(&committee3) .with_dkg_interval_length(dkg_interval_length) + .with_chain_key_config(test_vet_key_config()) .build(), ); registry.update_to_latest_version(); @@ -1745,6 +1761,14 @@ mod tests { ); let summary = dkg_block.payload.as_ref().as_summary(); let dkg_summary = &summary.dkg; + + let vet_key_ids = vetkd_key_ids_for_subnet( + replica_config.subnet_id, + &*registry, + dkg_summary.registry_version, + ) + .unwrap(); + // This membership registry version corresponds to the registry version from // the block context of the previous summary. assert_eq!(dkg_summary.registry_version, RegistryVersion::from(6)); @@ -1753,22 +1777,24 @@ mod tests { cup.get_oldest_registry_version_in_use(), RegistryVersion::from(5) ); - for tag in TAGS.iter() { + + assert_eq!(vet_key_ids.len(), 1); + for tag in tags_iter(&vet_key_ids) { let (_, conf) = dkg_summary .configs .iter() - .find(|(id, _)| id.dkg_tag == *tag) + .find(|(id, _)| id.dkg_tag == tag) .unwrap(); assert_eq!( conf.receivers().get(), &committee3.clone().into_iter().collect::>() ); - let current_transcript = dkg_summary.current_transcript(tag).unwrap(); + let current_transcript = dkg_summary.current_transcript(&tag).unwrap(); assert_eq!( current_transcript.dkg_id.start_block_height, Height::from(0) ); - let next_transcript = dkg_summary.next_transcript(tag).unwrap(); + let next_transcript = dkg_summary.next_transcript(&tag).unwrap(); // The DKG id start height refers to height 5, where we started computing this // DKG. assert_eq!(next_transcript.dkg_id.start_block_height, Height::from(5)); @@ -1785,6 +1811,14 @@ mod tests { ); let summary = dkg_block.payload.as_ref().as_summary(); let dkg_summary = &summary.dkg; + + let vet_key_ids = vetkd_key_ids_for_subnet( + replica_config.subnet_id, + &*registry, + dkg_summary.registry_version, + ) + .unwrap(); + // This membership registry version corresponds to the registry version from // the block context of the previous summary. assert_eq!(dkg_summary.registry_version, RegistryVersion::from(10)); @@ -1793,22 +1827,24 @@ mod tests { cup.get_oldest_registry_version_in_use(), RegistryVersion::from(6) ); - for tag in TAGS.iter() { + + assert_eq!(vet_key_ids.len(), 1); + for tag in tags_iter(&vet_key_ids) { let (_, conf) = dkg_summary .configs .iter() - .find(|(id, _)| id.dkg_tag == *tag) + .find(|(id, _)| id.dkg_tag == tag) .unwrap(); assert_eq!( conf.receivers().get(), &committee3.clone().into_iter().collect::>() ); - let current_transcript = dkg_summary.current_transcript(tag).unwrap(); + let current_transcript = dkg_summary.current_transcript(&tag).unwrap(); assert_eq!( current_transcript.dkg_id.start_block_height, Height::from(5) ); - let next_transcript = dkg_summary.next_transcript(tag).unwrap(); + let next_transcript = dkg_summary.next_transcript(&tag).unwrap(); assert_eq!(next_transcript.dkg_id.start_block_height, Height::from(10)); } @@ -1823,6 +1859,14 @@ mod tests { ); let summary = dkg_block.payload.as_ref().as_summary(); let dkg_summary = &summary.dkg; + + let vet_key_ids = vetkd_key_ids_for_subnet( + replica_config.subnet_id, + &*registry, + dkg_summary.registry_version, + ) + .unwrap(); + // This membership registry version corresponds to the registry version from // the block context of the previous summary. assert_eq!(dkg_summary.registry_version, RegistryVersion::from(10)); @@ -1831,22 +1875,24 @@ mod tests { cup.get_oldest_registry_version_in_use(), RegistryVersion::from(10) ); - for tag in TAGS.iter() { + + assert_eq!(vet_key_ids.len(), 1); + for tag in tags_iter(&vet_key_ids) { let (_, conf) = dkg_summary .configs .iter() - .find(|(id, _)| id.dkg_tag == *tag) + .find(|(id, _)| id.dkg_tag == tag) .unwrap(); assert_eq!( conf.receivers().get(), &committee3.clone().into_iter().collect::>() ); - let current_transcript = dkg_summary.current_transcript(tag).unwrap(); + let current_transcript = dkg_summary.current_transcript(&tag).unwrap(); assert_eq!( current_transcript.dkg_id.start_block_height, Height::from(10) ); - let next_transcript = dkg_summary.next_transcript(tag).unwrap(); + let next_transcript = dkg_summary.next_transcript(&tag).unwrap(); assert_eq!(next_transcript.dkg_id.start_block_height, Height::from(15)); } }); @@ -1876,4 +1922,24 @@ mod tests { mngr.on_state_change(&PoolReader::new(pool)); mngr.sync(); } + + /// Get a test [`ChainKeyConfig`] containing a single vet key configuration + pub(super) fn test_vet_key_config() -> ChainKeyConfig { + ChainKeyConfig { + key_configs: vec![KeyConfig { + key_id: MasterPublicKeyId::VetKd(test_vet_key()), + pre_signatures_to_create_in_advance: 20, + max_queue_size: 20, + }], + signature_request_timeout_ns: None, + idkg_key_rotation_period_ms: None, + } + } + + fn test_vet_key() -> VetKdKeyId { + VetKdKeyId { + curve: VetKdCurve::Bls12_381_G2, + name: String::from("vet_kd_key"), + } + } } diff --git a/rs/consensus/dkg/src/payload_builder.rs b/rs/consensus/dkg/src/payload_builder.rs index c6907a3d64a..61bc76c422e 100644 --- a/rs/consensus/dkg/src/payload_builder.rs +++ b/rs/consensus/dkg/src/payload_builder.rs @@ -1,26 +1,31 @@ -use super::{ - utils, MAX_REMOTE_DKGS_PER_INTERVAL, MAX_REMOTE_DKG_ATTEMPTS, - REMOTE_DKG_REPEATED_FAILURE_ERROR, TAGS, +use crate::{ + utils::{self, tags_iter, vetkd_key_ids_for_subnet}, + MAX_REMOTE_DKGS_PER_INTERVAL, MAX_REMOTE_DKG_ATTEMPTS, REMOTE_DKG_REPEATED_FAILURE_ERROR, }; use ic_consensus_utils::{crypto::ConsensusCrypto, pool_reader::PoolReader}; use ic_interfaces::{crypto::ErrorReproducibility, dkg::DkgPool}; use ic_interfaces_registry::RegistryClient; use ic_interfaces_state_manager::{StateManager, StateManagerError}; use ic_logger::{error, warn, ReplicaLogger}; -use ic_protobuf::registry::subnet::v1::CatchUpPackageContents; +use ic_protobuf::registry::subnet::v1::{ + chain_key_initialization::Initialization, CatchUpPackageContents, +}; use ic_registry_client_helpers::{ - crypto::{initial_ni_dkg_transcript_from_registry_record, DkgTranscripts}, - subnet::SubnetRegistry, + crypto::initial_ni_dkg_transcript_from_registry_record, subnet::SubnetRegistry, }; use ic_replicated_state::ReplicatedState; use ic_types::{ batch::ValidationContext, - consensus::{dkg, dkg::Summary, get_faults_tolerated, Block}, + consensus::{ + dkg::{self, Summary}, + get_faults_tolerated, Block, + }, crypto::{ threshold_sig::ni_dkg::{ config::{errors::NiDkgConfigValidationError, NiDkgConfig, NiDkgConfigData}, errors::create_transcript_error::DkgCreateTranscriptError, - NiDkgDealing, NiDkgId, NiDkgTag, NiDkgTargetId, NiDkgTargetSubnet, NiDkgTranscript, + NiDkgDealing, NiDkgId, NiDkgMasterPublicKeyId, NiDkgTag, NiDkgTargetId, + NiDkgTargetSubnet, NiDkgTranscript, }, CryptoError, }, @@ -43,6 +48,7 @@ pub enum PayloadCreationError { DkgCreateTranscriptError(DkgCreateTranscriptError), FailedToGetDkgIntervalSettingFromRegistry(RegistryClientError), FailedToGetSubnetMemberListFromRegistry(RegistryClientError), + FailedToGetVetKdKeyList(RegistryClientError), MissingDkgStartBlock, } @@ -73,7 +79,7 @@ pub fn create_payload( if last_dkg_summary.get_next_start_height() == height { // Since `height` corresponds to the start of a new DKG interval, we create a // new summary. - return create_summary_payload( + create_summary_payload( subnet_id, registry_client, crypto, @@ -85,11 +91,29 @@ pub fn create_payload( validation_context, logger, ) - .map(dkg::Payload::Summary); + .map(dkg::Payload::Summary) + } else { + // If the height is not a start height, create a payload with new dealings. + create_data_payload( + pool_reader, + dkg_pool, + parent, + max_dealings_per_block, + &last_summary_block, + last_dkg_summary, + ) + .map(dkg::Payload::Data) } +} - // If the height is not a start height, create a payload with new dealings. - +fn create_data_payload( + pool_reader: &PoolReader<'_>, + dkg_pool: Arc>, + parent: &Block, + max_dealings_per_block: usize, + last_summary_block: &Block, + last_dkg_summary: &Summary, +) -> Result { // Get all dealer ids from the chain. let dealers_from_chain = utils::get_dealers_from_chain(pool_reader, parent); // Filter from the validated pool all dealings whose dealer has no dealing on @@ -107,10 +131,10 @@ pub fn create_payload( .take(max_dealings_per_block) .cloned() .collect(); - Ok(dkg::Payload::Data(dkg::DkgDataPayload::new( + Ok(dkg::DkgDataPayload::new( last_summary_block.height, new_validated_dealings, - ))) + )) } /// Creates a summary payload for the given parent and registry_version. @@ -214,18 +238,35 @@ pub(super) fn create_summary_payload( // Current transcripts come from next transcripts of the last_summary. let current_transcripts = as_next_transcripts(last_summary, &logger); + let vet_key_ids = vetkd_key_ids_for_subnet( + subnet_id, + registry_client, + validation_context.registry_version, + )?; + // If the config for the currently computed DKG intervals requires a transcript // resharing (currently for high-threshold DKG only), we are going to re-share // the next transcripts, as they are the newest ones. // If `next_transcripts` does not contain the required transcripts (due to // failed DKGs in the past interval) we reshare the current transcripts. - let reshared_transcripts = if next_transcripts.contains_key(&NiDkgTag::LowThreshold) - && next_transcripts.contains_key(&NiDkgTag::HighThreshold) - { - &next_transcripts - } else { - ¤t_transcripts - }; + let reshared_transcripts = tags_iter(&vet_key_ids) + .filter_map(|tag| { + let transcript = next_transcripts + .get(&tag) + .or_else(|| current_transcripts.get(&tag)) + .map(|transcript| (tag.clone(), transcript.clone())); + + if transcript.is_none() { + warn!( + logger, + "Found tag {:?} in summary configs without any current or next transcripts", + tag + ); + } + + transcript + }) + .collect::>(); // New configs are created using the new stable registry version proposed by this // block, which determines receivers of the dealings. @@ -239,6 +280,7 @@ pub(super) fn create_summary_payload( height, reshared_transcripts, validation_context.registry_version, + &vet_key_ids, )?); Ok(Summary::new( @@ -372,8 +414,6 @@ fn compute_remote_dkg_data( // Add errors into 'new_transcripts' for repeatedly failed configs and do not // attempt to create transcripts for them any more. - // - // TODO: use drain_filter once it's stable. config_groups.retain(|config_group| { let target = config_group .first() @@ -431,38 +471,72 @@ pub fn get_dkg_summary_from_cup_contents( .registry_store_uri .as_ref() .map(|v| RegistryVersion::from(v.registry_version)); - let mut transcripts = DkgTranscripts { - low_threshold: cup_contents + + let mut transcripts: BTreeMap = BTreeMap::new(); + + transcripts.insert( + NiDkgTag::LowThreshold, + cup_contents .initial_ni_dkg_transcript_low_threshold .map(|dkg_transcript_record| { initial_ni_dkg_transcript_from_registry_record(dkg_transcript_record) .expect("Decoding initial low-threshold DKG transcript failed.") }) .expect("Missing initial low-threshold DKG transcript"), - high_threshold: cup_contents + ); + transcripts.insert( + NiDkgTag::HighThreshold, + cup_contents .initial_ni_dkg_transcript_high_threshold .map(|dkg_transcript_record| { initial_ni_dkg_transcript_from_registry_record(dkg_transcript_record) .expect("Decoding initial high-threshold DKG transcript failed.") }) .expect("Missing initial high-threshold DKG transcript"), - }; + ); + + // Get the transcripts for vetkeys from the `chain_key_initializations` + let mut vet_key_transcripts = cup_contents + .chain_key_initializations + .into_iter() + .filter_map(|init| { + let key_id = init.key_id.expect("Initialization without a key id"); + let init = init.initialization.expect("Empty initialization"); + + // IDkg initializations are handled in a different place. This is to include NiDkgTranscripts into the Summary only + let Initialization::TranscriptRecord(record) = init else { + return None; + }; + + let key_id = NiDkgMasterPublicKeyId::try_from(key_id) + .expect("IDkg key combined with NiDkg initialization"); + + let transcript = + initial_ni_dkg_transcript_from_registry_record(record).unwrap_or_else(|_| { + panic!("Decoding high-threshold DKG for key-id {} failed.", key_id) + }); + + Some((NiDkgTag::HighThresholdForKey(key_id), transcript)) + }) + .collect::>(); + + // Extract vet key ids + + let vet_key_ids = vetkd_key_ids_for_subnet(subnet_id, registry, registry_version) + .expect("Failed to get vetkeys"); + + // Add vet key transcripts to the summary block + transcripts.append(&mut vet_key_transcripts); // If we're in a NNS subnet recovery with failover nodes, we set the transcript versions to the // registry version of the recovered NNS, otherwise the oldest registry version used in a CUP is // computed incorrectly. if let Some(version) = registry_version_of_original_registry { - transcripts.low_threshold.registry_version = version; - transcripts.high_threshold.registry_version = version; + for transcript in transcripts.values_mut() { + transcript.registry_version = version; + } } - let transcripts = vec![ - (NiDkgTag::LowThreshold, transcripts.low_threshold), - (NiDkgTag::HighThreshold, transcripts.high_threshold), - ] - .into_iter() - .collect(); - let committee = get_node_list(subnet_id, registry, registry_version) .expect("Could not retrieve committee list"); @@ -471,11 +545,12 @@ pub fn get_dkg_summary_from_cup_contents( subnet_id, committee, height, - &transcripts, + transcripts.clone(), // If we are in a NNS subnet recovery with failover nodes, we use the registry version of // the recovered NNS so that the DKG configs point to the correct registry version and new // dealings can be created in the first DKG interval. registry_version_of_original_registry.unwrap_or(registry_version), + &vet_key_ids, ) .expect("Couldn't generate configs for the genesis summary"); // For the first 2 intervals we use the length value contained in the @@ -503,14 +578,13 @@ pub(crate) fn get_configs_for_local_transcripts( subnet_id: SubnetId, node_ids: BTreeSet, start_block_height: Height, - reshared_transcripts: &BTreeMap, + mut reshared_transcripts: BTreeMap, registry_version: RegistryVersion, + vet_key_ids: &[NiDkgMasterPublicKeyId], ) -> Result, PayloadCreationError> { let mut new_configs = Vec::new(); - //////////////////////////////////////////////////////////////////////////////// - // TODO(CON-1413): In addition to iterating over TAGS, also iterate over all vetKD keys that were requested by registry - /////////////////////////////////////////////////////////////////////////////// - for tag in TAGS.iter() { + + for tag in tags_iter(vet_key_ids) { let dkg_id = NiDkgId { start_block_height, dealer_subnet: subnet_id, @@ -520,15 +594,17 @@ pub(crate) fn get_configs_for_local_transcripts( let (dealers, resharing_transcript) = match tag { NiDkgTag::LowThreshold => (node_ids.clone(), None), NiDkgTag::HighThreshold | NiDkgTag::HighThresholdForKey(_) => { - let resharing_transcript = reshared_transcripts.get(tag); + let resharing_transcript = reshared_transcripts.remove(&tag); ( resharing_transcript + .as_ref() .map(|transcript| transcript.committee.get().clone()) .unwrap_or_else(|| node_ids.clone()), - resharing_transcript.cloned(), + resharing_transcript, ) } }; + let threshold = NumberOfNodes::from(tag.threshold_for_subnet_of_size(node_ids.len()) as u32); let new_config = match NiDkgConfig::new(NiDkgConfigData { @@ -814,6 +890,8 @@ pub fn make_genesis_summary( #[cfg(test)] mod tests { + use crate::tests::test_vet_key_config; + use super::{super::test_utils::complement_state_manager_with_remote_dkg_requests, *}; use ic_consensus_mocks::{ dependencies_with_subnet_params, dependencies_with_subnet_records_with_raw_state_manager, @@ -821,8 +899,9 @@ mod tests { }; use ic_crypto_test_utils_ni_dkg::dummy_transcript_for_tests_with_params; use ic_logger::replica_logger::no_op_logger; + use ic_management_canister_types_private::{VetKdCurve, VetKdKeyId}; use ic_test_utilities_logger::with_test_replica_logger; - use ic_test_utilities_registry::SubnetRecordBuilder; + use ic_test_utilities_registry::{add_subnet_record, SubnetRecordBuilder}; use ic_test_utilities_types::ids::{node_test_id, subnet_test_id}; use ic_types::{ crypto::threshold_sig::ni_dkg::{NiDkgId, NiDkgTag, NiDkgTargetSubnet}, @@ -835,35 +914,63 @@ mod tests { #[test] fn test_get_configs_for_local_transcripts() { let prev_committee: Vec<_> = (10..21).map(node_test_id).collect(); - let reshared_transcript = Some(dummy_transcript_for_tests_with_params( - prev_committee.clone(), - NiDkgTag::HighThreshold, - NiDkgTag::HighThreshold.threshold_for_subnet_of_size(prev_committee.len()) as u32, - 888, - )); + let receivers: BTreeSet<_> = (3..8).map(node_test_id).collect(); let start_block_height = Height::from(777); let subnet_id = subnet_test_id(123); let registry_version = RegistryVersion::from(888); + let vet_key_ids = vec![ + NiDkgMasterPublicKeyId::VetKd(VetKdKeyId { + curve: VetKdCurve::Bls12_381_G2, + name: String::from("first_key"), + }), + NiDkgMasterPublicKeyId::VetKd(VetKdKeyId { + curve: VetKdCurve::Bls12_381_G2, + name: String::from("second_key"), + }), + ]; + + let mut reshared_transcripts = BTreeMap::new(); + reshared_transcripts.insert( + NiDkgTag::HighThreshold, + dummy_transcript_for_tests_with_params( + prev_committee.clone(), + NiDkgTag::HighThreshold, + NiDkgTag::HighThreshold.threshold_for_subnet_of_size(prev_committee.len()) as u32, + 888, + ), + ); + for key in &vet_key_ids { + let tag = NiDkgTag::HighThresholdForKey(key.clone()); + + reshared_transcripts.insert( + tag.clone(), + dummy_transcript_for_tests_with_params( + prev_committee.clone(), + tag.clone(), + tag.clone() + .threshold_for_subnet_of_size(prev_committee.len()) + as u32, + 888, + ), + ); + } + // Tests the happy path. let configs = get_configs_for_local_transcripts( subnet_id, receivers.clone(), start_block_height, - &vec![( - NiDkgTag::HighThreshold, - reshared_transcript.clone().unwrap(), - )] - .into_iter() - .collect(), + reshared_transcripts.clone(), registry_version, + &vet_key_ids, ) .unwrap_or_else(|err| panic!("Couldn't create configs: {:?}", err)); - // We produced exactly two configs, and with expected ids. - assert_eq!(configs.len(), 2); - for (index, tag) in TAGS.iter().enumerate() { + // We produced exactly four configs (high, low and two vetkeys), and with expected ids. + assert_eq!(configs.len(), 4); + for (index, tag) in tags_iter(&vet_key_ids).enumerate() { let config = configs[index].clone(); assert_eq!( config.dkg_id(), @@ -885,9 +992,9 @@ mod tests { config.threshold().get().get(), match tag { // 5 receivers => committee size is 4 => high threshold is 4 - f with f = 1 - NiDkgTag::HighThreshold => 3, + NiDkgTag::HighThreshold | NiDkgTag::HighThresholdForKey(_) => 3, // low threshold is f + 1, with f same as for high threshold. - _ => 2, + NiDkgTag::LowThreshold => 2, } ); @@ -897,26 +1004,27 @@ mod tests { assert_eq!( config.max_corrupt_dealers().get(), match tag { - NiDkgTag::HighThreshold => 3, - _ => 1, + NiDkgTag::HighThreshold | NiDkgTag::HighThresholdForKey(_) => 3, + NiDkgTag::LowThreshold => 1, } ); // We use the committee of the reshared transcript as dealers for the high // threshold, or the current subnet members, for the low threshold. let expected_dealers = match tag { - NiDkgTag::HighThreshold => { + NiDkgTag::HighThreshold | NiDkgTag::HighThresholdForKey(_) => { prev_committee.clone().into_iter().collect::>() } - _ => receivers.clone().into_iter().collect::>(), + NiDkgTag::LowThreshold => receivers.clone().into_iter().collect::>(), }; assert_eq!(config.dealers().get(), &expected_dealers); assert_eq!( - config.resharing_transcript(), + config.resharing_transcript().as_ref(), match tag { - NiDkgTag::HighThreshold => &reshared_transcript, - _ => &None, + NiDkgTag::HighThreshold | NiDkgTag::HighThresholdForKey(_) => + reshared_transcripts.get(&tag), + NiDkgTag::LowThreshold => None, } ); } @@ -941,6 +1049,7 @@ mod tests { 10, SubnetRecordBuilder::from(&node_ids) .with_dkg_interval_length(dkg_interval_length) + .with_chain_key_config(test_vet_key_config()) .build(), )], ); @@ -1096,6 +1205,7 @@ mod tests { initial_registry_version, SubnetRecordBuilder::from(&nodes) .with_dkg_interval_length(dkg_interval_len) + .with_chain_key_config(test_vet_key_config()) .build(), )], ); @@ -1132,14 +1242,13 @@ mod tests { // Test the regular case (Both DKGs succeeded) let next_summary = create_summary_payload(&genesis_summary); for (_, conf) in next_summary.configs.iter() { - if conf.dkg_id().dkg_tag == NiDkgTag::HighThreshold { - assert_eq!( - next_summary - .clone() - .next_transcript(&NiDkgTag::HighThreshold) - .unwrap(), + let tag = &conf.dkg_id().dkg_tag; + match tag { + NiDkgTag::HighThreshold | NiDkgTag::HighThresholdForKey(_) => assert_eq!( + next_summary.clone().next_transcript(tag).unwrap(), &conf.resharing_transcript().clone().unwrap() - ) + ), + NiDkgTag::LowThreshold => (), } } @@ -1149,21 +1258,20 @@ mod tests { genesis_summary.configs.clear(); let next_summary = create_summary_payload(&genesis_summary); for (_, conf) in next_summary.configs.iter() { - if conf.dkg_id().dkg_tag == NiDkgTag::HighThreshold { - assert_eq!( - next_summary - .clone() - .current_transcript(&NiDkgTag::HighThreshold) - .unwrap(), + let tag = &conf.dkg_id().dkg_tag; + match tag { + NiDkgTag::HighThreshold | NiDkgTag::HighThresholdForKey(_) => assert_eq!( + next_summary.clone().current_transcript(tag).unwrap(), &conf.resharing_transcript().clone().unwrap() - ) + ), + NiDkgTag::LowThreshold => (), } } }); } - // Creates a summary from registry and tests that all fields of the summary - // contain the expected contents. + /// Creates a summary from registry and tests that all fields of the summary + /// contain the expected contents. #[test] fn test_make_genesis_summary() { ic_test_utilities::artifact_pool_config::with_test_pool_config(|pool_config| { @@ -1178,12 +1286,16 @@ mod tests { initial_registry_version, SubnetRecordBuilder::from(&nodes) .with_dkg_interval_length(dkg_interval_len) + .with_chain_key_config(test_vet_key_config()) .build(), )], ); let summary = make_genesis_summary(&*registry, subnet_id, None); + let vet_key_ids = + vetkd_key_ids_for_subnet(subnet_id, &*registry, summary.registry_version).unwrap(); + assert_eq!( summary.registry_version, RegistryVersion::from(initial_registry_version) @@ -1191,14 +1303,21 @@ mod tests { assert_eq!(summary.height, Height::from(0)); assert_eq!(summary.interval_length, Height::from(dkg_interval_len)); assert_eq!(summary.next_interval_length, Height::from(dkg_interval_len)); + assert_eq!(summary.configs.len(), 3); assert!(summary.next_transcript(&NiDkgTag::LowThreshold).is_none()); assert!(summary.next_transcript(&NiDkgTag::HighThreshold).is_none()); + assert_eq!(vet_key_ids.len(), 1); + for vet_key_id in &vet_key_ids { + assert!(summary + .next_transcript(&NiDkgTag::HighThresholdForKey(vet_key_id.clone())) + .is_none()); + } - for tag in TAGS.iter() { + for tag in tags_iter(&vet_key_ids) { let (id, conf) = summary .configs .iter() - .find(|(id, _)| id.dkg_tag == *tag) + .find(|(id, _)| id.dkg_tag == tag) .unwrap(); assert_eq!( @@ -1230,11 +1349,7 @@ mod tests { conf.threshold().get().get(), match tag { NiDkgTag::LowThreshold => 3, - NiDkgTag::HighThreshold => 5, - ///////////////////////////////////////////////////// - // TODO(CON-1417): extend this test once we have support for vetKD transcripts in registry CUPs - ///////////////////////////////////////////////////// - NiDkgTag::HighThresholdForKey(_) => todo!("CON-1417"), + NiDkgTag::HighThreshold | NiDkgTag::HighThresholdForKey(_) => 5, } ); } @@ -1242,10 +1357,10 @@ mod tests { } #[test] - // In this test we check that all summary payloads are created at the expected - // heights and with the expected contents. Note, we do not test anything related - // to the presence or contents of transcripts, as this would require using a - // real CSP. + /// In this test we check that all summary payloads are created at the expected + /// heights and with the expected contents. Note, we do not test anything related + /// to the presence or contents of transcripts, as this would require using a + /// real CSP. fn test_create_regular_summaries() { ic_test_utilities::artifact_pool_config::with_test_pool_config(|pool_config| { let nodes: Vec<_> = (7..14).map(node_test_id).collect(); @@ -1261,6 +1376,7 @@ mod tests { initial_registry_version, SubnetRecordBuilder::from(&nodes) .with_dkg_interval_length(dkg_interval_len) + .with_chain_key_config(test_vet_key_config()) .build(), )], ); @@ -1302,12 +1418,17 @@ mod tests { dkg_summary.next_interval_length, Height::from(dkg_interval_len) ); + assert_eq!(dkg_summary.configs.len(), 3); - for tag in TAGS.iter() { + let vet_key_ids = + vetkd_key_ids_for_subnet(subnet_id, &*registry, dkg_summary.registry_version) + .unwrap(); + assert_eq!(vet_key_ids.len(), 1); + for tag in tags_iter(&vet_key_ids) { let (id, conf) = dkg_summary .configs .iter() - .find(|(id, _)| id.dkg_tag == *tag) + .find(|(id, _)| id.dkg_tag == tag) .unwrap(); assert_eq!( @@ -1339,31 +1460,266 @@ mod tests { conf.threshold().get().get(), match tag { NiDkgTag::LowThreshold => 3, - NiDkgTag::HighThreshold => 5, - ///////////////////////////////////////////////////// - // TODO(CON-1413): extend this test once we can create local transcript configs for vetKeys that were requested by registry - ///////////////////////////////////////////////////// - NiDkgTag::HighThresholdForKey(_) => todo!("CON-1413"), + NiDkgTag::HighThreshold | NiDkgTag::HighThresholdForKey(_) => 5, } ); // In later intervals we can also check that the resharing transcript matches // the expected value. if interval > 0 { - if tag == &NiDkgTag::HighThreshold { - assert_eq!( - dkg_summary - .clone() - .next_transcript(&NiDkgTag::HighThreshold) - .unwrap(), - &conf.resharing_transcript().clone().unwrap() - ); - } else { - assert!(&conf.resharing_transcript().is_none()); + match tag { + NiDkgTag::HighThreshold | NiDkgTag::HighThresholdForKey(_) => { + assert_eq!( + dkg_summary.clone().next_transcript(&tag).unwrap(), + &conf.resharing_transcript().clone().unwrap() + ); + } + _ => assert!(&conf.resharing_transcript().is_none()), } } } } }); } + + /// Test the generation of vetkeys + /// + /// 1. Create a subnet with 4 nodes and a genesis summary + /// 2. Add registry entry to add a vetkey + /// 3. Check that a config ends up in the next summary + /// 4. Check that the summary after that has a matching next transcript + /// 5. CHeck that the summary after that has matching current and next transcripts + #[test] + fn test_vet_key_local_transcript_generation() { + ic_test_utilities::artifact_pool_config::with_test_pool_config(|pool_config| { + // We'll have a DKG summary inside every 5th block. + let dkg_interval_length = 4; + // Committee are nodes 0, 1, 2, 3. + let committee = (0..4).map(node_test_id).collect::>(); + let Dependencies { + mut pool, + registry_data_provider, + registry, + replica_config, + .. + } = dependencies_with_subnet_params( + pool_config, + subnet_test_id(0), + vec![( + 5, + SubnetRecordBuilder::from(&committee) + .with_dkg_interval_length(dkg_interval_length) + .build(), + )], + ); + + // Get the latest summary block, which is the genesis block + let cup = PoolReader::new(&pool).get_highest_catch_up_package(); + let dkg_block = cup.content.block.as_ref(); + assert_eq!( + dkg_block.context.registry_version, + RegistryVersion::from(5), + "The latest available version was used for the summary block." + ); + let summary = dkg_block.payload.as_ref().as_summary(); + let dkg_summary = &summary.dkg; + + // The genesis summary does not have vetkeys enabled + let vet_key_ids = vetkd_key_ids_for_subnet( + replica_config.subnet_id, + &*registry, + dkg_block.context.registry_version, + ) + .unwrap(); + assert_eq!(vet_key_ids.len(), 0); + + assert_eq!(dkg_summary.registry_version, RegistryVersion::from(5)); + assert_eq!(dkg_summary.height, Height::from(0)); + assert_eq!( + cup.get_oldest_registry_version_in_use(), + RegistryVersion::from(5) + ); + + // This summary does not contain a config for the vetkey yet + assert_eq!(dkg_summary.configs.len(), 2); + assert_eq!(dkg_summary.current_transcripts().len(), 2); + + // Since it is the genesis summary, it also has no next transcripts + assert_eq!(dkg_summary.next_transcripts().len(), 0); + for tag in tags_iter(&vet_key_ids) { + // Check that every tag has a config in the summary + let _ = dkg_summary + .configs + .iter() + .find(|(id, _)| id.dkg_tag == tag) + .unwrap(); + let _ = dkg_summary.current_transcript(&tag).unwrap(); + } + + // Add the vetkey to the registry + pool.advance_round_normal_operation(); + add_subnet_record( + ®istry_data_provider, + 6, + replica_config.subnet_id, + SubnetRecordBuilder::from(&committee) + .with_dkg_interval_length(dkg_interval_length) + .with_chain_key_config(test_vet_key_config()) + .build(), + ); + registry.update_to_latest_version(); + + pool.advance_round_normal_operation_n(dkg_interval_length); + let cup = PoolReader::new(&pool).get_highest_catch_up_package(); + let dkg_block = cup.content.block.as_ref(); + assert_eq!( + dkg_block.context.registry_version, + RegistryVersion::from(6), + "The newest registry version is used." + ); + let summary = dkg_block.payload.as_ref().as_summary(); + let dkg_summary = &summary.dkg; + + // At this point the summary has a registry version with a vetkey + let vet_key_ids = vetkd_key_ids_for_subnet( + replica_config.subnet_id, + &*registry, + dkg_block.context.registry_version, + ) + .unwrap(); + assert_eq!(vet_key_ids.len(), 1); + + // This membership registry version corresponds to the registry version from + // the block context of the previous summary. + assert_eq!(dkg_summary.configs.len(), 3); + assert_eq!(dkg_summary.registry_version, RegistryVersion::from(5)); + assert_eq!(dkg_summary.height, Height::from(5)); + assert_eq!( + cup.get_oldest_registry_version_in_use(), + RegistryVersion::from(5) + ); + + assert_eq!(dkg_summary.current_transcripts().len(), 2); + assert_eq!(dkg_summary.next_transcripts().len(), 2); + for tag in tags_iter(&vet_key_ids) { + // Check that every tag has a config in the summary + let _ = dkg_summary + .configs + .iter() + .find(|(id, _)| id.dkg_tag == tag) + .unwrap(); + let current_transcript = dkg_summary.current_transcript(&tag); + let next_transcript = dkg_summary.next_transcript(&tag); + + match tag { + // Vetkeys should not have transcripts yet, since the configs where only added in + // this summary + NiDkgTag::HighThresholdForKey(_) => { + assert!(current_transcript.is_none() && next_transcript.is_none()) + } + NiDkgTag::LowThreshold | NiDkgTag::HighThreshold => { + assert!(current_transcript.is_some() && next_transcript.is_some()) + } + }; + } + + pool.advance_round_normal_operation_n(dkg_interval_length + 1); + let cup = PoolReader::new(&pool).get_highest_catch_up_package(); + let dkg_block = cup.content.block.as_ref(); + assert_eq!( + dkg_block.context.registry_version, + RegistryVersion::from(6), + "The newest registry version is used." + ); + let summary = dkg_block.payload.as_ref().as_summary(); + let dkg_summary = &summary.dkg; + + let vet_key_ids = vetkd_key_ids_for_subnet( + replica_config.subnet_id, + &*registry, + dkg_block.context.registry_version, + ) + .unwrap(); + assert_eq!(vet_key_ids.len(), 1); + + // This membership registry version corresponds to the registry version from + // the block context of the previous summary. + assert_eq!(dkg_summary.configs.len(), 3); + assert_eq!(dkg_summary.registry_version, RegistryVersion::from(6)); + assert_eq!(dkg_summary.height, Height::from(10)); + assert_eq!( + cup.get_oldest_registry_version_in_use(), + RegistryVersion::from(5) + ); + + assert_eq!(dkg_summary.current_transcripts().len(), 2); + assert_eq!(dkg_summary.next_transcripts().len(), 3); + for tag in tags_iter(&vet_key_ids) { + // Check that every tag has a config in the summary + let _ = dkg_summary + .configs + .iter() + .find(|(id, _)| id.dkg_tag == tag) + .unwrap(); + let current_transcript = dkg_summary.current_transcript(&tag); + let next_transcript = dkg_summary.next_transcript(&tag); + + match tag { + // There should be a vetkey next transcript but not a current one + NiDkgTag::HighThresholdForKey(_) => { + assert!(current_transcript.is_none() && next_transcript.is_some()) + } + NiDkgTag::LowThreshold | NiDkgTag::HighThreshold => { + assert!(current_transcript.is_some() && next_transcript.is_some()) + } + }; + } + + pool.advance_round_normal_operation_n(dkg_interval_length + 1); + let cup = PoolReader::new(&pool).get_highest_catch_up_package(); + let dkg_block = cup.content.block.as_ref(); + assert_eq!( + dkg_block.context.registry_version, + RegistryVersion::from(6), + "The newest registry version is used." + ); + let summary = dkg_block.payload.as_ref().as_summary(); + let dkg_summary = &summary.dkg; + + let vet_key_ids = vetkd_key_ids_for_subnet( + replica_config.subnet_id, + &*registry, + dkg_block.context.registry_version, + ) + .unwrap(); + assert_eq!(vet_key_ids.len(), 1); + + // This membership registry version corresponds to the registry version from + // the block context of the previous summary. + assert_eq!(dkg_summary.configs.len(), 3); + assert_eq!(dkg_summary.registry_version, RegistryVersion::from(6)); + assert_eq!(dkg_summary.height, Height::from(15)); + // The oldest registry in use is no longer 5 + assert_eq!( + cup.get_oldest_registry_version_in_use(), + RegistryVersion::from(6) + ); + + assert_eq!(dkg_summary.current_transcripts().len(), 3); + assert_eq!(dkg_summary.next_transcripts().len(), 3); + for tag in tags_iter(&vet_key_ids) { + // Check that every tag has a config in the summary + let _ = dkg_summary + .configs + .iter() + .find(|(id, _)| id.dkg_tag == tag) + .unwrap(); + let current_transcript = dkg_summary.current_transcript(&tag); + let next_transcript = dkg_summary.next_transcript(&tag); + + // All tags have all transcripts now + assert!(current_transcript.is_some() && next_transcript.is_some()); + } + }); + } } diff --git a/rs/consensus/dkg/src/payload_validator.rs b/rs/consensus/dkg/src/payload_validator.rs index a8b57df8af7..7fd4f7efe39 100644 --- a/rs/consensus/dkg/src/payload_validator.rs +++ b/rs/consensus/dkg/src/payload_validator.rs @@ -1,4 +1,4 @@ -use crate::{payload_builder, utils, PayloadCreationError}; +use crate::{crypto_validate_dealing, payload_builder, utils, PayloadCreationError}; use ic_consensus_utils::{crypto::ConsensusCrypto, pool_reader::PoolReader}; use ic_interfaces::{ dkg::DkgPool, @@ -278,17 +278,8 @@ fn validate_dealings_payload( return Err(InvalidDkgPayloadReason::MissingDkgConfigForDealing.into()); }; - let dealer_id = message.signature.signer; - // If the dealer is not in the set of dealers, reject. - if !config.dealers().get().contains(&dealer_id) { - return Err(InvalidDkgPayloadReason::InvalidDealer(dealer_id).into()); - } - - // Verify the signature. - crypto.verify(message, last_summary.registry_version)?; - - // Verify the dealing. - crypto.verify_dealing(config, message.signature.signer, &message.content.dealing)?; + // Verify the signature and dealing. + crypto_validate_dealing(crypto, config, message)?; } Ok(()) @@ -296,15 +287,24 @@ fn validate_dealings_payload( #[cfg(test)] mod tests { + use crate::{DkgImpl, DkgKeyManager}; + use super::*; + use ic_artifact_pool::dkg_pool::DkgPoolImpl; use ic_consensus_mocks::{dependencies_with_subnet_params, Dependencies}; + use ic_crypto_temp_crypto::{NodeKeysToGenerate, TempCryptoComponent}; + use ic_interfaces::consensus_pool::ConsensusPool; + use ic_interfaces::p2p::consensus::MutablePool; + use ic_interfaces::{dkg::ChangeAction, p2p::consensus::PoolMutationsProducer}; use ic_logger::no_op_logger; use ic_metrics::MetricsRegistry; + use ic_registry_keys::make_subnet_record_key; use ic_test_utilities_consensus::fake::FakeContentSigner; use ic_test_utilities_registry::SubnetRecordBuilder; use ic_test_utilities_types::ids::{ node_test_id, subnet_test_id, NODE_1, NODE_2, NODE_3, SUBNET_1, SUBNET_2, }; + use ic_types::time::UNIX_EPOCH; use ic_types::{ batch::BatchPayload, consensus::{ @@ -314,7 +314,8 @@ mod tests { crypto::threshold_sig::ni_dkg::{NiDkgDealing, NiDkgId, NiDkgTag, NiDkgTargetSubnet}, RegistryVersion, }; - use std::ops::Deref; + use std::sync::Arc; + use std::{ops::Deref, sync::Mutex}; /// This tests the `validate_payload` function. /// It sets up a subnet with 4 nodes and a dkg interval of 4. @@ -621,4 +622,168 @@ mod tests { &["type"], ) } + + /// Test that dealings are created aand validated using the same registry version + #[test] + fn test_validate_payload_dealings_registry_version() { + let registry_version_start = RegistryVersion::new(1); + let registry_version_active = RegistryVersion::new(5); + // The node is registered at registry verions 5, at which point its node keys exist. + let node_id = node_test_id(1); + let subnet_id = subnet_test_id(0); + let crypto = TempCryptoComponent::builder() + .with_node_id(node_id) + .with_keys_in_registry_version(NodeKeysToGenerate::all(), registry_version_active) + .build_arc(); + let committee = vec![node_id]; + let dkg_interval_length = 9; + + ic_test_utilities::artifact_pool_config::with_test_pool_config(|pool_config| { + let Dependencies { + mut pool, + registry, + state_manager, + registry_data_provider, + .. + } = dependencies_with_subnet_params( + pool_config, + subnet_id, + vec![( + registry_version_start.get(), + SubnetRecordBuilder::from(&committee) + .with_dkg_interval_length(dkg_interval_length) + .build(), + )], + ); + + // Both summary registry versions should be 1 initially + let summary_block = pool.as_cache().summary_block(); + assert_eq!(summary_block.height.get(), 0); + assert_eq!( + summary_block.context.registry_version, + registry_version_start + ); + assert_eq!( + summary_block + .payload + .as_ref() + .as_summary() + .dkg + .registry_version, + registry_version_start + ); + + // Bump the registry version (by creating a random subnet) + registry_data_provider + .add( + &make_subnet_record_key(subnet_test_id(5)), + registry_version_active, + Some(ic_types::subnet_id_into_protobuf(subnet_test_id(5))), + ) + .unwrap(); + registry.update_to_latest_version(); + + // Advance pool by one DKG interval + pool.advance_round_normal_operation_n(dkg_interval_length + 1); + + // The context summary registry version should now be the active version + let summary_block = pool.as_cache().summary_block(); + assert_eq!(summary_block.height.get(), 10); + assert_eq!( + summary_block.context.registry_version, + registry_version_active + ); + let dkg_summary = &summary_block.payload.as_ref().as_summary().dkg; + assert_eq!(dkg_summary.registry_version, registry_version_start); + + // Create the DKG components + let key_manager = DkgKeyManager::new( + MetricsRegistry::new(), + crypto.clone(), + no_op_logger(), + &PoolReader::new(&pool), + ); + let key_manager = Arc::new(Mutex::new(key_manager)); + let dkg_impl = DkgImpl::new( + node_id, + crypto.clone(), + pool.get_cache(), + key_manager, + MetricsRegistry::new(), + no_op_logger(), + ); + let mut dkg_pool = DkgPoolImpl::new(MetricsRegistry::new(), no_op_logger()); + // Update start height + let start_height = Height::new(10); + dkg_pool.apply(vec![ChangeAction::Purge(start_height)]); + + // It should be possible to create a dealing + let result = dkg_impl.on_state_change(&dkg_pool); + let first = result.first().unwrap(); + let ChangeAction::AddToValidated(ref dealing) = first else { + panic!("Unexpected change action: {first:?}") + }; + + // It should be possible to validate the dealing + let result = dkg_impl.validate_dealings_for_dealer( + &dkg_pool, + &dkg_summary.configs, + start_height, + vec![dealing], + ); + let first = result.first().unwrap(); + let ChangeAction::MoveToValidated(ref dealing_validated) = first else { + panic!("Unexpected change action: {first:?}") + }; + assert_eq!(dealing, dealing_validated); + + // It should be possible to validate the dealing as part of a block payload + let parent = Block::from(pool.make_next_block()); + let context = ValidationContext { + registry_version: registry_version_active, + certified_height: Height::from(0), + time: UNIX_EPOCH, + }; + let block_payload = BlockPayload::Data(DataPayload { + batch: BatchPayload::default(), + dkg: DkgDataPayload::new(start_height, vec![dealing.clone()]), + idkg: idkg::Payload::default(), + }); + + let result = validate_payload( + subnet_id, + registry.as_ref(), + crypto.as_ref(), + &PoolReader::new(&pool), + &dkg_pool, + parent.clone(), + &block_payload, + state_manager.as_ref(), + &context, + &mock_metrics(), + &no_op_logger(), + ); + assert!(result.is_ok()); + + // Add the dealing to the validated pool + dkg_pool.apply(vec![ChangeAction::AddToValidated(dealing.clone())]); + + // It should be possible to validate the dealing as part of a block payload, + // even if the dealing is already part of the validated pool + let result = validate_payload( + subnet_id, + registry.as_ref(), + crypto.as_ref(), + &PoolReader::new(&pool), + &dkg_pool, + parent, + &block_payload, + state_manager.as_ref(), + &context, + &mock_metrics(), + &no_op_logger(), + ); + assert!(result.is_ok()); + }) + } } diff --git a/rs/consensus/dkg/src/utils.rs b/rs/consensus/dkg/src/utils.rs index 4b187cecd17..6f35f856494 100644 --- a/rs/consensus/dkg/src/utils.rs +++ b/rs/consensus/dkg/src/utils.rs @@ -1,8 +1,12 @@ +use crate::PayloadCreationError; use ic_consensus_utils::pool_reader::PoolReader; +use ic_interfaces_registry::RegistryClient; +use ic_management_canister_types_private::MasterPublicKeyId; +use ic_registry_client_helpers::subnet::SubnetRegistry; use ic_types::{ consensus::Block, - crypto::threshold_sig::ni_dkg::{NiDkgDealing, NiDkgId}, - NodeId, + crypto::threshold_sig::ni_dkg::{NiDkgDealing, NiDkgId, NiDkgMasterPublicKeyId, NiDkgTag}, + NodeId, RegistryVersion, SubnetId, }; use std::collections::{BTreeMap, HashSet}; @@ -50,3 +54,112 @@ pub(super) fn get_dkg_dealings( acc }) } + +/// Fetch all key ids for which the subnet should hold a key +pub(crate) fn vetkd_key_ids_for_subnet( + subnet_id: SubnetId, + registry_client: &dyn RegistryClient, + registry_version: RegistryVersion, +) -> Result, PayloadCreationError> { + let Some(chain_key_config) = registry_client + .get_chain_key_config(subnet_id, registry_version) + .map_err(PayloadCreationError::FailedToGetVetKdKeyList)? + else { + return Ok(vec![]); + }; + + let keys = chain_key_config + .key_configs + .into_iter() + .filter_map(|config| match config.key_id { + MasterPublicKeyId::VetKd(key_id) => Some(NiDkgMasterPublicKeyId::VetKd(key_id)), + _ => None, + }) + .collect::>(); + + Ok(keys) +} + +/// Iterate over all [`NiDkgTag`]s, i.e. high and low threshold as well as all key ids +pub(crate) fn tags_iter( + vet_keys: &[NiDkgMasterPublicKeyId], +) -> impl Iterator + use<'_> { + // Currently we assume that we run DKGs for all of these tags. + const TAGS: [NiDkgTag; 2] = [NiDkgTag::LowThreshold, NiDkgTag::HighThreshold]; + TAGS.iter() + .cloned() + .chain(vet_keys.iter().cloned().map(NiDkgTag::HighThresholdForKey)) +} + +#[cfg(test)] +mod tests { + use crate::utils::vetkd_key_ids_for_subnet; + use ic_interfaces_registry::RegistryValue; + use ic_interfaces_registry_mocks::MockRegistryClient; + use ic_management_canister_types_private::{ + MasterPublicKeyId, SchnorrAlgorithm, SchnorrKeyId, VetKdCurve, VetKdKeyId, + }; + use ic_registry_subnet_features::{ChainKeyConfig, KeyConfig}; + use ic_test_utilities_registry::SubnetRecordBuilder; + use ic_test_utilities_types::ids::subnet_test_id; + use ic_types::{crypto::threshold_sig::ni_dkg::NiDkgMasterPublicKeyId, RegistryVersion}; + + /// Test that `get_enabled_vet_keys` correctly extracts the vet keys that are in the [`SubnetRecord`] of the + /// subnet. + #[test] + fn test_get_vet_keys_for_subnet() { + let mut registry = MockRegistryClient::new(); + + // Create a [`SubnetRecord`] with two VetKD keys and a Schnorr key (which should be ignored) + let subnet_record = SubnetRecordBuilder::new() + .with_chain_key_config(ChainKeyConfig { + key_configs: vec![ + KeyConfig { + key_id: MasterPublicKeyId::Schnorr(SchnorrKeyId { + algorithm: SchnorrAlgorithm::Ed25519, + name: String::from("schnorr_key_to_ignore"), + }), + pre_signatures_to_create_in_advance: 50, + max_queue_size: 50, + }, + KeyConfig { + key_id: MasterPublicKeyId::VetKd(VetKdKeyId { + curve: VetKdCurve::Bls12_381_G2, + name: String::from("first_vet_kd_key"), + }), + pre_signatures_to_create_in_advance: 50, + max_queue_size: 50, + }, + KeyConfig { + key_id: MasterPublicKeyId::VetKd(VetKdKeyId { + curve: VetKdCurve::Bls12_381_G2, + name: String::from("second_vet_kd_key"), + }), + pre_signatures_to_create_in_advance: 50, + max_queue_size: 50, + }, + ], + signature_request_timeout_ns: None, + idkg_key_rotation_period_ms: None, + }) + .build(); + + registry.expect_get_value().return_const({ + let mut v = Vec::new(); + subnet_record.encode(&mut v).unwrap(); + Ok(Some(v)) + }); + + // Check that the two expected keys are contained in the output and no unexpected other keys + let vetkeys = + vetkd_key_ids_for_subnet(subnet_test_id(1), ®istry, RegistryVersion::default()) + .unwrap(); + assert_eq!(vetkeys.len(), 2); + assert!( + matches!(&vetkeys[0], NiDkgMasterPublicKeyId::VetKd(key) if key.name == "first_vet_kd_key") + ); + assert!( + matches!(&vetkeys[1], NiDkgMasterPublicKeyId::VetKd(key) if key.name == "second_vet_kd_key") + ); + } +} diff --git a/rs/consensus/src/consensus/batch_delivery.rs b/rs/consensus/src/consensus/batch_delivery.rs index def870cdf2e..e1654b8c501 100644 --- a/rs/consensus/src/consensus/batch_delivery.rs +++ b/rs/consensus/src/consensus/batch_delivery.rs @@ -19,7 +19,7 @@ use ic_interfaces::{ }; use ic_interfaces_registry::RegistryClient; use ic_logger::{debug, error, info, warn, ReplicaLogger}; -use ic_management_canister_types::SetupInitialDKGResponse; +use ic_management_canister_types_private::SetupInitialDKGResponse; use ic_protobuf::{ log::consensus_log_entry::v1::ConsensusLogEntry, registry::{crypto::v1::PublicKey as PublicKeyProto, subnet::v1::InitialNiDkgTranscriptRecord}, diff --git a/rs/consensus/src/consensus/finalizer.rs b/rs/consensus/src/consensus/finalizer.rs index e4d1183072e..e380443cbb8 100644 --- a/rs/consensus/src/consensus/finalizer.rs +++ b/rs/consensus/src/consensus/finalizer.rs @@ -259,7 +259,7 @@ mod tests { use ic_consensus_mocks::{dependencies, dependencies_with_subnet_params, Dependencies}; use ic_crypto_test_utils_ni_dkg::dummy_transcript_for_tests; use ic_logger::replica_logger::no_op_logger; - use ic_management_canister_types::SetupInitialDKGResponse; + use ic_management_canister_types_private::SetupInitialDKGResponse; use ic_metrics::MetricsRegistry; use ic_registry_subnet_type::SubnetType; use ic_replicated_state::{ diff --git a/rs/consensus/src/idkg/complaints.rs b/rs/consensus/src/idkg/complaints.rs index b1a5db8a4ce..c8530d96689 100644 --- a/rs/consensus/src/idkg/complaints.rs +++ b/rs/consensus/src/idkg/complaints.rs @@ -1070,7 +1070,7 @@ mod tests { // Tests validation of the received complaints #[test] fn test_validate_complaints_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_validate_complaints(key_id); } @@ -1311,7 +1311,7 @@ mod tests { // Tests that openings are sent for eligible complaints #[test] fn test_send_openings_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_send_openings(key_id); } @@ -1427,7 +1427,7 @@ mod tests { // Tests the validation of received openings #[test] fn test_validate_openings_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_validate_openings(key_id); } @@ -1899,7 +1899,7 @@ mod tests { // Tests that crypto failure when creating complaint leads to transcript load failure #[test] fn test_load_transcript_failure_to_create_complaint_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_load_transcript_failure_to_create_complaint(key_id); } diff --git a/rs/consensus/src/idkg/payload_builder.rs b/rs/consensus/src/idkg/payload_builder.rs index 5b525d4b520..8abc956febe 100644 --- a/rs/consensus/src/idkg/payload_builder.rs +++ b/rs/consensus/src/idkg/payload_builder.rs @@ -696,7 +696,7 @@ mod tests { use ic_crypto_test_utils_reproducible_rng::{reproducible_rng, ReproducibleRng}; use ic_interfaces_registry::RegistryValue; use ic_logger::replica_logger::no_op_logger; - use ic_management_canister_types::MasterPublicKeyId; + use ic_management_canister_types_private::MasterPublicKeyId; use ic_metrics::MetricsRegistry; use ic_protobuf::types::v1 as pb; use ic_registry_subnet_features::KeyConfig; @@ -835,7 +835,7 @@ mod tests { #[test] fn test_pre_signature_recreation_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_pre_signature_recreation(key_id); } @@ -931,7 +931,7 @@ mod tests { #[test] fn test_signing_request_timeout_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_signing_request_timeout(key_id); } @@ -1000,7 +1000,7 @@ mod tests { #[test] fn test_request_with_invalid_key_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_request_with_invalid_key(key_id); } @@ -1070,7 +1070,7 @@ mod tests { #[test] fn test_signature_is_only_delivered_once_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_signature_is_only_delivered_once(key_id); } @@ -1081,7 +1081,7 @@ mod tests { let pre_sig_id = create_available_pre_signature(&mut idkg_payload, key_id.clone(), 13); let request_id = request_id(0, Height::from(0)); let context = - fake_signature_request_context_from_id(key_id.clone(), pre_sig_id, request_id); + fake_signature_request_context_from_id(key_id.clone().into(), pre_sig_id, request_id); let signature_request_contexts = BTreeMap::from([context.clone()]); let signature_request_contexts = into_idkg_contexts(&signature_request_contexts); @@ -1159,7 +1159,7 @@ mod tests { #[test] fn test_update_summary_refs_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_update_summary_refs(key_id); } @@ -1196,8 +1196,8 @@ mod tests { let mut reshare_refs = BTreeMap::new(); reshare_refs.insert(*reshare_key_transcript_ref.as_ref(), reshare_key_transcript); - let inputs_1 = create_sig_inputs_with_height(91, summary_height, key_id.clone()); - let inputs_2 = create_sig_inputs_with_height(92, summary_height, key_id.clone()); + let inputs_1 = create_sig_inputs_with_height(91, summary_height, key_id.clone().into()); + let inputs_2 = create_sig_inputs_with_height(92, summary_height, key_id.clone().into()); let summary_block = create_summary_block_with_transcripts( key_id.clone(), subnet_id, @@ -1210,12 +1210,14 @@ mod tests { ], ); add_block(summary_block, summary_height.get(), &mut pool); - let presig_1 = inputs_2.sig_inputs_ref.pre_signature(); + let presig_1 = inputs_2.sig_inputs_ref.pre_signature().unwrap(); // Create payload blocks with transcripts let payload_height_1 = Height::new(10); - let inputs_1 = create_sig_inputs_with_height(93, payload_height_1, key_id.clone()); - let inputs_2 = create_sig_inputs_with_height(94, payload_height_1, key_id.clone()); + let inputs_1 = + create_sig_inputs_with_height(93, payload_height_1, key_id.clone().into()); + let inputs_2 = + create_sig_inputs_with_height(94, payload_height_1, key_id.clone().into()); let (reshare_key_transcript, reshare_key_transcript_ref, _) = generate_key_transcript(&key_id, &env, &mut rng, payload_height_1); let mut reshare_refs = BTreeMap::new(); @@ -1235,7 +1237,7 @@ mod tests { payload_height_1.get() - summary_height.get(), &mut pool, ); - let presig_2 = inputs_2.sig_inputs_ref.pre_signature(); + let presig_2 = inputs_2.sig_inputs_ref.pre_signature().unwrap(); // Create a payload block with references to these past blocks let mut idkg_payload = empty_idkg_payload_with_key_ids(subnet_id, vec![key_id.clone()]); @@ -1419,7 +1421,7 @@ mod tests { #[test] fn test_summary_proto_conversion_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_summary_proto_conversion(key_id); } @@ -1449,8 +1451,8 @@ mod tests { let mut reshare_refs = BTreeMap::new(); reshare_refs.insert(*reshare_key_transcript_ref.as_ref(), reshare_key_transcript); - let inputs_1 = create_sig_inputs_with_height(91, summary_height, key_id.clone()); - let inputs_2 = create_sig_inputs_with_height(92, summary_height, key_id.clone()); + let inputs_1 = create_sig_inputs_with_height(91, summary_height, key_id.clone().into()); + let inputs_2 = create_sig_inputs_with_height(92, summary_height, key_id.clone().into()); let summary_block = create_summary_block_with_transcripts( key_id.clone(), subnet_id, @@ -1465,12 +1467,14 @@ mod tests { let b = add_block(summary_block, summary_height.get(), &mut pool); assert_proposal_conversion(b); - let presig_1 = inputs_2.sig_inputs_ref.pre_signature(); + let presig_1 = inputs_2.sig_inputs_ref.pre_signature().unwrap(); // Create payload blocks with transcripts let payload_height_1 = Height::new(10); - let inputs_1 = create_sig_inputs_with_height(93, payload_height_1, key_id.clone()); - let inputs_2 = create_sig_inputs_with_height(94, payload_height_1, key_id.clone()); + let inputs_1 = + create_sig_inputs_with_height(93, payload_height_1, key_id.clone().into()); + let inputs_2 = + create_sig_inputs_with_height(94, payload_height_1, key_id.clone().into()); let (reshare_key_transcript, reshare_key_transcript_ref, _) = generate_key_transcript(&key_id, &env, &mut rng, payload_height_1); let mut reshare_refs = BTreeMap::new(); @@ -1493,7 +1497,7 @@ mod tests { ); assert_proposal_conversion(b); - let presig_2 = inputs_2.sig_inputs_ref.pre_signature(); + let presig_2 = inputs_2.sig_inputs_ref.pre_signature().unwrap(); // Create a payload block with references to these past blocks let mut idkg_payload = empty_idkg_payload_with_key_ids(subnet_id, vec![key_id.clone()]); @@ -1710,7 +1714,7 @@ mod tests { #[test] fn test_no_creation_after_successful_creation_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_no_creation_after_successful_creation(key_id); } @@ -1850,7 +1854,7 @@ mod tests { #[test] fn test_incomplete_reshare_doesnt_purge_pre_signatures_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_incomplete_reshare_doesnt_purge_pre_signatures(key_id); } @@ -1952,7 +1956,7 @@ mod tests { }; payload_0.available_pre_signatures.insert( payload_0.uid_generator.next_pre_signature_id(), - test_inputs.sig_inputs_ref.pre_signature(), + test_inputs.sig_inputs_ref.pre_signature().unwrap(), ); for (transcript_ref, transcript) in test_inputs.idkg_transcripts { block_reader.add_transcript(transcript_ref, transcript); @@ -2199,7 +2203,7 @@ mod tests { #[test] fn test_if_next_in_creation_continues_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_if_next_in_creation_continues(key_id); } @@ -2349,7 +2353,7 @@ mod tests { #[test] fn test_next_in_creation_with_initial_dealings_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_next_in_creation_with_initial_dealings(key_id); } diff --git a/rs/consensus/src/idkg/payload_builder/key_transcript.rs b/rs/consensus/src/idkg/payload_builder/key_transcript.rs index 1d3f3de727f..9c358aeab22 100644 --- a/rs/consensus/src/idkg/payload_builder/key_transcript.rs +++ b/rs/consensus/src/idkg/payload_builder/key_transcript.rs @@ -218,7 +218,7 @@ mod tests { }; use ic_crypto_test_utils_reproducible_rng::{reproducible_rng, ReproducibleRng}; use ic_logger::replica_logger::no_op_logger; - use ic_management_canister_types::{EcdsaKeyId, MasterPublicKeyId}; + use ic_management_canister_types_private::{EcdsaKeyId, MasterPublicKeyId}; use ic_test_utilities_types::ids::subnet_test_id; use ic_types::consensus::idkg::HasIDkgMasterPublicKeyId; use ic_types::consensus::idkg::IDkgMasterPublicKeyId; @@ -231,7 +231,7 @@ mod tests { use crate::idkg::{ test_utils::{ create_reshare_unmasked_transcript_param, - fake_master_public_key_ids_for_all_algorithms, set_up_idkg_payload, + fake_master_public_key_ids_for_all_idkg_algorithms, set_up_idkg_payload, IDkgPayloadTestHelper, TestIDkgBlockReader, TestIDkgTranscriptBuilder, }, utils::algorithm_for_key_id, @@ -296,7 +296,7 @@ mod tests { #[test] fn test_update_next_key_transcript_single_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_update_next_key_transcript_single(key_id); } @@ -484,7 +484,7 @@ mod tests { #[test] fn test_update_next_key_transcript_xnet_target_subnet_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_update_next_key_transcript_xnet_target_subnet_single(key_id); } diff --git a/rs/consensus/src/idkg/payload_builder/pre_signatures.rs b/rs/consensus/src/idkg/payload_builder/pre_signatures.rs index 6c78ec41e2b..9510ba2ef31 100644 --- a/rs/consensus/src/idkg/payload_builder/pre_signatures.rs +++ b/rs/consensus/src/idkg/payload_builder/pre_signatures.rs @@ -2,7 +2,7 @@ use super::IDkgPayloadError; use crate::idkg::{pre_signer::IDkgTranscriptBuilder, utils::algorithm_for_key_id}; use ic_logger::{debug, error, ReplicaLogger}; -use ic_management_canister_types::MasterPublicKeyId; +use ic_management_canister_types_private::MasterPublicKeyId; use ic_registry_subnet_features::ChainKeyConfig; use ic_replicated_state::metadata_state::subnet_call_context_manager::IDkgSignWithThresholdContext; use ic_types::{ @@ -539,7 +539,7 @@ pub(super) mod tests { use crate::idkg::test_utils::{ create_available_pre_signature, create_available_pre_signature_with_key_transcript, - fake_ecdsa_idkg_master_public_key_id, fake_master_public_key_ids_for_all_algorithms, + fake_ecdsa_idkg_master_public_key_id, fake_master_public_key_ids_for_all_idkg_algorithms, fake_schnorr_idkg_master_public_key_id, fake_schnorr_key_id, fake_signature_request_context_with_pre_sig, into_idkg_contexts, request_id, set_up_idkg_payload, IDkgPayloadTestHelper, TestIDkgBlockReader, TestIDkgTranscriptBuilder, @@ -550,7 +550,7 @@ pub(super) mod tests { }; use ic_crypto_test_utils_reproducible_rng::{reproducible_rng, ReproducibleRng}; use ic_logger::replica_logger::no_op_logger; - use ic_management_canister_types::SchnorrAlgorithm; + use ic_management_canister_types_private::SchnorrAlgorithm; use ic_registry_subnet_features::KeyConfig; use ic_test_utilities_types::ids::{node_test_id, subnet_test_id}; use ic_types::{ @@ -647,7 +647,7 @@ pub(super) mod tests { #[test] fn test_make_new_pre_signatures_if_needed_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_make_new_pre_signatures_if_needed(key_id); } @@ -1059,7 +1059,7 @@ pub(super) mod tests { #[test] fn test_matched_pre_signatures_are_not_purged_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_matched_pre_signatures_are_not_purged(key_id); } @@ -1129,7 +1129,7 @@ pub(super) mod tests { #[test] fn test_unmatched_pre_signatures_of_current_key_are_not_purged_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_unmatched_pre_signatures_of_current_key_are_not_purged(key_id); } @@ -1167,7 +1167,7 @@ pub(super) mod tests { #[test] fn test_unmatched_pre_signatures_of_different_key_are_purged_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_unmatched_pre_signatures_of_different_key_are_purged(key_id); } diff --git a/rs/consensus/src/idkg/payload_builder/resharing.rs b/rs/consensus/src/idkg/payload_builder/resharing.rs index 64486161031..a83afb9369a 100644 --- a/rs/consensus/src/idkg/payload_builder/resharing.rs +++ b/rs/consensus/src/idkg/payload_builder/resharing.rs @@ -66,7 +66,7 @@ fn make_reshare_dealings_response( ic_types::batch::ConsensusResponse::new( *callback_id, ic_types::messages::Payload::Data( - ic_management_canister_types::ComputeInitialIDkgDealingsResponse { + ic_management_canister_types_private::ComputeInitialIDkgDealingsResponse { initial_dkg_dealings: initial_dealings.into(), } .encode(), @@ -185,7 +185,7 @@ mod tests { }; use ic_crypto_test_utils_reproducible_rng::reproducible_rng; use ic_logger::replica_logger::no_op_logger; - use ic_management_canister_types::ComputeInitialIDkgDealingsResponse; + use ic_management_canister_types_private::ComputeInitialIDkgDealingsResponse; use ic_test_utilities_types::ids::subnet_test_id; use ic_types::consensus::idkg::IDkgMasterPublicKeyId; use ic_types::consensus::idkg::IDkgPayload; @@ -193,8 +193,9 @@ mod tests { use crate::idkg::{ test_utils::{ create_reshare_request, dealings_context_from_reshare_request, - fake_ecdsa_idkg_master_public_key_id, fake_master_public_key_ids_for_all_algorithms, - set_up_idkg_payload, TestIDkgBlockReader, TestIDkgTranscriptBuilder, + fake_ecdsa_idkg_master_public_key_id, + fake_master_public_key_ids_for_all_idkg_algorithms, set_up_idkg_payload, + TestIDkgBlockReader, TestIDkgTranscriptBuilder, }, utils::algorithm_for_key_id, }; @@ -222,7 +223,7 @@ mod tests { ic_types::batch::ConsensusResponse::new( callback_id, ic_types::messages::Payload::Data( - ic_management_canister_types::ComputeInitialIDkgDealingsResponse { + ic_management_canister_types_private::ComputeInitialIDkgDealingsResponse { initial_dkg_dealings: initial_dealings.into(), } .encode(), @@ -234,7 +235,7 @@ mod tests { fn test_make_reshare_dealings_response() { let mut contexts = BTreeMap::new(); let mut initial_dealings = BTreeMap::new(); - for (i, key_id) in fake_master_public_key_ids_for_all_algorithms() + for (i, key_id) in fake_master_public_key_ids_for_all_idkg_algorithms() .iter() .enumerate() { @@ -251,7 +252,7 @@ mod tests { ); } - for (i, key_id) in fake_master_public_key_ids_for_all_algorithms() + for (i, key_id) in fake_master_public_key_ids_for_all_idkg_algorithms() .iter() .enumerate() { @@ -289,7 +290,7 @@ mod tests { #[test] fn test_initiate_reshare_requests_should_not_accept_when_key_transcript_not_created() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); let (mut payload, _block_reader) = set_up( vec![key_id.clone()], @@ -306,7 +307,7 @@ mod tests { #[test] fn test_initiate_reshare_requests_good_path() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); let (mut payload, _block_reader) = set_up( vec![key_id.clone()], @@ -328,7 +329,7 @@ mod tests { #[test] fn test_initiate_reshare_requests_incremental() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); let (mut payload, _block_reader) = set_up( vec![key_id.clone()], @@ -359,7 +360,7 @@ mod tests { #[test] fn test_initiate_reshare_requests_should_not_accept_already_completed() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); let (mut payload, _block_reader) = set_up( vec![key_id.clone()], @@ -380,7 +381,7 @@ mod tests { #[test] fn test_ecdsa_update_completed_reshare_requests_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_ecdsa_update_completed_reshare_requests(key_id); } diff --git a/rs/consensus/src/idkg/payload_builder/signatures.rs b/rs/consensus/src/idkg/payload_builder/signatures.rs index b7c9b376058..838dfea751d 100644 --- a/rs/consensus/src/idkg/payload_builder/signatures.rs +++ b/rs/consensus/src/idkg/payload_builder/signatures.rs @@ -1,5 +1,5 @@ use ic_error_types::RejectCode; -use ic_management_canister_types::{Payload, SignWithECDSAReply, SignWithSchnorrReply}; +use ic_management_canister_types_private::{Payload, SignWithECDSAReply, SignWithSchnorrReply}; use ic_replicated_state::metadata_state::subnet_call_context_manager::IDkgSignWithThresholdContext; use ic_types::{ consensus::idkg::{self, common::CombinedSignature, IDkgMasterPublicKeyId}, @@ -163,14 +163,14 @@ pub(crate) fn update_signature_agreements( mod tests { use crate::idkg::test_utils::{ create_available_pre_signature, empty_idkg_payload_with_key_ids, empty_response, - fake_ecdsa_idkg_master_public_key_id, fake_master_public_key_ids_for_all_algorithms, + fake_ecdsa_idkg_master_public_key_id, fake_master_public_key_ids_for_all_idkg_algorithms, fake_signature_request_context, fake_signature_request_context_from_id, fake_signature_request_context_with_pre_sig, fake_vetkd_master_public_key_id, into_idkg_contexts, request_id, set_up_idkg_payload, TestThresholdSignatureBuilder, }; use assert_matches::assert_matches; use ic_crypto_test_utils_reproducible_rng::reproducible_rng; - use ic_management_canister_types::MasterPublicKeyId; + use ic_management_canister_types_private::MasterPublicKeyId; use ic_replicated_state::metadata_state::subnet_call_context_manager::SignWithThresholdContext; use ic_test_utilities_types::ids::subnet_test_id; use ic_types::{ @@ -258,7 +258,7 @@ mod tests { #[test] fn test_update_signature_agreements_success_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_update_signature_agreements_success(key_id); } @@ -278,11 +278,11 @@ mod tests { let contexts = BTreeMap::from([ // insert request without completed signature - fake_signature_request_context_from_id(key_id.clone(), pre_sig_ids[0], ids[0]), + fake_signature_request_context_from_id(key_id.clone().into(), pre_sig_ids[0], ids[0]), // insert request to be completed - fake_signature_request_context_from_id(key_id.clone(), pre_sig_ids[1], ids[1]), + fake_signature_request_context_from_id(key_id.clone().into(), pre_sig_ids[1], ids[1]), // insert request that was already completed - fake_signature_request_context_from_id(key_id.clone(), pre_sig_ids[2], ids[2]), + fake_signature_request_context_from_id(key_id.clone().into(), pre_sig_ids[2], ids[2]), // insert request without a matched pre-signature fake_signature_request_context_with_pre_sig(ids[3], key_id.clone(), None), // insert request matched to a non-existent pre-signature @@ -383,7 +383,11 @@ mod tests { let contexts = BTreeMap::from([ // insert ecdsa request to be completed - fake_signature_request_context_from_id(ecdsa_key_id.clone(), pre_sig_ids[0], ids[0]), + fake_signature_request_context_from_id( + ecdsa_key_id.clone().into(), + pre_sig_ids[0], + ids[0], + ), // insert vet kd request to be ignored ( ids[1].callback_id, diff --git a/rs/consensus/src/idkg/payload_verifier.rs b/rs/consensus/src/idkg/payload_verifier.rs index 9d2b9fc8088..bdca902d947 100644 --- a/rs/consensus/src/idkg/payload_verifier.rs +++ b/rs/consensus/src/idkg/payload_verifier.rs @@ -37,7 +37,7 @@ use ic_interfaces::crypto::{ThresholdEcdsaSigVerifier, ThresholdSchnorrSigVerifi use ic_interfaces::validation::{ValidationError, ValidationResult}; use ic_interfaces_registry::RegistryClient; use ic_interfaces_state_manager::{StateManager, StateManagerError}; -use ic_management_canister_types::{Payload, SignWithECDSAReply, SignWithSchnorrReply}; +use ic_management_canister_types_private::{Payload, SignWithECDSAReply, SignWithSchnorrReply}; use ic_replicated_state::metadata_state::subnet_call_context_manager::{ IDkgSignWithThresholdContext, SignWithThresholdContext, }; @@ -511,7 +511,7 @@ fn validate_reshare_dealings( for (request, config) in prev_payload.ongoing_xnet_reshares.iter() { if !curr_payload.ongoing_xnet_reshares.contains_key(request) { if let Some(response) = new_reshare_agreement.get(request) { - use ic_management_canister_types::ComputeInitialIDkgDealingsResponse; + use ic_management_canister_types_private::ComputeInitialIDkgDealingsResponse; if let ic_types::messages::Payload::Data(data) = &response.payload { let dealings_response = ComputeInitialIDkgDealingsResponse::decode(data) .map_err(|err| { @@ -629,7 +629,7 @@ mod test { use ic_crypto_test_utils_reproducible_rng::reproducible_rng; use ic_interfaces_state_manager::CertifiedStateSnapshot; use ic_logger::replica_logger::no_op_logger; - use ic_management_canister_types::{ + use ic_management_canister_types_private::{ MasterPublicKeyId, Payload, SchnorrAlgorithm, SignWithECDSAReply, }; use ic_test_utilities::crypto::CryptoReturningOk; @@ -648,7 +648,7 @@ mod test { #[test] fn test_validate_transcript_refs_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_validate_transcript_refs(key_id); } @@ -763,7 +763,7 @@ mod test { #[test] fn test_validate_reshare_dealings_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_validate_reshare_dealings(key_id); } @@ -868,7 +868,7 @@ mod test { #[test] fn test_validate_new_signature_agreements_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_validate_new_signature_agreements(key_id); } @@ -899,8 +899,8 @@ mod test { // There are three requests in state, two are completed, one is still // missing its nonce. let signature_request_contexts = BTreeMap::from_iter([ - fake_signature_request_context_from_id(key_id.clone(), pre_sig_id1, ids[0]), - fake_signature_request_context_from_id(key_id.clone(), pre_sig_id2, ids[1]), + fake_signature_request_context_from_id(key_id.clone().into(), pre_sig_id1, ids[0]), + fake_signature_request_context_from_id(key_id.clone().into(), pre_sig_id2, ids[1]), fake_signature_request_context_with_pre_sig(ids[2], key_id.clone(), Some(pre_sig_id3)), ]); let snapshot = @@ -1034,7 +1034,7 @@ mod test { #[test] fn test_validate_new_signature_agreements_missing_input_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_validate_new_signature_agreements_missing_input(key_id); } @@ -1055,7 +1055,7 @@ mod test { let signature_request_contexts = BTreeMap::from_iter([ fake_signature_request_context_with_pre_sig(id1, key_id.clone(), Some(pre_sig_id)), - fake_signature_request_context_from_id(key_id.clone(), pre_sig_id2, id2), + fake_signature_request_context_from_id(key_id.clone().into(), pre_sig_id2, id2), ]); let snapshot = fake_state_with_signature_requests(height, signature_request_contexts.clone()); diff --git a/rs/consensus/src/idkg/pre_signer.rs b/rs/consensus/src/idkg/pre_signer.rs index bbf5bd39f08..a868f8043c8 100644 --- a/rs/consensus/src/idkg/pre_signer.rs +++ b/rs/consensus/src/idkg/pre_signer.rs @@ -1427,7 +1427,7 @@ mod tests { // in progress are filtered out. #[test] fn test_send_dealings_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_send_dealings(key_id); } @@ -1529,7 +1529,7 @@ mod tests { // specified by the transcript params #[test] fn test_non_dealers_dont_send_dealings_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_non_dealers_dont_send_dealings(key_id); } @@ -1589,7 +1589,7 @@ mod tests { // results in complaints. #[test] fn test_send_dealings_with_complaints_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_send_dealings_with_complaints(key_id); } @@ -1667,7 +1667,7 @@ mod tests { // requests, and others dealings are either deferred or dropped. #[test] fn test_validate_dealings_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_validate_dealings(key_id); } @@ -1836,7 +1836,7 @@ mod tests { // are dropped. #[test] fn test_duplicate_dealing_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_duplicate_dealing(key_id); } @@ -1881,7 +1881,7 @@ mod tests { // in the unvalidated pool are dropped. #[test] fn test_duplicate_dealing_in_batch_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_duplicate_dealing_in_batch(key_id); } @@ -1948,7 +1948,7 @@ mod tests { // transcript are dropped. #[test] fn test_unexpected_dealing_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_unexpected_dealing(key_id); } @@ -1985,7 +1985,7 @@ mod tests { // Tests that support shares are sent to eligible dealings #[test] fn test_send_support_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_send_support(key_id); } @@ -2028,7 +2028,7 @@ mod tests { // Tests that sending support shares is deferred if crypto returns transient error. #[test] fn test_defer_sending_dealing_support_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_defer_sending_dealing_support(key_id); } @@ -2076,7 +2076,7 @@ mod tests { // Tests that invalid dealings are handled invalid when creating new dealing support. #[test] fn test_dont_send_support_for_invalid_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_dont_send_support_for_invalid(key_id); } @@ -2117,7 +2117,7 @@ mod tests { // the transcript #[test] fn test_non_receivers_dont_send_support_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_non_receivers_dont_send_support(key_id); } @@ -2210,7 +2210,7 @@ mod tests { // transcript requests, and others dealings are either deferred or dropped. #[test] fn test_validate_dealing_support_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_validate_dealing_support(key_id); } @@ -2740,7 +2740,7 @@ mod tests { // Tests transcript builder failures and success #[test] fn test_transcript_builder_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_transcript_builder(key_id); } diff --git a/rs/consensus/src/idkg/signer.rs b/rs/consensus/src/idkg/signer.rs index 1b9aa8ff7d4..960d432c047 100644 --- a/rs/consensus/src/idkg/signer.rs +++ b/rs/consensus/src/idkg/signer.rs @@ -8,7 +8,7 @@ use ic_consensus_utils::RoundRobin; use ic_interfaces::consensus_pool::ConsensusBlockCache; use ic_interfaces::crypto::{ ErrorReproducibility, ThresholdEcdsaSigVerifier, ThresholdEcdsaSigner, - ThresholdSchnorrSigVerifier, ThresholdSchnorrSigner, + ThresholdSchnorrSigVerifier, ThresholdSchnorrSigner, VetKdProtocol, }; use ic_interfaces::idkg::{IDkgChangeAction, IDkgChangeSet, IDkgPool}; use ic_interfaces_state_manager::{CertifiedStateSnapshot, StateReader}; @@ -24,7 +24,7 @@ use ic_types::consensus::idkg::common::{ }; use ic_types::consensus::idkg::{ ecdsa_sig_share_prefix, vetkd_key_share_prefix, EcdsaSigShare, IDkgBlockReader, IDkgMessage, - IDkgStats, RequestId, + IDkgStats, RequestId, VetKdKeyShare, }; use ic_types::consensus::idkg::{schnorr_sig_share_prefix, SchnorrSigShare, SigShare}; use ic_types::crypto::canister_threshold_sig::error::ThresholdEcdsaCombineSigSharesError; @@ -33,9 +33,7 @@ use ic_types::crypto::canister_threshold_sig::error::{ ThresholdSchnorrCombineSigSharesError, ThresholdSchnorrCreateSigShareError, ThresholdSchnorrVerifySigShareError, }; -use ic_types::crypto::vetkd::{ - VetKdKeyShareCombinationError, VetKdKeyShareCreationError, VetKdKeyShareVerificationError, -}; +use ic_types::crypto::vetkd::{VetKdKeyShareCreationError, VetKdKeyShareVerificationError}; use ic_types::messages::CallbackId; use ic_types::{Height, NodeId}; use std::cell::RefCell; @@ -54,8 +52,6 @@ enum CreateSigShareError { } #[derive(Clone, Debug)] -// TODO(CON-1421): Remove once all errors are in use -#[allow(dead_code)] enum VerifySigShareError { Ecdsa(ThresholdEcdsaVerifySigShareError), Schnorr(ThresholdSchnorrVerifySigShareError), @@ -75,12 +71,10 @@ impl VerifySigShareError { } #[derive(Clone, Debug)] -// TODO(CON-1421): Remove once all errors are in use -#[allow(dead_code)] enum CombineSigSharesError { Ecdsa(ThresholdEcdsaCombineSigSharesError), Schnorr(ThresholdSchnorrCombineSigSharesError), - VetKd(VetKdKeyShareCombinationError), + VetKdUnexpected, } impl CombineSigSharesError { @@ -91,8 +85,6 @@ impl CombineSigSharesError { ThresholdEcdsaCombineSigSharesError::UnsatisfiedReconstructionThreshold { .. } ) | CombineSigSharesError::Schnorr( ThresholdSchnorrCombineSigSharesError::UnsatisfiedReconstructionThreshold { .. } - ) | CombineSigSharesError::VetKd( - VetKdKeyShareCombinationError::UnsatisfiedReconstructionThreshold { .. } ) ) } @@ -178,7 +170,7 @@ impl ThresholdSignerImpl { idkg_pool, transcript_loader, request_id, - &sig_inputs, + sig_inputs, ) }) .unwrap_or_default() @@ -379,9 +371,9 @@ impl ThresholdSignerImpl { idkg_pool: &dyn IDkgPool, transcript_loader: &dyn IDkgTranscriptLoader, request_id: RequestId, - sig_inputs: &ThresholdSigInputs, + sig_inputs: ThresholdSigInputs, ) -> IDkgChangeSet { - if let Some(changes) = self.load_dependencies(idkg_pool, transcript_loader, sig_inputs) { + if let Some(changes) = self.load_dependencies(idkg_pool, transcript_loader, &sig_inputs) { return changes; } @@ -404,11 +396,11 @@ impl ThresholdSignerImpl { fn crypto_create_sig_share( &self, request_id: RequestId, - sig_inputs: &ThresholdSigInputs, + sig_inputs: ThresholdSigInputs, ) -> Result { match sig_inputs { ThresholdSigInputs::Ecdsa(inputs) => { - ThresholdEcdsaSigner::create_sig_share(&*self.crypto, inputs).map_or_else( + ThresholdEcdsaSigner::create_sig_share(&*self.crypto, &inputs).map_or_else( |err| Err(CreateSigShareError::Ecdsa(err)), |share| { let sig_share = EcdsaSigShare { @@ -421,7 +413,7 @@ impl ThresholdSignerImpl { ) } ThresholdSigInputs::Schnorr(inputs) => { - ThresholdSchnorrSigner::create_sig_share(&*self.crypto, inputs).map_or_else( + ThresholdSchnorrSigner::create_sig_share(&*self.crypto, &inputs).map_or_else( |err| Err(CreateSigShareError::Schnorr(err)), |share| { let sig_share = SchnorrSigShare { @@ -433,8 +425,18 @@ impl ThresholdSignerImpl { }, ) } - ThresholdSigInputs::VetKd(_inputs) => { - todo!("CON-1421: Call crypto endpoint to create a VetKd share"); + ThresholdSigInputs::VetKd(inputs) => { + VetKdProtocol::create_encrypted_key_share(&*self.crypto, inputs).map_or_else( + |err| Err(CreateSigShareError::VetKd(Box::new(err))), + |share| { + let sig_share = VetKdKeyShare { + signer_id: self.node_id, + request_id, + share, + }; + Ok(IDkgMessage::VetKdKeyShare(sig_share)) + }, + ) } } } @@ -473,8 +475,17 @@ impl ThresholdSignerImpl { |_| Ok(IDkgMessage::SchnorrSigShare(share)), ) } - (ThresholdSigInputs::VetKd(_inputs), SigShare::VetKd(_share)) => { - todo!("CON-1421: Call crypto endpoint to verify VetKd share") + (ThresholdSigInputs::VetKd(inputs), SigShare::VetKd(share)) => { + VetKdProtocol::verify_encrypted_key_share( + &*self.crypto, + share.signer_id, + &share.share, + inputs, + ) + .map_or_else( + |err| Err(VerifySigShareError::VetKd(err)), + |_| Ok(IDkgMessage::VetKdKeyShare(share)), + ) } _ => Err(VerifySigShareError::ThresholdSchemeMismatch), }; @@ -710,16 +721,9 @@ impl<'a> ThresholdSignatureBuilderImpl<'a> { |share| Ok(CombinedSignature::Schnorr(share)), ) } - ThresholdSigInputs::VetKd(_inputs) => { - // Collect the VetKd shares for the request. - let mut sig_shares = BTreeMap::new(); - for (_, share) in self.idkg_pool.validated().vetkd_key_shares() { - if share.request_id == *request_id { - sig_shares.insert(share.signer_id, share.share.clone()); - } - } - todo!("CON-1421: Call crypto endpoint to combine VetKd shares"); - } + // We don't expect to combine VetKD shares here + // (this is done by the VetKD payload builder instead). + ThresholdSigInputs::VetKd(_) => Err(CombineSigSharesError::VetKdUnexpected), }; stats.record_sig_share_aggregation(request_id, start.elapsed()); ret @@ -857,10 +861,11 @@ mod tests { }; use ic_crypto_test_utils_reproducible_rng::reproducible_rng; use ic_interfaces::p2p::consensus::{MutablePool, UnvalidatedArtifact}; - use ic_management_canister_types::{MasterPublicKeyId, SchnorrAlgorithm}; + use ic_management_canister_types_private::{MasterPublicKeyId, SchnorrAlgorithm}; use ic_replicated_state::metadata_state::subnet_call_context_manager::{ - EcdsaArguments, SchnorrArguments, ThresholdArguments, + EcdsaArguments, SchnorrArguments, ThresholdArguments, VetKdArguments, }; + use ic_test_utilities::crypto::CryptoReturningOk; use ic_test_utilities_consensus::IDkgStatsNoOp; use ic_test_utilities_logger::with_test_replica_logger; use ic_test_utilities_types::ids::{ @@ -944,7 +949,7 @@ mod tests { } } - fn test_signature_shares_purging(key_id: IDkgMasterPublicKeyId) { + fn test_signature_shares_purging(key_id: MasterPublicKeyId) { ic_test_utilities::artifact_pool_config::with_test_pool_config(|pool_config| { with_test_replica_logger(|logger| { let (mut idkg_pool, signer, state_manager) = @@ -1014,7 +1019,7 @@ mod tests { } } - fn test_send_signature_shares(key_id: IDkgMasterPublicKeyId) { + fn test_send_signature_shares(key_id: MasterPublicKeyId) { let mut generator = IDkgUIDGenerator::new(subnet_test_id(1), Height::new(0)); let height = Height::from(100); let ids: Vec<_> = (0..5).map(|i| request_id(i, height)).collect(); @@ -1119,8 +1124,10 @@ mod tests { // Tests that no signature shares for incomplete contexts are created #[test] - fn test_send_signature_shares_incomplete_contexts_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + fn test_send_signature_shares_incomplete_contexts_all_idkg_algorithms() { + // Only test IDKG algorithms, as VetKD contexts don't require pre-signatures + // and therefore cannot be "incomplete". + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_send_signature_shares_incomplete_contexts(key_id); } @@ -1161,11 +1168,11 @@ mod tests { // One context without nonce fake_signature_request_context_with_pre_sig(ids[1], key_id.clone(), Some(pids[1])), // One completed context - fake_signature_request_context_from_id(key_id.clone(), pids[2], ids[2]), + fake_signature_request_context_from_id(key_id.clone().into(), pids[2], ids[2]), // One completed context matched to a pre-signature of the wrong scheme - fake_signature_request_context_from_id(key_id.clone(), pids[3], ids[3]), + fake_signature_request_context_from_id(key_id.clone().into(), pids[3], ids[3]), // One completed context matched to a pre-signature that doesn't exist - fake_signature_request_context_from_id(key_id.clone(), pids[4], ids[4]), + fake_signature_request_context_from_id(key_id.clone().into(), pids[4], ids[4]), ], ); @@ -1200,7 +1207,7 @@ mod tests { } } - fn test_send_signature_shares_when_failure(key_id: IDkgMasterPublicKeyId) { + fn test_send_signature_shares_when_failure(key_id: MasterPublicKeyId) { ic_test_utilities::artifact_pool_config::with_test_pool_config(|pool_config| { with_test_replica_logger(|logger| { let mut generator = IDkgUIDGenerator::new(subnet_test_id(1), Height::new(0)); @@ -1224,7 +1231,7 @@ mod tests { }), ); - let (idkg_pool, signer) = create_signer_dependencies(pool_config, logger); + let (mut idkg_pool, signer) = create_signer_dependencies(pool_config, logger); let transcript_loader = TestIDkgTranscriptLoader::new(TestTranscriptLoadStatus::Failure); @@ -1235,8 +1242,15 @@ mod tests { &state, ); - // No shares should be created when transcripts fail to load - assert!(change_set.is_empty()); + if key_id.is_idkg_key() { + // No shares should be created for IDKG keys when transcripts fail to load + assert!(change_set.is_empty()); + } else { + // NiDKG transcripts are loaded ahead of time, so creation should succeed, even if + // IDKG transcripts fail to load. + assert_eq!(change_set.len(), 3); + } + idkg_pool.apply(change_set); let transcript_loader = TestIDkgTranscriptLoader::new(TestTranscriptLoadStatus::Success); @@ -1247,8 +1261,13 @@ mod tests { &state, ); - // Shares should be created when transcripts succeed to load - assert_eq!(change_set.len(), 3); + if key_id.is_idkg_key() { + // IDKG key siganture shares should be created when transcripts succeed to load + assert_eq!(change_set.len(), 3); + } else { + // No new shares should be created with NiDKG, as they were already created above + assert!(change_set.is_empty()); + } }) }) } @@ -1256,8 +1275,9 @@ mod tests { // Tests that complaints are generated and added to the pool if loading transcript // results in complaints. #[test] - fn test_send_signature_shares_with_complaints_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + fn test_send_signature_shares_with_complaints_all_idkg_algorithms() { + // Only test IDKG algorithms, as there are no complaints for NiDKG + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_send_signature_shares_with_complaints(key_id); } @@ -1283,7 +1303,11 @@ mod tests { let state = fake_state_with_signature_requests( height, (0..3).map(|i| { - fake_signature_request_context_from_id(key_id.clone(), pids[i], ids[i]) + fake_signature_request_context_from_id( + key_id.clone().into(), + pids[i], + ids[i], + ) }), ); @@ -1320,14 +1344,14 @@ mod tests { } #[test] - fn test_crypto_verify_sig_share_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + fn test_crypto_verify_sig_share_all_idkg_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); - test_crypto_verify_sig_share(key_id); + test_crypto_verify_idkg_sig_share(key_id); } } - fn test_crypto_verify_sig_share(key_id: IDkgMasterPublicKeyId) { + fn test_crypto_verify_idkg_sig_share(key_id: IDkgMasterPublicKeyId) { let mut rng = reproducible_rng(); ic_test_utilities::artifact_pool_config::with_test_pool_config(|pool_config| { with_test_replica_logger(|logger| { @@ -1418,7 +1442,7 @@ mod tests { } } - fn test_validate_signature_shares(key_id: IDkgMasterPublicKeyId) { + fn test_validate_signature_shares(key_id: MasterPublicKeyId) { let mut generator = IDkgUIDGenerator::new(subnet_test_id(1), Height::new(0)); let height = Height::from(100); let (id_1, id_2, id_3, id_4) = ( @@ -1500,20 +1524,27 @@ mod tests { }) }); - // Simulate failure when resolving transcripts + // Simulate failure when resolving IDKG transcripts ic_test_utilities::artifact_pool_config::with_test_pool_config(|pool_config| { with_test_replica_logger(|logger| { let (mut idkg_pool, signer) = create_signer_dependencies(pool_config, logger); artifacts.iter().for_each(|a| idkg_pool.insert(a.clone())); let block_reader = block_reader.clone().with_fail_to_resolve(); - // There are no transcripts in the block reader, shares created for transcripts - // that cannot be resolved should be handled invalid. + let change_set = signer.validate_signature_shares(&idkg_pool, &block_reader, &state); assert_eq!(change_set.len(), 3); - assert!(is_handle_invalid(&change_set, &msg_id_2)); - assert!(is_handle_invalid(&change_set, &msg_id_3)); + if key_id.is_idkg_key() { + // There are no IDKG transcripts in the block reader, shares created for IDKG transcripts + // that cannot be resolved should be handled invalid. + assert!(is_handle_invalid(&change_set, &msg_id_2)); + assert!(is_handle_invalid(&change_set, &msg_id_3)); + } else { + // IDKG transcripts should not affect NiDKG key share validation + assert!(is_moved_to_validated(&change_set, &msg_id_2)); + assert!(is_moved_to_validated(&change_set, &msg_id_3)); + } assert!(is_removed_from_unvalidated(&change_set, &msg_id_4)); }) }); @@ -1528,7 +1559,7 @@ mod tests { } } - fn test_validate_signature_shares_mismatching_schemes(key_id: IDkgMasterPublicKeyId) { + fn test_validate_signature_shares_mismatching_schemes(key_id: MasterPublicKeyId) { let mut generator = IDkgUIDGenerator::new(subnet_test_id(1), Height::new(0)); let height = Height::from(100); let (id_1, id_2) = (request_id(1, height), request_id(2, height)); @@ -1566,12 +1597,12 @@ mod tests { }); // A share for the second context with mismatching schemes - let key_id_wrong_scheme = match key_id.inner() { + let key_id_wrong_scheme = match key_id { MasterPublicKeyId::Ecdsa(_) => { - fake_schnorr_idkg_master_public_key_id(SchnorrAlgorithm::Ed25519) + fake_schnorr_idkg_master_public_key_id(SchnorrAlgorithm::Ed25519).into() } - MasterPublicKeyId::Schnorr(_) => fake_ecdsa_idkg_master_public_key_id(), - MasterPublicKeyId::VetKd(_) => panic!("not applicable to vetKD"), + MasterPublicKeyId::Schnorr(_) => fake_vetkd_master_public_key_id(), + MasterPublicKeyId::VetKd(_) => fake_ecdsa_idkg_master_public_key_id().into(), }; let message = create_signature_share(&key_id_wrong_scheme, NODE_2, id_2); let msg_id_2 = message.message_id(); @@ -1598,7 +1629,9 @@ mod tests { // Tests that signature shares for incomplete contexts are not validated #[test] fn test_validate_signature_shares_incomplete_contexts_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + // Only test IDKG algorithms, as VetKD contexts don't require pre-signatures + // and therefore cannot be "incomplete". + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_validate_signature_shares_incomplete_contexts(key_id); } @@ -1628,7 +1661,7 @@ mod tests { // One context without nonce fake_signature_request_context_with_pre_sig(ids[1], key_id.clone(), Some(pids[1])), // One completed context - fake_signature_request_context_from_id(key_id.clone(), pids[2], ids[2]), + fake_signature_request_context_from_id(key_id.clone().into(), pids[2], ids[2]), ], ); @@ -1694,7 +1727,7 @@ mod tests { } } - fn test_duplicate_signature_shares(key_id: IDkgMasterPublicKeyId) { + fn test_duplicate_signature_shares(key_id: MasterPublicKeyId) { ic_test_utilities::artifact_pool_config::with_test_pool_config(|pool_config| { with_test_replica_logger(|logger| { let height = Height::from(100); @@ -1750,7 +1783,7 @@ mod tests { } } - fn test_duplicate_signature_shares_in_batch(key_id: IDkgMasterPublicKeyId) { + fn test_duplicate_signature_shares_in_batch(key_id: MasterPublicKeyId) { ic_test_utilities::artifact_pool_config::with_test_pool_config(|pool_config| { with_test_replica_logger(|logger| { let height = Height::from(100); @@ -1802,7 +1835,6 @@ mod tests { let change_set = signer.validate_signature_shares(&idkg_pool, &block_reader, &state); - println!("{change_set:?}"); assert_eq!(change_set.len(), 3); let msg_1_valid = is_moved_to_validated(&change_set, &msg_id_1) && is_handle_invalid(&change_set, &msg_id_2); @@ -1825,7 +1857,7 @@ mod tests { } } - fn test_purge_unvalidated_signature_shares(key_id: IDkgMasterPublicKeyId) { + fn test_purge_unvalidated_signature_shares(key_id: MasterPublicKeyId) { ic_test_utilities::artifact_pool_config::with_test_pool_config(|pool_config| { with_test_replica_logger(|logger| { let height = Height::from(100); @@ -1892,7 +1924,7 @@ mod tests { } } - fn test_purge_validated_signature_shares(key_id: IDkgMasterPublicKeyId) { + fn test_purge_validated_signature_shares(key_id: MasterPublicKeyId) { ic_test_utilities::artifact_pool_config::with_test_pool_config(|pool_config| { with_test_replica_logger(|logger| { let height = Height::from(100); @@ -2215,4 +2247,62 @@ mod tests { }); }) } + + #[test] + fn test_vetkd_get_completed_signature_unexpected() { + ic_test_utilities::artifact_pool_config::with_test_pool_config(|pool_config| { + with_test_replica_logger(|logger| { + let (idkg_pool, _) = create_signer_dependencies(pool_config, logger.clone()); + + let callback_id = CallbackId::from(1); + let key_id = fake_vetkd_key_id(); + let height = Height::from(100); + let context = SignWithThresholdContext { + request: RequestBuilder::new().sender(canister_test_id(1)).build(), + args: ThresholdArguments::VetKd(VetKdArguments { + key_id: key_id.clone(), + derivation_id: vec![], + encryption_public_key: vec![], + ni_dkg_id: fake_dkg_id(key_id), + height, + }), + pseudo_random_id: [1; 32], + derivation_path: vec![], + batch_time: UNIX_EPOCH, + matched_pre_signature: None, + nonce: None, + }; + + // Set up the block reader + let block_reader = TestIDkgBlockReader::for_signer_test(height, vec![]); + + let metrics = IDkgPayloadMetrics::new(MetricsRegistry::new()); + let crypto: Arc = Arc::new(CryptoReturningOk::default()); + + let sig_builder = ThresholdSignatureBuilderImpl::new( + &block_reader, + crypto.deref(), + &idkg_pool, + &metrics, + logger, + ); + + // We don't expect to combine VetKD shares using the ThresholdSignatureBuilder + // (they are instead created by the VetKD payload builder). + let (request_id, sig_inputs_ref) = + build_signature_inputs(callback_id, &context, &block_reader).unwrap(); + let sig_inputs = sig_inputs_ref.translate(&block_reader).unwrap(); + + let result = sig_builder.crypto_combine_sig_shares( + &request_id, + &sig_inputs, + idkg_pool.stats(), + ); + assert_matches!(result, Err(CombineSigSharesError::VetKdUnexpected)); + + let result = sig_builder.get_completed_signature(callback_id, &context); + assert_matches!(result, None); + }); + }) + } } diff --git a/rs/consensus/src/idkg/stats.rs b/rs/consensus/src/idkg/stats.rs index c985231c62a..6637b08a1a5 100644 --- a/rs/consensus/src/idkg/stats.rs +++ b/rs/consensus/src/idkg/stats.rs @@ -3,7 +3,7 @@ use crate::idkg::metrics::{ IDkgPreSignatureMetrics, IDkgTranscriptMetrics, ThresholdSignatureMetrics, }; -use ic_management_canister_types::MasterPublicKeyId; +use ic_management_canister_types_private::MasterPublicKeyId; use ic_types::consensus::idkg::{IDkgBlockReader, IDkgStats, PreSigId, RequestId}; use ic_types::crypto::canister_threshold_sig::idkg::{ IDkgDealingSupport, IDkgTranscriptId, IDkgTranscriptParams, diff --git a/rs/consensus/src/idkg/test_utils.rs b/rs/consensus/src/idkg/test_utils.rs index 60d5f2269d2..5bfc9ff0f00 100644 --- a/rs/consensus/src/idkg/test_utils.rs +++ b/rs/consensus/src/idkg/test_utils.rs @@ -3,6 +3,7 @@ use crate::idkg::complaints::{ }; use crate::idkg::pre_signer::{IDkgPreSignerImpl, IDkgTranscriptBuilder}; use crate::idkg::signer::{ThresholdSignatureBuilder, ThresholdSignerImpl}; +use core::convert::TryInto; use ic_artifact_pool::idkg_pool::IDkgPoolImpl; use ic_config::artifact_pool::ArtifactPoolConfig; use ic_consensus_mocks::{dependencies, Dependencies}; @@ -17,7 +18,7 @@ use ic_crypto_tree_hash::{LabeledTree, MixedHashTree}; use ic_interfaces::idkg::{IDkgChangeAction, IDkgPool}; use ic_interfaces_state_manager::{CertifiedStateSnapshot, Labeled}; use ic_logger::ReplicaLogger; -use ic_management_canister_types::{ +use ic_management_canister_types_private::{ EcdsaKeyId, MasterPublicKeyId, SchnorrAlgorithm, SchnorrKeyId, VetKdKeyId, }; use ic_metrics::MetricsRegistry; @@ -46,7 +47,7 @@ use ic_types::consensus::idkg::{ SignedIDkgOpening, TranscriptAttributes, TranscriptLookupError, TranscriptRef, UnmaskedTranscript, }; -use ic_types::consensus::idkg::{HasIDkgMasterPublicKeyId, SchnorrSigShare}; +use ic_types::consensus::idkg::{HasIDkgMasterPublicKeyId, SchnorrSigShare, VetKdKeyShare}; use ic_types::crypto::canister_threshold_sig::idkg::{ IDkgComplaint, IDkgDealing, IDkgDealingSupport, IDkgMaskedTranscriptOrigin, IDkgOpening, IDkgReceivers, IDkgTranscript, IDkgTranscriptId, IDkgTranscriptOperation, IDkgTranscriptParams, @@ -59,6 +60,7 @@ use ic_types::crypto::canister_threshold_sig::{ use ic_types::crypto::threshold_sig::ni_dkg::{ NiDkgId, NiDkgMasterPublicKeyId, NiDkgTag, NiDkgTargetSubnet, }; +use ic_types::crypto::vetkd::{VetKdArgs, VetKdEncryptedKeyShare, VetKdEncryptedKeyShareContent}; use ic_types::crypto::{AlgorithmId, ExtendedDerivationPath}; use ic_types::messages::CallbackId; use ic_types::time::UNIX_EPOCH; @@ -93,7 +95,7 @@ pub(crate) fn empty_response() -> ic_types::batch::ConsensusResponse { ) } -fn fake_signature_request_args(key_id: MasterPublicKeyId) -> ThresholdArguments { +fn fake_signature_request_args(key_id: MasterPublicKeyId, height: Height) -> ThresholdArguments { match key_id { MasterPublicKeyId::Ecdsa(key_id) => ThresholdArguments::Ecdsa(EcdsaArguments { key_id, @@ -109,7 +111,7 @@ fn fake_signature_request_args(key_id: MasterPublicKeyId) -> ThresholdArguments derivation_id: vec![1; 32], encryption_public_key: vec![1; 32], ni_dkg_id: fake_dkg_id(key_id), - height: Height::from(0), + height, }), } } @@ -127,7 +129,7 @@ pub fn fake_signature_request_context( ) -> SignWithThresholdContext { SignWithThresholdContext { request: RequestBuilder::new().build(), - args: fake_signature_request_args(key_id), + args: fake_signature_request_args(key_id, Height::from(0)), derivation_path: vec![], batch_time: UNIX_EPOCH, pseudo_random_id, @@ -141,27 +143,28 @@ pub fn fake_signature_request_context_with_pre_sig( key_id: IDkgMasterPublicKeyId, pre_signature: Option, ) -> (CallbackId, SignWithThresholdContext) { + let height = Height::from(1); let context = SignWithThresholdContext { request: RequestBuilder::new().build(), - args: fake_signature_request_args(key_id.into()), + args: fake_signature_request_args(key_id.into(), height), derivation_path: vec![], batch_time: UNIX_EPOCH, pseudo_random_id: [request_id.callback_id.get() as u8; 32], - matched_pre_signature: pre_signature.map(|pid| (pid, Height::from(1))), + matched_pre_signature: pre_signature.map(|pid| (pid, height)), nonce: None, }; (request_id.callback_id, context) } pub fn fake_signature_request_context_from_id( - key_id: IDkgMasterPublicKeyId, + key_id: MasterPublicKeyId, pre_sig_id: PreSigId, request_id: RequestId, ) -> (CallbackId, SignWithThresholdContext) { let height = request_id.height; let context = SignWithThresholdContext { request: RequestBuilder::new().build(), - args: fake_signature_request_args(key_id.into()), + args: fake_signature_request_args(key_id, height), derivation_path: vec![], batch_time: UNIX_EPOCH, pseudo_random_id: [request_id.callback_id.get() as u8; 32], @@ -213,27 +216,29 @@ pub fn insert_test_sig_inputs( .for_each(|(transcript_ref, transcript)| { block_reader.add_transcript(*transcript_ref, transcript.clone()) }); - idkg_payload - .available_pre_signatures - .insert(pre_sig_id, inputs.sig_inputs_ref.pre_signature()); - block_reader.add_available_pre_signature(pre_sig_id, inputs.sig_inputs_ref.pre_signature()); + if let Some(pre_signature) = inputs.sig_inputs_ref.pre_signature() { + idkg_payload + .available_pre_signatures + .insert(pre_sig_id, pre_signature.clone()); + block_reader.add_available_pre_signature(pre_sig_id, pre_signature); + } } } pub(crate) trait HasPreSignature { - fn pre_signature(&self) -> PreSignatureRef; + fn pre_signature(&self) -> Option; } impl HasPreSignature for ThresholdSigInputsRef { - fn pre_signature(&self) -> PreSignatureRef { + fn pre_signature(&self) -> Option { match self { ThresholdSigInputsRef::Ecdsa(inputs) => { - PreSignatureRef::Ecdsa(inputs.presig_quadruple_ref.clone()) - } - ThresholdSigInputsRef::Schnorr(inputs) => { - PreSignatureRef::Schnorr(inputs.presig_transcript_ref.clone()) + Some(PreSignatureRef::Ecdsa(inputs.presig_quadruple_ref.clone())) } - ThresholdSigInputsRef::VetKd(_) => panic!("No pre-signatures for VetKd."), + ThresholdSigInputsRef::Schnorr(inputs) => Some(PreSignatureRef::Schnorr( + inputs.presig_transcript_ref.clone(), + )), + ThresholdSigInputsRef::VetKd(_) => None, } } } @@ -412,7 +417,9 @@ impl TestIDkgBlockReader { for (transcript_ref, transcript) in sig_inputs.idkg_transcripts { idkg_transcripts.insert(transcript_ref, transcript); } - available_pre_signatures.insert(pre_sig_id, sig_inputs.sig_inputs_ref.pre_signature()); + if let Some(pre_signature) = sig_inputs.sig_inputs_ref.pre_signature() { + available_pre_signatures.insert(pre_sig_id, pre_signature); + } } Self { @@ -1136,8 +1143,11 @@ pub(crate) fn create_support( pub(crate) fn create_sig_inputs_with_height( caller: u8, height: Height, - key_id: IDkgMasterPublicKeyId, + key_id: MasterPublicKeyId, ) -> TestSigInputs { + if let MasterPublicKeyId::VetKd(key_id) = &key_id { + return create_vetkd_inputs_with_args(caller, key_id); + } let transcript_id = |offset| { let val = caller as u64; create_transcript_id(val * 214365 + offset) @@ -1145,6 +1155,7 @@ pub(crate) fn create_sig_inputs_with_height( let receivers: BTreeSet<_> = vec![node_test_id(1)].into_iter().collect(); let key_unmasked_id = transcript_id(50); let key_masked_id = transcript_id(40); + let idkg_key_id = IDkgMasterPublicKeyId::try_from(key_id).unwrap(); let key_unmasked = IDkgTranscript { transcript_id: key_unmasked_id, receivers: IDkgReceivers::new(receivers.clone()).unwrap(), @@ -1153,10 +1164,10 @@ pub(crate) fn create_sig_inputs_with_height( transcript_type: IDkgTranscriptType::Unmasked(IDkgUnmaskedTranscriptOrigin::ReshareMasked( key_masked_id, )), - algorithm_id: algorithm_for_key_id(&key_id), + algorithm_id: algorithm_for_key_id(&idkg_key_id), internal_transcript_raw: vec![], }; - create_sig_inputs_with_args(caller, &receivers, key_unmasked, height, &key_id) + create_sig_inputs_with_args(caller, &receivers, key_unmasked, height, &idkg_key_id) } pub(crate) fn create_sig_inputs_with_args( @@ -1356,19 +1367,37 @@ pub(crate) fn create_schnorr_sig_inputs_with_args( } } +// Creates a test vetkd input +pub(crate) fn create_vetkd_inputs_with_args(caller: u8, key_id: &VetKdKeyId) -> TestSigInputs { + let inputs = VetKdArgs { + ni_dkg_id: fake_dkg_id(key_id.clone()), + derivation_path: ExtendedDerivationPath { + caller: PrincipalId::try_from(&vec![caller]).unwrap(), + derivation_path: vec![], + }, + derivation_id: vec![], + encryption_public_key: vec![1; 32], + }; + + TestSigInputs { + idkg_transcripts: BTreeMap::new(), + sig_inputs_ref: ThresholdSigInputsRef::VetKd(inputs), + } +} + // Creates a test signature input -pub(crate) fn create_sig_inputs(caller: u8, key_id: &IDkgMasterPublicKeyId) -> TestSigInputs { +pub(crate) fn create_sig_inputs(caller: u8, key_id: &MasterPublicKeyId) -> TestSigInputs { create_sig_inputs_with_height(caller, Height::new(0), key_id.clone()) } // Creates a test signature share pub(crate) fn create_signature_share_with_nonce( - key_id: &IDkgMasterPublicKeyId, + key_id: &MasterPublicKeyId, signer_id: NodeId, request_id: RequestId, nonce: u8, ) -> IDkgMessage { - match key_id.inner() { + match key_id { MasterPublicKeyId::Ecdsa(_) => IDkgMessage::EcdsaSigShare(EcdsaSigShare { signer_id, request_id, @@ -1383,13 +1412,20 @@ pub(crate) fn create_signature_share_with_nonce( sig_share_raw: vec![nonce], }, }), - MasterPublicKeyId::VetKd(_) => panic!("not applicable to vetKD"), + MasterPublicKeyId::VetKd(_) => IDkgMessage::VetKdKeyShare(VetKdKeyShare { + signer_id, + request_id, + share: VetKdEncryptedKeyShare { + encrypted_key_share: VetKdEncryptedKeyShareContent(vec![nonce]), + node_signature: vec![nonce], + }, + }), } } // Creates a test signature share pub(crate) fn create_signature_share( - key_id: &IDkgMasterPublicKeyId, + key_id: &MasterPublicKeyId, signer_id: NodeId, request_id: RequestId, ) -> IDkgMessage { @@ -1537,25 +1573,27 @@ pub(crate) fn is_opening_added_to_validated( // validated pool pub(crate) fn is_signature_share_added_to_validated( change_set: &[IDkgChangeAction], - request_id: &RequestId, + expected_request_id: &RequestId, requested_height: Height, ) -> bool { for action in change_set { - if let IDkgChangeAction::AddToValidated(IDkgMessage::EcdsaSigShare(share)) = action { - if share.request_id.height == requested_height - && share.request_id == *request_id - && share.signer_id == NODE_1 - { - return true; + let (request_id, signer) = match action { + IDkgChangeAction::AddToValidated(IDkgMessage::EcdsaSigShare(share)) => { + (share.request_id, share.signer_id) } - } - if let IDkgChangeAction::AddToValidated(IDkgMessage::SchnorrSigShare(share)) = action { - if share.request_id.height == requested_height - && share.request_id == *request_id - && share.signer_id == NODE_1 - { - return true; + IDkgChangeAction::AddToValidated(IDkgMessage::SchnorrSigShare(share)) => { + (share.request_id, share.signer_id) + } + IDkgChangeAction::AddToValidated(IDkgMessage::VetKdKeyShare(share)) => { + (share.request_id, share.signer_id) } + _ => continue, + }; + if request_id.height == requested_height + && request_id == *expected_request_id + && signer == NODE_1 + { + return true; } } false @@ -1696,7 +1734,7 @@ pub(crate) fn fake_dkg_id(key_id: VetKdKeyId) -> NiDkgId { } } -pub(crate) fn fake_master_public_key_ids_for_all_algorithms() -> Vec { +pub(crate) fn fake_master_public_key_ids_for_all_idkg_algorithms() -> Vec { AlgorithmId::iter() .flat_map(|alg| match alg { AlgorithmId::ThresholdEcdsaSecp256k1 => Some(fake_ecdsa_idkg_master_public_key_id()), @@ -1711,6 +1749,16 @@ pub(crate) fn fake_master_public_key_ids_for_all_algorithms() -> Vec Vec { + std::iter::once(fake_vetkd_master_public_key_id()) + .chain( + fake_master_public_key_ids_for_all_idkg_algorithms() + .into_iter() + .map(MasterPublicKeyId::from), + ) + .collect() +} + pub(crate) fn create_reshare_request( key_id: IDkgMasterPublicKeyId, num_nodes: u64, @@ -1736,9 +1784,10 @@ pub(crate) fn add_available_quadruple_to_payload( pre_signature_id.id() as u8, &fake_ecdsa_idkg_master_public_key_id(), ); - idkg_payload - .available_pre_signatures - .insert(pre_signature_id, sig_inputs.sig_inputs_ref.pre_signature()); + idkg_payload.available_pre_signatures.insert( + pre_signature_id, + sig_inputs.sig_inputs_ref.pre_signature().unwrap(), + ); for (t_ref, mut transcript) in sig_inputs.idkg_transcripts { transcript.registry_version = registry_version; idkg_payload @@ -1768,7 +1817,7 @@ pub fn create_available_pre_signature_with_key_transcript( ) -> PreSigId { let sig_inputs = create_sig_inputs(caller, &key_id); let pre_sig_id = idkg_payload.uid_generator.next_pre_signature_id(); - let mut pre_signature_ref = sig_inputs.sig_inputs_ref.pre_signature(); + let mut pre_signature_ref = sig_inputs.sig_inputs_ref.pre_signature().unwrap(); if let Some(transcript) = key_transcript { match pre_signature_ref { PreSignatureRef::Ecdsa(ref mut pre_sig) => { diff --git a/rs/consensus/src/idkg/utils.rs b/rs/consensus/src/idkg/utils.rs index e3fb77ca404..941e660e628 100644 --- a/rs/consensus/src/idkg/utils.rs +++ b/rs/consensus/src/idkg/utils.rs @@ -8,7 +8,9 @@ use ic_interfaces::consensus_pool::ConsensusBlockChain; use ic_interfaces::idkg::{IDkgChangeAction, IDkgChangeSet, IDkgPool}; use ic_interfaces_registry::RegistryClient; use ic_logger::{warn, ReplicaLogger}; -use ic_management_canister_types::{EcdsaCurve, MasterPublicKeyId, SchnorrAlgorithm, VetKdCurve}; +use ic_management_canister_types_private::{ + EcdsaCurve, MasterPublicKeyId, SchnorrAlgorithm, VetKdCurve, +}; use ic_protobuf::registry::subnet::v1 as pb; use ic_registry_client_helpers::subnet::SubnetRegistry; use ic_registry_subnet_features::ChainKeyConfig; @@ -617,7 +619,7 @@ mod tests { use super::*; use crate::idkg::test_utils::{ create_available_pre_signature_with_key_transcript, fake_ecdsa_idkg_master_public_key_id, - fake_ecdsa_key_id, fake_master_public_key_ids_for_all_algorithms, set_up_idkg_payload, + fake_ecdsa_key_id, fake_master_public_key_ids_for_all_idkg_algorithms, set_up_idkg_payload, IDkgPayloadTestHelper, }; use ic_config::artifact_pool::ArtifactPoolConfig; @@ -627,7 +629,7 @@ mod tests { IDkgParticipants, }; use ic_crypto_test_utils_reproducible_rng::reproducible_rng; - use ic_management_canister_types::{EcdsaKeyId, SchnorrKeyId}; + use ic_management_canister_types_private::{EcdsaKeyId, SchnorrKeyId}; use ic_protobuf::registry::subnet::v1::EcdsaInitialization; use ic_registry_client_fake::FakeRegistryClient; use ic_registry_subnet_features::KeyConfig; @@ -948,7 +950,7 @@ mod tests { #[test] fn test_get_pre_signature_ids_to_deliver_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_get_pre_signature_ids_to_deliver(key_id); } @@ -1020,7 +1022,7 @@ mod tests { #[test] fn test_block_without_key_should_not_deliver_pre_signatures_all_algorithms() { - for key_id in fake_master_public_key_ids_for_all_algorithms() { + for key_id in fake_master_public_key_ids_for_all_idkg_algorithms() { println!("Running test for key ID {key_id}"); test_block_without_key_should_not_deliver_pre_signatures(key_id); } diff --git a/rs/consensus/tests/framework/mod.rs b/rs/consensus/tests/framework/mod.rs index fc7c4fa7098..4492d1ff04c 100644 --- a/rs/consensus/tests/framework/mod.rs +++ b/rs/consensus/tests/framework/mod.rs @@ -16,14 +16,14 @@ pub use types::{ use ic_crypto_temp_crypto::{NodeKeysToGenerate, TempCryptoComponent, TempCryptoComponentGeneric}; use ic_crypto_test_utils_ni_dkg::{initial_dkg_transcript, InitialNiDkgConfig}; use ic_interfaces_registry::RegistryClient; -use ic_management_canister_types::{ +use ic_management_canister_types_private::{ EcdsaCurve, EcdsaKeyId, MasterPublicKeyId, SchnorrAlgorithm, SchnorrKeyId, }; use ic_protobuf::registry::subnet::v1::{CatchUpPackageContents, InitialNiDkgTranscriptRecord}; use ic_registry_client_fake::FakeRegistryClient; use ic_registry_client_helpers::crypto::CryptoRegistry; use ic_registry_proto_data_provider::ProtoRegistryDataProvider; -use ic_registry_subnet_features::{ChainKeyConfig, EcdsaConfig, KeyConfig}; +use ic_registry_subnet_features::{ChainKeyConfig, KeyConfig}; use ic_test_utilities_consensus::make_genesis; use ic_test_utilities_registry::SubnetRecordBuilder; use ic_types::{ diff --git a/rs/consensus/utils/Cargo.toml b/rs/consensus/utils/Cargo.toml index 974d18bb33b..e2cc7728e9a 100644 --- a/rs/consensus/utils/Cargo.toml +++ b/rs/consensus/utils/Cargo.toml @@ -23,7 +23,7 @@ slog = { workspace = true } [dev-dependencies] assert_matches = { workspace = true } ic-consensus-mocks = { path = "../mocks" } -ic-management-canister-types = { path = "../../types/management_canister_types" } +ic-management-canister-types-private = { path = "../../types/management_canister_types" } ic-test-utilities = { path = "../../test_utilities" } ic-test-utilities-registry = { path = "../../test_utilities/registry" } ic-test-utilities-state = { path = "../../test_utilities/state" } diff --git a/rs/consensus/utils/src/lib.rs b/rs/consensus/utils/src/lib.rs index 75ce1f1c6bb..3cebfb666ab 100644 --- a/rs/consensus/utils/src/lib.rs +++ b/rs/consensus/utils/src/lib.rs @@ -428,7 +428,7 @@ mod tests { use super::*; use ic_consensus_mocks::{dependencies, Dependencies}; - use ic_management_canister_types::{EcdsaKeyId, MasterPublicKeyId, SchnorrKeyId}; + use ic_management_canister_types_private::{EcdsaKeyId, MasterPublicKeyId, SchnorrKeyId}; use ic_replicated_state::metadata_state::subnet_call_context_manager::{ EcdsaArguments, SchnorrArguments, SignWithThresholdContext, ThresholdArguments, }; diff --git a/rs/consensus/vetkd/BUILD.bazel b/rs/consensus/vetkd/BUILD.bazel new file mode 100644 index 00000000000..bb1719fd620 --- /dev/null +++ b/rs/consensus/vetkd/BUILD.bazel @@ -0,0 +1,65 @@ +load("@rules_rust//rust:defs.bzl", "rust_doc", "rust_library", "rust_test") + +package(default_visibility = ["//visibility:public"]) + +DEPENDENCIES = [ + # Keep sorted. + "//rs/consensus/utils", + "//rs/crypto", + "//rs/interfaces", + "//rs/interfaces/registry", + "//rs/interfaces/state_manager", + "//rs/monitoring/logger", + "//rs/monitoring/metrics", + "//rs/phantom_newtype", + "//rs/protobuf", + "//rs/registry/helpers", + "//rs/registry/subnet_features", + "//rs/replicated_state", + "//rs/types/error_types", + "//rs/types/management_canister_types", + "//rs/types/types", + "@crate_index//:prometheus", + "@crate_index//:slog", +] + +DEV_DEPENDENCIES = [ + # Keep sorted. + "//rs/artifact_pool", + "//rs/consensus/mocks", + "//rs/registry/fake", + "//rs/test_utilities", + "//rs/test_utilities/registry", + "//rs/test_utilities/state", + "//rs/test_utilities/types", + "//rs/types/types_test_utils", + "@crate_index//:assert_matches", + "@crate_index//:prost", + "@crate_index//:strum", +] + +rust_library( + name = "vetkd", + srcs = glob(["src/**/*.rs"]), + crate_features = select({ + "//conditions:default": [], + }), + crate_name = "ic_consensus_vetkd", + proc_macro_deps = [ + # Keep sorted. + "@crate_index//:strum_macros", + ], + version = "0.9.0", + deps = DEPENDENCIES, +) + +rust_doc( + name = "consensus_vetkd_doc", + crate = ":vetkd", +) + +rust_test( + name = "consensus_vetkd_test", + crate = ":vetkd", + deps = DEPENDENCIES + DEV_DEPENDENCIES, +) diff --git a/rs/consensus/vetkd/Cargo.toml b/rs/consensus/vetkd/Cargo.toml new file mode 100644 index 00000000000..1f5a33b3542 --- /dev/null +++ b/rs/consensus/vetkd/Cargo.toml @@ -0,0 +1,39 @@ +[package] +name = "ic-consensus-vetkd" +version.workspace = true +authors.workspace = true +edition.workspace = true +description.workspace = true +documentation.workspace = true + +[dependencies] +ic-consensus-utils = { path = "./utils" } +ic-crypto = { path = "../crypto" } +ic-error-types = { path = "../types/error_types" } +ic-interfaces = { path = "../interfaces" } +ic-interfaces-registry = { path = "../interfaces/registry" } +ic-interfaces-state-manager = { path = "../interfaces/state_manager" } +ic-logger = { path = "../monitoring/logger" } +ic-management-canister-types = { path = "../types/management_canister_types" } +ic-metrics = { path = "../monitoring/metrics" } +ic-protobuf = { path = "../protobuf" } +ic-registry-client-helpers = { path = "../registry/helpers" } +ic-registry-subnet-features = { path = "../registry/subnet_features" } +ic-replicated-state = { path = "../replicated_state" } +ic-types = { path = "../types/types" } +prometheus = { workspace = true } +slog = { workspace = true } +strum_macros = { workspace = true } + +[dev-dependencies] +assert_matches = { workspace = true } +ic-artifact-pool = { path = "../artifact_pool" } +ic-consensus-mocks = { path = "./mocks" } +ic-registry-client-fake = { path = "../registry/fake" } +ic-test-utilities = { path = "../test_utilities" } +ic-test-utilities-registry = { path = "../test_utilities/registry" } +ic-test-utilities-state = { path = "../test_utilities/state" } +ic-test-utilities-types = { path = "../test_utilities/types" } +ic-types-test-utils = { path = "../types/types_test_utils" } +prost = { workspace = true } +strum = { workspace = true } diff --git a/rs/consensus/vetkd/src/lib.rs b/rs/consensus/vetkd/src/lib.rs new file mode 100644 index 00000000000..f767961b016 --- /dev/null +++ b/rs/consensus/vetkd/src/lib.rs @@ -0,0 +1,428 @@ +//! This module provides the component responsible for generating and validating +//! payloads relevant to VetKd. + +use crate::utils::{ + group_shares_by_callback_id, invalid_artifact, invalid_artifact_err, parse_past_payload_ids, + validation_failed, validation_failed_err, +}; +use ic_consensus_utils::{crypto::ConsensusCrypto, registry_version_at_height}; +use ic_error_types::RejectCode; +use ic_interfaces::{ + batch_payload::{BatchPayloadBuilder, IntoMessages, PastPayload, ProposalContext}, + consensus::PayloadValidationError, + consensus_pool::ConsensusPoolCache, + idkg::IDkgPool, + vetkd::{InvalidVetKdPayloadReason, VetKdPayloadValidationFailure}, +}; +use ic_interfaces_registry::RegistryClient; +use ic_interfaces_state_manager::StateReader; +use ic_logger::{warn, ReplicaLogger}; +use ic_management_canister_types_private::{ + MasterPublicKeyId, Payload, VetKdDeriveEncryptedKeyResult, +}; +use ic_metrics::MetricsRegistry; +use ic_registry_client_helpers::chain_keys::ChainKeysRegistry; +use ic_registry_client_helpers::subnet::SubnetRegistry; +use ic_replicated_state::{ + metadata_state::subnet_call_context_manager::{SignWithThresholdContext, ThresholdArguments}, + ReplicatedState, +}; +use ic_types::{ + batch::{ + bytes_to_vetkd_payload, vetkd_payload_to_bytes, ConsensusResponse, ValidationContext, + VetKdAgreement, VetKdErrorCode, VetKdPayload, + }, + crypto::{ + vetkd::{VetKdArgs, VetKdEncryptedKey}, + ExtendedDerivationPath, + }, + messages::{CallbackId, Payload as ResponsePayload, RejectContext}, + CountBytes, Height, NumBytes, SubnetId, Time, +}; +use std::time::Duration; +use std::{ + collections::{BTreeMap, BTreeSet, HashSet}, + sync::{Arc, RwLock}, +}; + +mod utils; + +/// Implementation of the [`BatchPayloadBuilder`] for the VetKd feature. +/// TODO: Add metrics +pub struct VetKdPayloadBuilderImpl { + pool: Arc>, + cache: Arc, + _crypto: Arc, + state_reader: Arc>, + subnet_id: SubnetId, + registry: Arc, + log: ReplicaLogger, +} + +impl VetKdPayloadBuilderImpl { + /// Create and initialize an instance of [`VetKdPayloadBuilderImpl`]. + pub fn new( + pool: Arc>, + cache: Arc, + crypto: Arc, + state_reader: Arc>, + subnet_id: SubnetId, + registry: Arc, + _metrics_registry: &MetricsRegistry, + log: ReplicaLogger, + ) -> Self { + Self { + pool, + cache, + _crypto: crypto, + state_reader, + subnet_id, + registry, + log, + } + } + + /// Return the set of enabled VetKD key IDs and request expiry time according to + /// the chain key config at the registry version corresponding to the given block height. + fn get_enabled_keys_and_expiry( + &self, + height: Height, + context_time: Time, + ) -> Result<(BTreeSet, Option
    {}{}{}{}