diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml new file mode 100644 index 0000000000..f04d592a64 --- /dev/null +++ b/.github/workflows/e2e.yml @@ -0,0 +1,144 @@ +name: E2E Tests + +on: + pull_request: + + workflow_dispatch: + inputs: + verbose: + description: "Output more information when triggered manually" + required: false + default: "" + +env: + CARGO_TERM_COLOR: always + +permissions: + contents: read + +jobs: + # Build the node binary in both variants and share as artifacts. + build: + runs-on: [self-hosted, type-ccx33] + timeout-minutes: 60 + strategy: + matrix: + include: + - variant: release + flags: "" + - variant: fast + flags: "--features fast-runtime" + env: + RUST_BACKTRACE: full + steps: + - name: Check-out repository + uses: actions/checkout@v4 + + - name: Install system dependencies + run: | + sudo DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt-get update + sudo DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a apt-get install -y --no-install-recommends \ + -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \ + build-essential clang curl git make libssl-dev llvm libudev-dev protobuf-compiler pkg-config + + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + toolchain: stable + + - name: Utilize Shared Rust Cache + uses: Swatinem/rust-cache@v2 + with: + key: e2e-${{ matrix.variant }} + cache-on-failure: true + + - name: Build node-subtensor (${{ matrix.variant }}) + run: cargo build --profile release ${{ matrix.flags }} -p node-subtensor + + - name: Upload binary + uses: actions/upload-artifact@v4 + with: + name: node-subtensor-${{ matrix.variant }} + path: target/release/node-subtensor + if-no-files-found: error + + # Discover e2e packages that have a "test" script. + discover: + runs-on: ubuntu-latest + outputs: + packages: ${{ steps.find.outputs.packages }} + steps: + - name: Check-out repository + uses: actions/checkout@v4 + with: + sparse-checkout: e2e + + - name: Find testable packages + id: find + working-directory: e2e + run: | + packages=$( + find . -maxdepth 2 -name package.json -not -path './node_modules/*' \ + | while read -r pkg; do + name=$(jq -r '.name // empty' "$pkg") + has_test=$(jq -r '.scripts.test // empty' "$pkg") + if [ -n "$has_test" ] && [ -n "$name" ]; then + echo "$name" + fi + done \ + | jq -R -s -c 'split("\n") | map(select(. != ""))' + ) + echo "packages=$packages" >> "$GITHUB_OUTPUT" + echo "Discovered packages: $packages" + + # Run each e2e package's tests in parallel. + test: + needs: [build, discover] + if: ${{ needs.discover.outputs.packages != '[]' }} + runs-on: [self-hosted, type-ccx33] + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + package: ${{ fromJson(needs.discover.outputs.packages) }} + name: "e2e: ${{ matrix.package }}" + steps: + - name: Check-out repository + uses: actions/checkout@v4 + + - name: Download release binary + uses: actions/download-artifact@v4 + with: + name: node-subtensor-release + path: target/release + + - name: Download fast binary + uses: actions/download-artifact@v4 + with: + name: node-subtensor-fast + path: target/fast + + - name: Make binaries executable + run: chmod +x target/release/node-subtensor target/fast/node-subtensor + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: e2e/.nvmrc + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10 + + - name: Bootstrap papi types + working-directory: e2e + run: ./bootstrap_types.sh --skip-build + + - name: Install e2e dependencies + working-directory: e2e + run: pnpm install --frozen-lockfile + + - name: Run tests + working-directory: e2e + run: pnpm --filter ${{ matrix.package }} test diff --git a/Cargo.lock b/Cargo.lock index 71fe31e5f4..901a7bfa14 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -54,7 +54,7 @@ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher 0.4.4", - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -77,7 +77,7 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "version_check", ] @@ -1067,7 +1067,7 @@ checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" [[package]] name = "assets-common" version = "0.22.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-primitives-core", "ethereum-standards", @@ -1446,7 +1446,7 @@ checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "binary-merkle-tree" version = "16.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "hash-db", "log", @@ -1738,7 +1738,7 @@ dependencies = [ [[package]] name = "bp-header-chain" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-runtime", "finality-grandpa", @@ -1755,7 +1755,7 @@ dependencies = [ [[package]] name = "bp-messages" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-header-chain", "bp-runtime", @@ -1771,7 +1771,7 @@ dependencies = [ [[package]] name = "bp-parachains" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-header-chain", "bp-polkadot-core", @@ -1788,7 +1788,7 @@ dependencies = [ [[package]] name = "bp-polkadot-core" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-messages", "bp-runtime", @@ -1804,7 +1804,7 @@ dependencies = [ [[package]] name = "bp-relayers" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-header-chain", "bp-messages", @@ -1822,7 +1822,7 @@ dependencies = [ [[package]] name = "bp-runtime" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -1845,7 +1845,7 @@ dependencies = [ [[package]] name = "bp-test-utils" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-header-chain", "bp-parachains", @@ -1865,7 +1865,7 @@ dependencies = [ [[package]] name = "bp-xcm-bridge-hub" version = "0.7.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-messages", "bp-runtime", @@ -1882,7 +1882,7 @@ dependencies = [ [[package]] name = "bp-xcm-bridge-hub-router" version = "0.18.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "scale-info", @@ -1894,7 +1894,7 @@ dependencies = [ [[package]] name = "bridge-hub-common" version = "0.14.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -1913,7 +1913,7 @@ dependencies = [ [[package]] name = "bridge-runtime-common" version = "0.22.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-header-chain", "bp-messages", @@ -2162,7 +2162,18 @@ checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ "cfg-if", "cipher 0.4.4", - "cpufeatures", + "cpufeatures 0.2.17", +] + +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.0", ] [[package]] @@ -2172,7 +2183,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" dependencies = [ "aead", - "chacha20", + "chacha20 0.9.1", "cipher 0.4.4", "poly1305", "zeroize", @@ -2393,7 +2404,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6407bff74dea37e0fa3dc1c1c974e5d46405f0c987bf9997a0762adce71eda6" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "proptest", "serde_core", ] @@ -2419,7 +2430,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "once_cell", "tiny-keccak", ] @@ -2531,6 +2542,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "cranelift-bforest" version = "0.95.1" @@ -2625,7 +2645,7 @@ dependencies = [ "itertools 0.10.5", "log", "smallvec", - "wasmparser", + "wasmparser 0.102.0", "wasmtime-types", ] @@ -2778,7 +2798,7 @@ dependencies = [ [[package]] name = "cumulus-client-bootnodes" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -2804,7 +2824,7 @@ dependencies = [ [[package]] name = "cumulus-client-cli" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "clap", "parity-scale-codec", @@ -2821,7 +2841,7 @@ dependencies = [ [[package]] name = "cumulus-client-collator" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-client-consensus-common", "cumulus-client-network", @@ -2844,7 +2864,7 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-aura" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "cumulus-client-collator", @@ -2891,7 +2911,7 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-common" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "cumulus-client-pov-recovery", @@ -2923,7 +2943,7 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-proposer" version = "0.20.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "anyhow", "async-trait", @@ -2938,7 +2958,7 @@ dependencies = [ [[package]] name = "cumulus-client-consensus-relay-chain" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "cumulus-client-consensus-common", @@ -2961,7 +2981,7 @@ dependencies = [ [[package]] name = "cumulus-client-network" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "cumulus-relay-chain-interface", @@ -2988,7 +3008,7 @@ dependencies = [ [[package]] name = "cumulus-client-parachain-inherent" version = "0.18.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -2998,7 +3018,7 @@ dependencies = [ "parity-scale-codec", "sc-client-api", "sc-consensus-babe", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-inherents", "sp-runtime", "sp-state-machine", @@ -3009,7 +3029,7 @@ dependencies = [ [[package]] name = "cumulus-client-pov-recovery" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -3037,7 +3057,7 @@ dependencies = [ [[package]] name = "cumulus-client-service" version = "0.25.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-channel 1.9.0", "cumulus-client-cli", @@ -3077,7 +3097,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-aura-ext" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-pallet-parachain-system", "frame-support", @@ -3094,7 +3114,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-dmp-queue" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-primitives-core", "frame-benchmarking", @@ -3111,7 +3131,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-parachain-system" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bytes", "cumulus-pallet-parachain-system-proc-macro", @@ -3148,7 +3168,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-parachain-system-proc-macro" version = "0.6.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", @@ -3159,7 +3179,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-session-benchmarking" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -3172,7 +3192,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-solo-to-para" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-pallet-parachain-system", "frame-support", @@ -3187,7 +3207,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-weight-reclaim" version = "0.3.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-primitives-storage-weight-reclaim", "derive-where", @@ -3206,7 +3226,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-xcm" version = "0.20.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -3221,7 +3241,7 @@ dependencies = [ [[package]] name = "cumulus-pallet-xcmp-queue" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "approx", "bounded-collections 0.2.4", @@ -3246,7 +3266,7 @@ dependencies = [ [[package]] name = "cumulus-ping" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-pallet-xcm", "cumulus-primitives-core", @@ -3261,7 +3281,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-aura" version = "0.18.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "sp-api", "sp-consensus-aura", @@ -3270,7 +3290,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-core" version = "0.19.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "polkadot-core-primitives", @@ -3287,7 +3307,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-parachain-inherent" version = "0.19.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -3301,7 +3321,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-proof-size-hostfunction" version = "0.13.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "sp-externalities", "sp-runtime-interface", @@ -3311,7 +3331,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-storage-weight-reclaim" version = "12.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-primitives-core", "cumulus-primitives-proof-size-hostfunction", @@ -3328,7 +3348,7 @@ dependencies = [ [[package]] name = "cumulus-primitives-utility" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -3345,7 +3365,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-inprocess-interface" version = "0.25.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-channel 1.9.0", "async-trait", @@ -3373,7 +3393,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-interface" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -3393,7 +3413,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-minimal-node" version = "0.25.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -3429,7 +3449,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-rpc-interface" version = "0.24.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "cumulus-primitives-core", @@ -3470,7 +3490,7 @@ dependencies = [ [[package]] name = "cumulus-relay-chain-streams" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-relay-chain-interface", "futures", @@ -3484,7 +3504,7 @@ dependencies = [ [[package]] name = "cumulus-test-relay-sproof-builder" version = "0.20.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-primitives-core", "parity-scale-codec", @@ -3501,7 +3521,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", @@ -4266,7 +4286,7 @@ dependencies = [ [[package]] name = "ethereum-standards" version = "0.1.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "alloy-core", ] @@ -4483,7 +4503,7 @@ dependencies = [ [[package]] name = "fc-api" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "async-trait", "fp-storage", @@ -4495,7 +4515,7 @@ dependencies = [ [[package]] name = "fc-aura" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "fc-rpc", "fp-storage", @@ -4511,7 +4531,7 @@ dependencies = [ [[package]] name = "fc-babe" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "fc-rpc", "sc-client-api", @@ -4527,7 +4547,7 @@ dependencies = [ [[package]] name = "fc-consensus" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "async-trait", "fp-consensus", @@ -4543,7 +4563,7 @@ dependencies = [ [[package]] name = "fc-db" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "async-trait", "ethereum", @@ -4573,7 +4593,7 @@ dependencies = [ [[package]] name = "fc-mapping-sync" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "fc-db", "fc-storage", @@ -4596,7 +4616,7 @@ dependencies = [ [[package]] name = "fc-rpc" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "ethereum", "ethereum-types", @@ -4647,7 +4667,7 @@ dependencies = [ [[package]] name = "fc-rpc-core" version = "1.1.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "ethereum", "ethereum-types", @@ -4656,13 +4676,13 @@ dependencies = [ "rustc-hex", "serde", "serde_json", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", ] [[package]] name = "fc-storage" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "ethereum", "ethereum-types", @@ -4827,7 +4847,7 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "fork-tree" version = "13.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", ] @@ -4854,7 +4874,7 @@ dependencies = [ [[package]] name = "fp-account" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "hex", "impl-serde", @@ -4872,7 +4892,7 @@ dependencies = [ [[package]] name = "fp-consensus" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "ethereum", "parity-scale-codec", @@ -4883,7 +4903,7 @@ dependencies = [ [[package]] name = "fp-ethereum" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "ethereum", "ethereum-types", @@ -4895,7 +4915,7 @@ dependencies = [ [[package]] name = "fp-evm" version = "3.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "environmental", "evm", @@ -4911,7 +4931,7 @@ dependencies = [ [[package]] name = "fp-rpc" version = "3.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "ethereum", "ethereum-types", @@ -4927,7 +4947,7 @@ dependencies = [ [[package]] name = "fp-self-contained" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "frame-support", "parity-scale-codec", @@ -4939,7 +4959,7 @@ dependencies = [ [[package]] name = "fp-storage" version = "2.0.0" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "parity-scale-codec", "serde", @@ -4954,7 +4974,7 @@ checksum = "28dd6caf6059519a65843af8fe2a3ae298b14b80179855aeb4adc2c1934ee619" [[package]] name = "frame-benchmarking" version = "41.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-support-procedural", @@ -4978,7 +4998,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-cli" version = "49.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "Inflector", "array-bytes 6.2.3", @@ -5043,7 +5063,7 @@ dependencies = [ [[package]] name = "frame-benchmarking-pallet-pov" version = "31.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -5071,7 +5091,7 @@ dependencies = [ [[package]] name = "frame-election-provider-solution-type" version = "16.1.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", @@ -5082,7 +5102,7 @@ dependencies = [ [[package]] name = "frame-election-provider-support" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-election-provider-solution-type", "frame-support", @@ -5099,7 +5119,7 @@ dependencies = [ [[package]] name = "frame-executive" version = "41.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "aquamarine", "frame-support", @@ -5152,7 +5172,7 @@ dependencies = [ [[package]] name = "frame-metadata-hash-extension" version = "0.9.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "const-hex", @@ -5168,7 +5188,7 @@ dependencies = [ [[package]] name = "frame-storage-access-test-runtime" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-pallet-parachain-system", "parity-scale-codec", @@ -5182,7 +5202,7 @@ dependencies = [ [[package]] name = "frame-support" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "aquamarine", "array-bytes 6.2.3", @@ -5223,7 +5243,7 @@ dependencies = [ [[package]] name = "frame-support-procedural" version = "34.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "Inflector", "cfg-expr", @@ -5236,7 +5256,7 @@ dependencies = [ "proc-macro-warning", "proc-macro2", "quote", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "syn 2.0.106", ] @@ -5256,7 +5276,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools" version = "13.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support-procedural-tools-derive 12.0.0", "proc-macro-crate 3.4.0", @@ -5279,7 +5299,7 @@ dependencies = [ [[package]] name = "frame-support-procedural-tools-derive" version = "12.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "proc-macro2", "quote", @@ -5289,7 +5309,7 @@ dependencies = [ [[package]] name = "frame-system" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cfg-if", "docify", @@ -5308,7 +5328,7 @@ dependencies = [ [[package]] name = "frame-system-benchmarking" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -5322,7 +5342,7 @@ dependencies = [ [[package]] name = "frame-system-rpc-runtime-api" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "parity-scale-codec", @@ -5332,7 +5352,7 @@ dependencies = [ [[package]] name = "frame-try-runtime" version = "0.47.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "parity-scale-codec", @@ -5572,9 +5592,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -5597,6 +5617,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "rand_core 0.10.0", + "wasip2", + "wasip3", +] + [[package]] name = "getrandom_or_panic" version = "0.0.3" @@ -6296,6 +6330,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "ident_case" version = "1.0.1" @@ -6823,7 +6863,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -6921,6 +6961,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" version = "0.2.176" @@ -6953,7 +6999,7 @@ dependencies = [ "either", "futures", "futures-timer", - "getrandom 0.2.16", + "getrandom 0.2.17", "libp2p-allow-block-list", "libp2p-connection-limits", "libp2p-core", @@ -7879,20 +7925,21 @@ dependencies = [ [[package]] name = "ml-kem" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97befee0c869cb56f3118f49d0f9bb68c9e3f380dec23c1100aedc4ec3ba239a" +checksum = "dcaee19a45f916d98f24a551cc9a2cdae705a040e66f3cbc4f3a282ea6a2e982" dependencies = [ "hybrid-array", "kem", "rand_core 0.6.4", "sha3", + "zeroize", ] [[package]] name = "mmr-gadget" version = "46.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "log", @@ -7911,7 +7958,7 @@ dependencies = [ [[package]] name = "mmr-rpc" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -8261,10 +8308,7 @@ checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65" name = "node-subtensor" version = "4.0.0-dev" dependencies = [ - "anyhow", "async-trait", - "blake2 0.10.6", - "chacha20poly1305", "clap", "fc-api", "fc-aura", @@ -8284,11 +8328,9 @@ dependencies = [ "frame-system-rpc-runtime-api", "futures", "hex", - "hkdf", "jsonrpsee", "log", "memmap2 0.9.8", - "ml-kem", "node-subtensor-runtime", "num-traits", "pallet-commitments", @@ -8300,10 +8342,7 @@ dependencies = [ "pallet-transaction-payment", "pallet-transaction-payment-rpc", "pallet-transaction-payment-rpc-runtime-api", - "parity-scale-codec", "polkadot-sdk", - "rand 0.8.5", - "rand_core 0.9.3", "sc-basic-authorship", "sc-chain-spec", "sc-chain-spec-derive", @@ -8331,7 +8370,6 @@ dependencies = [ "sc-transaction-pool-api", "serde", "serde_json", - "sha2 0.10.9", "sp-api", "sp-block-builder", "sp-blockchain", @@ -8351,6 +8389,9 @@ dependencies = [ "sp-session", "sp-timestamp", "sp-transaction-pool", + "stc-shield", + "stp-io", + "stp-shield", "substrate-build-script-utils", "substrate-frame-rpc-system", "substrate-prometheus-endpoint", @@ -8359,7 +8400,6 @@ dependencies = [ "subtensor-macros", "subtensor-runtime-common", "tokio", - "x25519-dalek", ] [[package]] @@ -8382,7 +8422,6 @@ dependencies = [ "frame-system-benchmarking", "frame-system-rpc-runtime-api", "frame-try-runtime", - "getrandom 0.2.16", "hex", "log", "pallet-admin-utils", @@ -8394,7 +8433,7 @@ dependencies = [ "pallet-balances", "pallet-base-fee", "pallet-commitments", - "pallet-contracts 40.1.0", + "pallet-contracts", "pallet-crowdloan", "pallet-drand", "pallet-election-provider-multi-phase", @@ -8448,6 +8487,7 @@ dependencies = [ "sp-consensus-grandpa", "sp-consensus-slots", "sp-core", + "sp-debug-derive", "sp-genesis-builder", "sp-inherents", "sp-io", @@ -8461,6 +8501,8 @@ dependencies = [ "sp-tracing", "sp-transaction-pool", "sp-version", + "stp-io", + "stp-shield", "substrate-fixed", "substrate-wasm-builder", "subtensor-chain-extensions", @@ -8861,7 +8903,7 @@ dependencies = [ [[package]] name = "pallet-alliance" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "frame-benchmarking", @@ -8873,7 +8915,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-io", "sp-runtime", ] @@ -8881,7 +8923,7 @@ dependencies = [ [[package]] name = "pallet-asset-conversion" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -8899,7 +8941,7 @@ dependencies = [ [[package]] name = "pallet-asset-conversion-ops" version = "0.9.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -8917,7 +8959,7 @@ dependencies = [ [[package]] name = "pallet-asset-conversion-tx-payment" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -8932,7 +8974,7 @@ dependencies = [ [[package]] name = "pallet-asset-rate" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -8946,7 +8988,7 @@ dependencies = [ [[package]] name = "pallet-asset-rewards" version = "0.3.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -8964,7 +9006,7 @@ dependencies = [ [[package]] name = "pallet-asset-tx-payment" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -8980,7 +9022,7 @@ dependencies = [ [[package]] name = "pallet-assets" version = "43.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "ethereum-standards", "frame-benchmarking", @@ -8998,7 +9040,7 @@ dependencies = [ [[package]] name = "pallet-assets-freezer" version = "0.8.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "pallet-assets", @@ -9010,7 +9052,7 @@ dependencies = [ [[package]] name = "pallet-assets-holder" version = "0.3.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -9025,7 +9067,7 @@ dependencies = [ [[package]] name = "pallet-atomic-swap" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "polkadot-sdk-frame", @@ -9035,7 +9077,7 @@ dependencies = [ [[package]] name = "pallet-aura" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -9051,7 +9093,7 @@ dependencies = [ [[package]] name = "pallet-authority-discovery" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -9066,7 +9108,7 @@ dependencies = [ [[package]] name = "pallet-authorship" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -9079,7 +9121,7 @@ dependencies = [ [[package]] name = "pallet-babe" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -9102,7 +9144,7 @@ dependencies = [ [[package]] name = "pallet-bags-list" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "aquamarine", "docify", @@ -9123,7 +9165,7 @@ dependencies = [ [[package]] name = "pallet-balances" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "frame-benchmarking", @@ -9139,7 +9181,7 @@ dependencies = [ [[package]] name = "pallet-base-fee" version = "1.0.0" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "fp-evm", "frame-support", @@ -9153,7 +9195,7 @@ dependencies = [ [[package]] name = "pallet-beefy" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -9172,7 +9214,7 @@ dependencies = [ [[package]] name = "pallet-beefy-mmr" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "binary-merkle-tree", @@ -9197,7 +9239,7 @@ dependencies = [ [[package]] name = "pallet-bounties" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -9214,7 +9256,7 @@ dependencies = [ [[package]] name = "pallet-bridge-grandpa" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-header-chain", "bp-runtime", @@ -9233,7 +9275,7 @@ dependencies = [ [[package]] name = "pallet-bridge-messages" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-header-chain", "bp-messages", @@ -9252,7 +9294,7 @@ dependencies = [ [[package]] name = "pallet-bridge-parachains" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-header-chain", "bp-parachains", @@ -9272,7 +9314,7 @@ dependencies = [ [[package]] name = "pallet-bridge-relayers" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-header-chain", "bp-messages", @@ -9295,7 +9337,7 @@ dependencies = [ [[package]] name = "pallet-broker" version = "0.20.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bitvec", "frame-benchmarking", @@ -9313,7 +9355,7 @@ dependencies = [ [[package]] name = "pallet-child-bounties" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -9331,7 +9373,7 @@ dependencies = [ [[package]] name = "pallet-collator-selection" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -9350,7 +9392,7 @@ dependencies = [ [[package]] name = "pallet-collective" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "frame-benchmarking", @@ -9367,7 +9409,7 @@ dependencies = [ [[package]] name = "pallet-collective-content" version = "0.19.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -9405,41 +9447,10 @@ dependencies = [ "w3f-bls 0.1.3", ] -[[package]] -name = "pallet-contracts" -version = "40.1.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=polkadot-stable2503-6#598feddb893f5ad3923a62e41a2f179b6e10c30c" -dependencies = [ - "environmental", - "frame-benchmarking", - "frame-support", - "frame-system", - "impl-trait-for-tuples", - "log", - "pallet-balances", - "pallet-contracts-proc-macro 23.0.3 (git+https://github.com/paritytech/polkadot-sdk.git?tag=polkadot-stable2503-6)", - "pallet-contracts-uapi 14.0.0 (git+https://github.com/paritytech/polkadot-sdk.git?tag=polkadot-stable2503-6)", - "parity-scale-codec", - "paste", - "rand 0.8.5", - "rand_pcg", - "scale-info", - "serde", - "smallvec", - "sp-api", - "sp-core", - "sp-io", - "sp-runtime", - "staging-xcm", - "staging-xcm-builder", - "wasm-instrument", - "wasmi 0.32.3", -] - [[package]] name = "pallet-contracts" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "environmental", "frame-benchmarking", @@ -9448,8 +9459,8 @@ dependencies = [ "impl-trait-for-tuples", "log", "pallet-balances", - "pallet-contracts-proc-macro 23.0.3 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", - "pallet-contracts-uapi 14.0.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "pallet-contracts-proc-macro", + "pallet-contracts-uapi", "parity-scale-codec", "paste", "rand 0.8.5", @@ -9470,14 +9481,14 @@ dependencies = [ [[package]] name = "pallet-contracts-mock-network" version = "18.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", "pallet-assets", "pallet-balances", - "pallet-contracts 41.0.0", - "pallet-contracts-uapi 14.0.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "pallet-contracts", + "pallet-contracts-uapi", "pallet-message-queue", "pallet-timestamp", "pallet-xcm", @@ -9501,17 +9512,7 @@ dependencies = [ [[package]] name = "pallet-contracts-proc-macro" version = "23.0.3" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=polkadot-stable2503-6#598feddb893f5ad3923a62e41a2f179b6e10c30c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.106", -] - -[[package]] -name = "pallet-contracts-proc-macro" -version = "23.0.3" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "proc-macro2", "quote", @@ -9521,18 +9522,7 @@ dependencies = [ [[package]] name = "pallet-contracts-uapi" version = "14.0.0" -source = "git+https://github.com/paritytech/polkadot-sdk.git?tag=polkadot-stable2503-6#598feddb893f5ad3923a62e41a2f179b6e10c30c" -dependencies = [ - "bitflags 1.3.2", - "parity-scale-codec", - "paste", - "scale-info", -] - -[[package]] -name = "pallet-contracts-uapi" -version = "14.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -9543,7 +9533,7 @@ dependencies = [ [[package]] name = "pallet-conviction-voting" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "assert_matches", "frame-benchmarking", @@ -9559,7 +9549,7 @@ dependencies = [ [[package]] name = "pallet-core-fellowship" version = "25.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -9596,7 +9586,7 @@ dependencies = [ [[package]] name = "pallet-delegated-staking" version = "8.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -9611,7 +9601,7 @@ dependencies = [ [[package]] name = "pallet-democracy" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -9628,7 +9618,7 @@ dependencies = [ [[package]] name = "pallet-dev-mode" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -9677,7 +9667,7 @@ dependencies = [ [[package]] name = "pallet-dummy-dim" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -9695,7 +9685,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-block" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -9716,7 +9706,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-multi-phase" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -9737,7 +9727,7 @@ dependencies = [ [[package]] name = "pallet-election-provider-support-benchmarking" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -9750,7 +9740,7 @@ dependencies = [ [[package]] name = "pallet-elections-phragmen" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -9768,7 +9758,7 @@ dependencies = [ [[package]] name = "pallet-ethereum" version = "4.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "ethereum", "ethereum-types", @@ -9791,7 +9781,7 @@ dependencies = [ [[package]] name = "pallet-evm" version = "6.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "cumulus-primitives-storage-weight-reclaim", "environmental", @@ -9816,7 +9806,7 @@ dependencies = [ [[package]] name = "pallet-evm-chain-id" version = "1.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "frame-support", "frame-system", @@ -9827,7 +9817,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-bn128" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "fp-evm", "sp-core", @@ -9837,7 +9827,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-dispatch" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "fp-evm", "frame-support", @@ -9849,7 +9839,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-modexp" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "fp-evm", "num", @@ -9858,7 +9848,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-sha3fips" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "fp-evm", "tiny-keccak", @@ -9867,7 +9857,7 @@ dependencies = [ [[package]] name = "pallet-evm-precompile-simple" version = "2.0.0-dev" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "fp-evm", "ripemd", @@ -9877,7 +9867,7 @@ dependencies = [ [[package]] name = "pallet-fast-unstake" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "frame-benchmarking", @@ -9895,7 +9885,7 @@ dependencies = [ [[package]] name = "pallet-glutton" version = "27.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "blake2 0.10.6", "frame-benchmarking", @@ -9913,7 +9903,7 @@ dependencies = [ [[package]] name = "pallet-grandpa" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -9935,7 +9925,7 @@ dependencies = [ [[package]] name = "pallet-hotfix-sufficients" version = "1.0.0" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "frame-benchmarking", "frame-support", @@ -9950,7 +9940,7 @@ dependencies = [ [[package]] name = "pallet-identity" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "enumflags2", "frame-benchmarking", @@ -9966,7 +9956,7 @@ dependencies = [ [[package]] name = "pallet-im-online" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -9985,7 +9975,7 @@ dependencies = [ [[package]] name = "pallet-indices" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -10000,7 +9990,7 @@ dependencies = [ [[package]] name = "pallet-insecure-randomness-collective-flip" version = "29.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "polkadot-sdk-frame", @@ -10011,7 +10001,7 @@ dependencies = [ [[package]] name = "pallet-lottery" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -10024,7 +10014,7 @@ dependencies = [ [[package]] name = "pallet-membership" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -10040,7 +10030,7 @@ dependencies = [ [[package]] name = "pallet-message-queue" version = "44.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "environmental", "frame-benchmarking", @@ -10059,7 +10049,7 @@ dependencies = [ [[package]] name = "pallet-meta-tx" version = "0.3.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "frame-benchmarking", @@ -10077,7 +10067,7 @@ dependencies = [ [[package]] name = "pallet-migrations" version = "11.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "frame-benchmarking", @@ -10096,7 +10086,7 @@ dependencies = [ [[package]] name = "pallet-mixnet" version = "0.17.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "parity-scale-codec", @@ -10110,7 +10100,7 @@ dependencies = [ [[package]] name = "pallet-mmr" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "parity-scale-codec", @@ -10122,7 +10112,7 @@ dependencies = [ [[package]] name = "pallet-multisig" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "parity-scale-codec", @@ -10133,7 +10123,7 @@ dependencies = [ [[package]] name = "pallet-nft-fractionalization" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "pallet-assets", @@ -10146,7 +10136,7 @@ dependencies = [ [[package]] name = "pallet-nfts" version = "35.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "enumflags2", "frame-benchmarking", @@ -10163,7 +10153,7 @@ dependencies = [ [[package]] name = "pallet-nis" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "polkadot-sdk-frame", @@ -10173,7 +10163,7 @@ dependencies = [ [[package]] name = "pallet-node-authorization" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "parity-scale-codec", @@ -10184,7 +10174,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools" version = "39.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -10202,7 +10192,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-benchmarking" version = "39.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -10222,7 +10212,7 @@ dependencies = [ [[package]] name = "pallet-nomination-pools-runtime-api" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "pallet-nomination-pools", "parity-scale-codec", @@ -10232,7 +10222,7 @@ dependencies = [ [[package]] name = "pallet-offences" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -10247,7 +10237,7 @@ dependencies = [ [[package]] name = "pallet-offences-benchmarking" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -10270,7 +10260,7 @@ dependencies = [ [[package]] name = "pallet-origin-restriction" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -10288,7 +10278,7 @@ dependencies = [ [[package]] name = "pallet-paged-list" version = "0.19.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "parity-scale-codec", @@ -10299,7 +10289,7 @@ dependencies = [ [[package]] name = "pallet-parameters" version = "0.12.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "frame-benchmarking", @@ -10316,7 +10306,7 @@ dependencies = [ [[package]] name = "pallet-people" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -10334,7 +10324,7 @@ dependencies = [ [[package]] name = "pallet-preimage" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -10350,7 +10340,7 @@ dependencies = [ [[package]] name = "pallet-proxy" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "polkadot-sdk-frame", @@ -10360,7 +10350,7 @@ dependencies = [ [[package]] name = "pallet-ranked-collective" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -10378,7 +10368,7 @@ dependencies = [ [[package]] name = "pallet-recovery" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "polkadot-sdk-frame", @@ -10388,7 +10378,7 @@ dependencies = [ [[package]] name = "pallet-referenda" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "assert_matches", "frame-benchmarking", @@ -10423,7 +10413,7 @@ dependencies = [ [[package]] name = "pallet-remark" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -10438,7 +10428,7 @@ dependencies = [ [[package]] name = "pallet-revive" version = "0.7.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "alloy-core", "derive_more 0.99.20", @@ -10484,7 +10474,7 @@ dependencies = [ [[package]] name = "pallet-revive-fixtures" version = "0.4.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "anyhow", "cargo_metadata", @@ -10498,7 +10488,7 @@ dependencies = [ [[package]] name = "pallet-revive-proc-macro" version = "0.3.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "proc-macro2", "quote", @@ -10508,7 +10498,7 @@ dependencies = [ [[package]] name = "pallet-revive-uapi" version = "0.5.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bitflags 1.3.2", "pallet-revive-proc-macro", @@ -10520,7 +10510,7 @@ dependencies = [ [[package]] name = "pallet-root-offences" version = "38.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -10536,7 +10526,7 @@ dependencies = [ [[package]] name = "pallet-root-testing" version = "17.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -10549,7 +10539,7 @@ dependencies = [ [[package]] name = "pallet-safe-mode" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "pallet-balances", @@ -10563,7 +10553,7 @@ dependencies = [ [[package]] name = "pallet-salary" version = "26.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "pallet-ranked-collective", @@ -10575,7 +10565,7 @@ dependencies = [ [[package]] name = "pallet-scheduler" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "frame-benchmarking", @@ -10592,7 +10582,7 @@ dependencies = [ [[package]] name = "pallet-scored-pool" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -10605,7 +10595,7 @@ dependencies = [ [[package]] name = "pallet-session" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -10626,7 +10616,7 @@ dependencies = [ [[package]] name = "pallet-session-benchmarking" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -10643,26 +10633,35 @@ dependencies = [ name = "pallet-shield" version = "0.0.1" dependencies = [ + "chacha20poly1305", "frame-benchmarking", "frame-support", "frame-system", + "log", + "ml-kem", "pallet-aura", - "pallet-timestamp", + "pallet-subtensor-utility", "parity-scale-codec", + "rand_chacha 0.3.1", "scale-info", "sp-consensus-aura", "sp-core", + "sp-inherents", "sp-io", "sp-runtime", "sp-std", "sp-weights", + "stc-shield", + "stp-io", + "stp-shield", "subtensor-macros", + "subtensor-runtime-common", ] [[package]] name = "pallet-skip-feeless-payment" version = "16.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -10674,7 +10673,7 @@ dependencies = [ [[package]] name = "pallet-society" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -10691,7 +10690,7 @@ dependencies = [ [[package]] name = "pallet-staking" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -10713,7 +10712,7 @@ dependencies = [ [[package]] name = "pallet-staking-async" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-election-provider-support", @@ -10736,7 +10735,7 @@ dependencies = [ [[package]] name = "pallet-staking-async-ah-client" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -10755,7 +10754,7 @@ dependencies = [ [[package]] name = "pallet-staking-async-rc-client" version = "0.2.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -10772,7 +10771,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-curve" version = "12.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", @@ -10783,7 +10782,7 @@ dependencies = [ [[package]] name = "pallet-staking-reward-fn" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "sp-arithmetic", @@ -10792,7 +10791,7 @@ dependencies = [ [[package]] name = "pallet-staking-runtime-api" version = "27.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "sp-api", @@ -10802,7 +10801,7 @@ dependencies = [ [[package]] name = "pallet-state-trie-migration" version = "46.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -10818,7 +10817,7 @@ dependencies = [ [[package]] name = "pallet-statement" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", @@ -10862,7 +10861,7 @@ dependencies = [ "pallet-transaction-payment", "parity-scale-codec", "polkadot-runtime-common", - "rand 0.8.5", + "rand 0.10.0", "rand_chacha 0.3.1", "safe-math", "scale-info", @@ -10981,7 +10980,7 @@ dependencies = [ [[package]] name = "pallet-sudo" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "frame-benchmarking", @@ -10996,7 +10995,7 @@ dependencies = [ [[package]] name = "pallet-timestamp" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "frame-benchmarking", @@ -11014,7 +11013,7 @@ dependencies = [ [[package]] name = "pallet-tips" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -11032,7 +11031,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -11047,7 +11046,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc" version = "44.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "jsonrpsee", "pallet-transaction-payment-rpc-runtime-api", @@ -11063,7 +11062,7 @@ dependencies = [ [[package]] name = "pallet-transaction-payment-rpc-runtime-api" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "pallet-transaction-payment", "parity-scale-codec", @@ -11075,7 +11074,7 @@ dependencies = [ [[package]] name = "pallet-transaction-storage" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "frame-benchmarking", @@ -11094,7 +11093,7 @@ dependencies = [ [[package]] name = "pallet-treasury" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "frame-benchmarking", @@ -11113,7 +11112,7 @@ dependencies = [ [[package]] name = "pallet-tx-pause" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "parity-scale-codec", @@ -11124,7 +11123,7 @@ dependencies = [ [[package]] name = "pallet-uniques" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -11138,7 +11137,7 @@ dependencies = [ [[package]] name = "pallet-utility" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -11153,7 +11152,7 @@ dependencies = [ [[package]] name = "pallet-verify-signature" version = "0.4.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -11168,7 +11167,7 @@ dependencies = [ [[package]] name = "pallet-vesting" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -11182,7 +11181,7 @@ dependencies = [ [[package]] name = "pallet-whitelist" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "polkadot-sdk-frame", @@ -11192,7 +11191,7 @@ dependencies = [ [[package]] name = "pallet-xcm" version = "20.1.3" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bounded-collections 0.2.4", "frame-benchmarking", @@ -11218,7 +11217,7 @@ dependencies = [ [[package]] name = "pallet-xcm-benchmarks" version = "21.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-benchmarking", "frame-support", @@ -11235,7 +11234,7 @@ dependencies = [ [[package]] name = "pallet-xcm-bridge-hub" version = "0.17.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-messages", "bp-runtime", @@ -11257,7 +11256,7 @@ dependencies = [ [[package]] name = "pallet-xcm-bridge-hub-router" version = "0.19.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-xcm-bridge-hub-router", "frame-benchmarking", @@ -11277,7 +11276,7 @@ dependencies = [ [[package]] name = "parachains-common" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-primitives-core", "cumulus-primitives-utility", @@ -11616,7 +11615,7 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "polkadot-approval-distribution" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "futures-timer", @@ -11634,7 +11633,7 @@ dependencies = [ [[package]] name = "polkadot-availability-bitfield-distribution" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "futures-timer", @@ -11649,7 +11648,7 @@ dependencies = [ [[package]] name = "polkadot-availability-distribution" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "fatality", "futures", @@ -11672,7 +11671,7 @@ dependencies = [ [[package]] name = "polkadot-availability-recovery" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "fatality", @@ -11705,7 +11704,7 @@ dependencies = [ [[package]] name = "polkadot-cli" version = "25.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "clap", "frame-benchmarking-cli", @@ -11729,7 +11728,7 @@ dependencies = [ [[package]] name = "polkadot-collator-protocol" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bitvec", "fatality", @@ -11752,7 +11751,7 @@ dependencies = [ [[package]] name = "polkadot-core-primitives" version = "18.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "scale-info", @@ -11763,7 +11762,7 @@ dependencies = [ [[package]] name = "polkadot-dispute-distribution" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "fatality", "futures", @@ -11785,7 +11784,7 @@ dependencies = [ [[package]] name = "polkadot-erasure-coding" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "polkadot-node-primitives", @@ -11799,7 +11798,7 @@ dependencies = [ [[package]] name = "polkadot-gossip-support" version = "24.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "futures-timer", @@ -11812,7 +11811,7 @@ dependencies = [ "sc-network", "sp-application-crypto", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-keystore", "tracing-gum", ] @@ -11820,7 +11819,7 @@ dependencies = [ [[package]] name = "polkadot-network-bridge" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "always-assert", "async-trait", @@ -11843,7 +11842,7 @@ dependencies = [ [[package]] name = "polkadot-node-collation-generation" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "parity-scale-codec", @@ -11861,7 +11860,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "bitvec", @@ -11893,7 +11892,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-approval-voting-parallel" version = "0.7.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "futures", @@ -11917,7 +11916,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-av-store" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bitvec", "futures", @@ -11936,7 +11935,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-backing" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bitvec", "fatality", @@ -11957,7 +11956,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-bitfield-signing" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "polkadot-node-subsystem", @@ -11972,7 +11971,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-candidate-validation" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "futures", @@ -11994,7 +11993,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-api" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "polkadot-node-metrics", @@ -12008,7 +12007,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-chain-selection" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "futures-timer", @@ -12024,7 +12023,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-dispute-coordinator" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "fatality", "futures", @@ -12042,7 +12041,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-parachains-inherent" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "futures", @@ -12059,7 +12058,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-prospective-parachains" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "fatality", "futures", @@ -12073,7 +12072,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-provisioner" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bitvec", "fatality", @@ -12090,7 +12089,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "always-assert", "array-bytes 6.2.3", @@ -12118,7 +12117,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-checker" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "polkadot-node-subsystem", @@ -12131,7 +12130,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-pvf-common" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cpu-time", "futures", @@ -12146,7 +12145,7 @@ dependencies = [ "sc-executor-wasmtime", "seccompiler", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-externalities", "sp-io", "sp-tracing", @@ -12157,7 +12156,7 @@ dependencies = [ [[package]] name = "polkadot-node-core-runtime-api" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "polkadot-node-metrics", @@ -12172,7 +12171,7 @@ dependencies = [ [[package]] name = "polkadot-node-metrics" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bs58", "futures", @@ -12189,7 +12188,7 @@ dependencies = [ [[package]] name = "polkadot-node-network-protocol" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-channel 1.9.0", "async-trait", @@ -12214,7 +12213,7 @@ dependencies = [ [[package]] name = "polkadot-node-primitives" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bitvec", "bounded-vec", @@ -12238,7 +12237,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "polkadot-node-subsystem-types", "polkadot-overseer", @@ -12247,7 +12246,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-types" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "derive_more 0.99.20", @@ -12275,7 +12274,7 @@ dependencies = [ [[package]] name = "polkadot-node-subsystem-util" version = "24.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "fatality", "futures", @@ -12306,7 +12305,7 @@ dependencies = [ [[package]] name = "polkadot-omni-node-lib" version = "0.7.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "clap", @@ -12392,7 +12391,7 @@ dependencies = [ [[package]] name = "polkadot-overseer" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "futures", @@ -12412,7 +12411,7 @@ dependencies = [ [[package]] name = "polkadot-parachain-primitives" version = "17.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bounded-collections 0.2.4", "derive_more 0.99.20", @@ -12428,7 +12427,7 @@ dependencies = [ [[package]] name = "polkadot-primitives" version = "19.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bitvec", "bounded-collections 0.2.4", @@ -12457,7 +12456,7 @@ dependencies = [ [[package]] name = "polkadot-rpc" version = "25.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "jsonrpsee", "mmr-rpc", @@ -12490,7 +12489,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-common" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bitvec", "frame-benchmarking", @@ -12540,7 +12539,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-metrics" version = "21.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bs58", "frame-benchmarking", @@ -12552,7 +12551,7 @@ dependencies = [ [[package]] name = "polkadot-runtime-parachains" version = "20.0.2" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bitflags 1.3.2", "bitvec", @@ -12600,7 +12599,7 @@ dependencies = [ [[package]] name = "polkadot-sdk" version = "2506.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "assets-common", "bridge-hub-common", @@ -12655,7 +12654,7 @@ dependencies = [ "pallet-collator-selection", "pallet-collective", "pallet-collective-content", - "pallet-contracts 41.0.0", + "pallet-contracts", "pallet-contracts-mock-network", "pallet-conviction-voting", "pallet-core-fellowship", @@ -12758,7 +12757,7 @@ dependencies = [ [[package]] name = "polkadot-sdk-frame" version = "0.10.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "frame-benchmarking", @@ -12793,7 +12792,7 @@ dependencies = [ [[package]] name = "polkadot-service" version = "25.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "frame-benchmarking", @@ -12901,7 +12900,7 @@ dependencies = [ [[package]] name = "polkadot-statement-distribution" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bitvec", "fatality", @@ -12921,7 +12920,7 @@ dependencies = [ [[package]] name = "polkadot-statement-table" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "polkadot-primitives", @@ -13135,7 +13134,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug 0.3.1", "universal-hash", ] @@ -13147,7 +13146,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug 0.3.1", "universal-hash", ] @@ -13194,7 +13193,7 @@ dependencies = [ [[package]] name = "precompile-utils" version = "0.1.0" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "derive_more 1.0.0", "environmental", @@ -13223,14 +13222,14 @@ dependencies = [ [[package]] name = "precompile-utils-macro" version = "0.1.0" -source = "git+https://github.com/opentensor/frontier?rev=f12a1274f91442a564bb722a2b9547caba487fa0#f12a1274f91442a564bb722a2b9547caba487fa0" +source = "git+https://github.com/opentensor/frontier?rev=b4ee632bbc81321d3891c82dd2c4c01438625d83#b4ee632bbc81321d3891c82dd2c4c01438625d83" dependencies = [ "case", "num_enum", "prettyplease", "proc-macro2", "quote", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "syn 2.0.106", ] @@ -13412,7 +13411,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "syn 2.0.106", ] @@ -13742,6 +13741,17 @@ dependencies = [ "serde", ] +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20 0.10.0", + "getrandom 0.4.1", + "rand_core 0.10.0", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -13768,7 +13778,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] @@ -13781,6 +13791,12 @@ dependencies = [ "serde", ] +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + [[package]] name = "rand_distr" version = "0.4.3" @@ -13880,7 +13896,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", "thiserror 1.0.69", ] @@ -14034,7 +14050,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted 0.9.0", "windows-sys 0.52.0", @@ -14123,7 +14139,7 @@ dependencies = [ [[package]] name = "rococo-runtime" version = "24.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "binary-merkle-tree", "bitvec", @@ -14221,7 +14237,7 @@ dependencies = [ [[package]] name = "rococo-runtime-constants" version = "21.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "polkadot-primitives", @@ -14650,7 +14666,7 @@ dependencies = [ [[package]] name = "sc-allocator" version = "32.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "sp-core", @@ -14661,7 +14677,7 @@ dependencies = [ [[package]] name = "sc-authority-discovery" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "futures", @@ -14692,7 +14708,7 @@ dependencies = [ [[package]] name = "sc-basic-authorship" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "log", @@ -14707,13 +14723,14 @@ dependencies = [ "sp-core", "sp-inherents", "sp-runtime", + "stp-shield", "substrate-prometheus-endpoint", ] [[package]] name = "sc-block-builder" version = "0.45.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "sp-api", @@ -14728,7 +14745,7 @@ dependencies = [ [[package]] name = "sc-chain-spec" version = "44.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "clap", @@ -14744,7 +14761,7 @@ dependencies = [ "serde_json", "sp-blockchain", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-genesis-builder", "sp-io", "sp-runtime", @@ -14755,7 +14772,7 @@ dependencies = [ [[package]] name = "sc-chain-spec-derive" version = "12.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", @@ -14766,7 +14783,7 @@ dependencies = [ [[package]] name = "sc-cli" version = "0.53.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "chrono", @@ -14808,7 +14825,7 @@ dependencies = [ [[package]] name = "sc-client-api" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "fnv", "futures", @@ -14834,7 +14851,7 @@ dependencies = [ [[package]] name = "sc-client-db" version = "0.47.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "hash-db", "kvdb", @@ -14862,7 +14879,7 @@ dependencies = [ [[package]] name = "sc-consensus" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "futures", @@ -14885,7 +14902,7 @@ dependencies = [ [[package]] name = "sc-consensus-aura" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "futures", @@ -14914,7 +14931,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "fork-tree", @@ -14939,7 +14956,7 @@ dependencies = [ "sp-consensus-babe", "sp-consensus-slots", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-inherents", "sp-keystore", "sp-runtime", @@ -14950,7 +14967,7 @@ dependencies = [ [[package]] name = "sc-consensus-babe-rpc" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "jsonrpsee", @@ -14972,7 +14989,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy" version = "30.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -15006,7 +15023,7 @@ dependencies = [ [[package]] name = "sc-consensus-beefy-rpc" version = "30.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "jsonrpsee", @@ -15026,7 +15043,7 @@ dependencies = [ [[package]] name = "sc-consensus-epochs" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "fork-tree", "parity-scale-codec", @@ -15039,7 +15056,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa" version = "0.36.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "ahash 0.8.12", "array-bytes 6.2.3", @@ -15073,7 +15090,7 @@ dependencies = [ "sp-consensus", "sp-consensus-grandpa", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-keystore", "sp-runtime", "substrate-prometheus-endpoint", @@ -15083,7 +15100,7 @@ dependencies = [ [[package]] name = "sc-consensus-grandpa-rpc" version = "0.36.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "finality-grandpa", "futures", @@ -15103,7 +15120,7 @@ dependencies = [ [[package]] name = "sc-consensus-manual-seal" version = "0.52.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "assert_matches", "async-trait", @@ -15138,7 +15155,7 @@ dependencies = [ [[package]] name = "sc-consensus-slots" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "futures", @@ -15161,7 +15178,7 @@ dependencies = [ [[package]] name = "sc-executor" version = "0.43.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "parking_lot 0.12.5", @@ -15184,7 +15201,7 @@ dependencies = [ [[package]] name = "sc-executor-common" version = "0.39.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "polkavm 0.24.0", "sc-allocator", @@ -15197,7 +15214,7 @@ dependencies = [ [[package]] name = "sc-executor-polkavm" version = "0.36.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "polkavm 0.24.0", @@ -15208,7 +15225,7 @@ dependencies = [ [[package]] name = "sc-executor-wasmtime" version = "0.39.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "anyhow", "log", @@ -15224,7 +15241,7 @@ dependencies = [ [[package]] name = "sc-informant" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "console", "futures", @@ -15240,7 +15257,7 @@ dependencies = [ [[package]] name = "sc-keystore" version = "36.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "parking_lot 0.12.5", @@ -15254,7 +15271,7 @@ dependencies = [ [[package]] name = "sc-mixnet" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "arrayvec 0.7.6", @@ -15282,7 +15299,7 @@ dependencies = [ [[package]] name = "sc-network" version = "0.51.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -15332,7 +15349,7 @@ dependencies = [ [[package]] name = "sc-network-common" version = "0.49.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bitflags 1.3.2", "parity-scale-codec", @@ -15342,7 +15359,7 @@ dependencies = [ [[package]] name = "sc-network-gossip" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "ahash 0.8.12", "futures", @@ -15361,7 +15378,7 @@ dependencies = [ [[package]] name = "sc-network-light" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -15382,7 +15399,7 @@ dependencies = [ [[package]] name = "sc-network-statement" version = "0.33.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -15402,7 +15419,7 @@ dependencies = [ [[package]] name = "sc-network-sync" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "async-channel 1.9.0", @@ -15437,7 +15454,7 @@ dependencies = [ [[package]] name = "sc-network-transactions" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "futures", @@ -15456,7 +15473,7 @@ dependencies = [ [[package]] name = "sc-network-types" version = "0.17.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bs58", "bytes", @@ -15477,7 +15494,7 @@ dependencies = [ [[package]] name = "sc-offchain" version = "46.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bytes", "fnv", @@ -15511,7 +15528,7 @@ dependencies = [ [[package]] name = "sc-proposer-metrics" version = "0.20.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "substrate-prometheus-endpoint", @@ -15520,7 +15537,7 @@ dependencies = [ [[package]] name = "sc-rpc" version = "46.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "jsonrpsee", @@ -15552,7 +15569,7 @@ dependencies = [ [[package]] name = "sc-rpc-api" version = "0.50.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -15572,7 +15589,7 @@ dependencies = [ [[package]] name = "sc-rpc-server" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "dyn-clone", "forwarded-header-value", @@ -15596,7 +15613,7 @@ dependencies = [ [[package]] name = "sc-rpc-spec-v2" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "futures", @@ -15629,13 +15646,13 @@ dependencies = [ [[package]] name = "sc-runtime-utilities" version = "0.3.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "sc-executor", "sc-executor-common", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-state-machine", "sp-wasm-interface", "thiserror 1.0.69", @@ -15644,7 +15661,7 @@ dependencies = [ [[package]] name = "sc-service" version = "0.52.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "directories", @@ -15708,7 +15725,7 @@ dependencies = [ [[package]] name = "sc-state-db" version = "0.39.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "parity-scale-codec", @@ -15719,7 +15736,7 @@ dependencies = [ [[package]] name = "sc-statement-store" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "parity-db", @@ -15738,7 +15755,7 @@ dependencies = [ [[package]] name = "sc-storage-monitor" version = "0.25.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "clap", "fs4", @@ -15751,7 +15768,7 @@ dependencies = [ [[package]] name = "sc-sync-state-rpc" version = "0.51.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -15770,7 +15787,7 @@ dependencies = [ [[package]] name = "sc-sysinfo" version = "43.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "derive_more 0.99.20", "futures", @@ -15783,14 +15800,14 @@ dependencies = [ "serde", "serde_json", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-io", ] [[package]] name = "sc-telemetry" version = "29.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "chrono", "futures", @@ -15809,7 +15826,7 @@ dependencies = [ [[package]] name = "sc-tracing" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "chrono", "console", @@ -15837,7 +15854,7 @@ dependencies = [ [[package]] name = "sc-tracing-proc-macro" version = "11.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "proc-macro-crate 3.4.0", "proc-macro2", @@ -15848,7 +15865,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool" version = "40.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "futures", @@ -15865,7 +15882,7 @@ dependencies = [ "sp-api", "sp-blockchain", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-runtime", "sp-tracing", "sp-transaction-pool", @@ -15879,7 +15896,7 @@ dependencies = [ [[package]] name = "sc-transaction-pool-api" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "futures", @@ -15896,7 +15913,7 @@ dependencies = [ [[package]] name = "sc-utils" version = "19.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-channel 1.9.0", "futures", @@ -16442,7 +16459,7 @@ checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" dependencies = [ "block-buffer 0.9.0", "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.9.0", "opaque-debug 0.3.1", ] @@ -16454,7 +16471,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.10.7", ] @@ -16466,7 +16483,7 @@ checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" dependencies = [ "block-buffer 0.9.0", "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.9.0", "opaque-debug 0.3.1", ] @@ -16478,7 +16495,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.10.7", ] @@ -16626,7 +16643,7 @@ checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" [[package]] name = "slot-range-helper" version = "18.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "enumn", "parity-scale-codec", @@ -16696,7 +16713,7 @@ dependencies = [ "bip39", "blake2-rfc", "bs58", - "chacha20", + "chacha20 0.9.1", "crossbeam-queue", "derive_more 0.99.20", "ed25519-zebra", @@ -16750,7 +16767,7 @@ dependencies = [ "bip39", "blake2-rfc", "bs58", - "chacha20", + "chacha20 0.9.1", "crossbeam-queue", "derive_more 0.99.20", "ed25519-zebra", @@ -16889,7 +16906,7 @@ dependencies = [ [[package]] name = "snowbridge-core" version = "0.14.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bp-relayers", "frame-support", @@ -16973,7 +16990,7 @@ dependencies = [ [[package]] name = "sp-api" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "hash-db", @@ -16995,7 +17012,7 @@ dependencies = [ [[package]] name = "sp-api-proc-macro" version = "23.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "Inflector", "blake2 0.10.6", @@ -17009,7 +17026,7 @@ dependencies = [ [[package]] name = "sp-application-crypto" version = "41.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "scale-info", @@ -17021,7 +17038,7 @@ dependencies = [ [[package]] name = "sp-arithmetic" version = "27.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "integer-sqrt", @@ -17035,7 +17052,7 @@ dependencies = [ [[package]] name = "sp-authority-discovery" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "scale-info", @@ -17047,7 +17064,7 @@ dependencies = [ [[package]] name = "sp-block-builder" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "sp-api", "sp-inherents", @@ -17057,7 +17074,7 @@ dependencies = [ [[package]] name = "sp-blockchain" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "futures", "parity-scale-codec", @@ -17076,7 +17093,7 @@ dependencies = [ [[package]] name = "sp-consensus" version = "0.43.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "futures", @@ -17090,7 +17107,7 @@ dependencies = [ [[package]] name = "sp-consensus-aura" version = "0.43.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "parity-scale-codec", @@ -17106,7 +17123,7 @@ dependencies = [ [[package]] name = "sp-consensus-babe" version = "0.43.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "parity-scale-codec", @@ -17124,7 +17141,7 @@ dependencies = [ [[package]] name = "sp-consensus-beefy" version = "25.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "scale-info", @@ -17132,7 +17149,7 @@ dependencies = [ "sp-api", "sp-application-crypto", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-io", "sp-keystore", "sp-mmr-primitives", @@ -17144,7 +17161,7 @@ dependencies = [ [[package]] name = "sp-consensus-grandpa" version = "24.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "finality-grandpa", "log", @@ -17161,7 +17178,7 @@ dependencies = [ [[package]] name = "sp-consensus-slots" version = "0.43.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "scale-info", @@ -17172,7 +17189,7 @@ dependencies = [ [[package]] name = "sp-core" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "ark-vrf", "array-bytes 6.2.3", @@ -17203,7 +17220,7 @@ dependencies = [ "secrecy 0.8.0", "serde", "sha2 0.10.9", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-debug-derive", "sp-externalities", "sp-runtime-interface", @@ -17220,7 +17237,7 @@ dependencies = [ [[package]] name = "sp-crypto-ec-utils" version = "0.16.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "ark-bls12-377", "ark-bls12-377-ext", @@ -17254,7 +17271,7 @@ dependencies = [ [[package]] name = "sp-crypto-hashing" version = "0.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "blake2b_simd", "byteorder", @@ -17267,17 +17284,17 @@ dependencies = [ [[package]] name = "sp-crypto-hashing-proc-macro" version = "0.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "quote", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "syn 2.0.106", ] [[package]] name = "sp-database" version = "10.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "kvdb", "parking_lot 0.12.5", @@ -17286,7 +17303,7 @@ dependencies = [ [[package]] name = "sp-debug-derive" version = "14.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "proc-macro2", "quote", @@ -17296,7 +17313,7 @@ dependencies = [ [[package]] name = "sp-externalities" version = "0.30.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "environmental", "parity-scale-codec", @@ -17306,7 +17323,7 @@ dependencies = [ [[package]] name = "sp-genesis-builder" version = "0.18.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "scale-info", @@ -17318,7 +17335,7 @@ dependencies = [ [[package]] name = "sp-inherents" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "impl-trait-for-tuples", @@ -17331,7 +17348,7 @@ dependencies = [ [[package]] name = "sp-io" version = "41.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bytes", "docify", @@ -17343,7 +17360,7 @@ dependencies = [ "rustversion", "secp256k1 0.28.2", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-externalities", "sp-keystore", "sp-runtime-interface", @@ -17357,7 +17374,7 @@ dependencies = [ [[package]] name = "sp-keyring" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "sp-core", "sp-runtime", @@ -17367,7 +17384,7 @@ dependencies = [ [[package]] name = "sp-keystore" version = "0.43.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "parking_lot 0.12.5", @@ -17378,7 +17395,7 @@ dependencies = [ [[package]] name = "sp-maybe-compressed-blob" version = "11.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "thiserror 1.0.69", "zstd 0.12.4", @@ -17387,7 +17404,7 @@ dependencies = [ [[package]] name = "sp-metadata-ir" version = "0.11.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-metadata 23.0.0", "parity-scale-codec", @@ -17397,7 +17414,7 @@ dependencies = [ [[package]] name = "sp-mixnet" version = "0.15.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "scale-info", @@ -17408,7 +17425,7 @@ dependencies = [ [[package]] name = "sp-mmr-primitives" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "log", "parity-scale-codec", @@ -17425,7 +17442,7 @@ dependencies = [ [[package]] name = "sp-npos-elections" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "scale-info", @@ -17438,7 +17455,7 @@ dependencies = [ [[package]] name = "sp-offchain" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "sp-api", "sp-core", @@ -17448,7 +17465,7 @@ dependencies = [ [[package]] name = "sp-panic-handler" version = "13.0.2" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "backtrace", "regex", @@ -17457,7 +17474,7 @@ dependencies = [ [[package]] name = "sp-rpc" version = "35.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "rustc-hash 1.1.0", "serde", @@ -17467,7 +17484,7 @@ dependencies = [ [[package]] name = "sp-runtime" version = "42.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "binary-merkle-tree", "docify", @@ -17496,7 +17513,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface" version = "30.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bytes", "impl-trait-for-tuples", @@ -17515,7 +17532,7 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" version = "19.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "Inflector", "expander", @@ -17528,7 +17545,7 @@ dependencies = [ [[package]] name = "sp-session" version = "39.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "scale-info", @@ -17542,7 +17559,7 @@ dependencies = [ [[package]] name = "sp-staking" version = "39.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "impl-trait-for-tuples", "parity-scale-codec", @@ -17555,7 +17572,7 @@ dependencies = [ [[package]] name = "sp-state-machine" version = "0.46.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "hash-db", "log", @@ -17575,7 +17592,7 @@ dependencies = [ [[package]] name = "sp-statement-store" version = "21.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "aes-gcm", "curve25519-dalek", @@ -17588,7 +17605,7 @@ dependencies = [ "sp-api", "sp-application-crypto", "sp-core", - "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8)", + "sp-crypto-hashing 0.1.0 (git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f)", "sp-externalities", "sp-runtime", "sp-runtime-interface", @@ -17599,12 +17616,12 @@ dependencies = [ [[package]] name = "sp-std" version = "14.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" [[package]] name = "sp-storage" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "impl-serde", "parity-scale-codec", @@ -17616,7 +17633,7 @@ dependencies = [ [[package]] name = "sp-timestamp" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "parity-scale-codec", @@ -17628,7 +17645,7 @@ dependencies = [ [[package]] name = "sp-tracing" version = "17.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "tracing", @@ -17639,7 +17656,7 @@ dependencies = [ [[package]] name = "sp-transaction-pool" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "sp-api", "sp-runtime", @@ -17648,7 +17665,7 @@ dependencies = [ [[package]] name = "sp-transaction-storage-proof" version = "37.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "async-trait", "parity-scale-codec", @@ -17662,7 +17679,7 @@ dependencies = [ [[package]] name = "sp-trie" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "ahash 0.8.12", "foldhash 0.1.5", @@ -17687,7 +17704,7 @@ dependencies = [ [[package]] name = "sp-version" version = "40.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "impl-serde", "parity-scale-codec", @@ -17704,7 +17721,7 @@ dependencies = [ [[package]] name = "sp-version-proc-macro" version = "15.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "parity-scale-codec", "proc-macro-warning", @@ -17716,7 +17733,7 @@ dependencies = [ [[package]] name = "sp-wasm-interface" version = "22.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "anyhow", "impl-trait-for-tuples", @@ -17728,7 +17745,7 @@ dependencies = [ [[package]] name = "sp-weights" version = "32.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "bounded-collections 0.2.4", "parity-scale-codec", @@ -17902,7 +17919,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "staging-chain-spec-builder" version = "12.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "clap", "docify", @@ -17915,7 +17932,7 @@ dependencies = [ [[package]] name = "staging-node-inspect" version = "0.29.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "clap", "parity-scale-codec", @@ -17933,7 +17950,7 @@ dependencies = [ [[package]] name = "staging-parachain-info" version = "0.21.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "cumulus-primitives-core", "frame-support", @@ -17946,7 +17963,7 @@ dependencies = [ [[package]] name = "staging-xcm" version = "17.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "bounded-collections 0.2.4", @@ -17967,7 +17984,7 @@ dependencies = [ [[package]] name = "staging-xcm-builder" version = "21.1.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "environmental", "frame-support", @@ -17991,7 +18008,7 @@ dependencies = [ [[package]] name = "staging-xcm-executor" version = "20.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "environmental", "frame-benchmarking", @@ -18042,6 +18059,51 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "stc-shield" +version = "0.1.0" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" +dependencies = [ + "anyhow", + "async-trait", + "chacha20poly1305", + "futures", + "hex", + "log", + "ml-kem", + "parity-scale-codec", + "rand 0.8.5", + "sc-client-api", + "sc-service", + "sp-consensus", + "sp-inherents", + "sp-runtime", + "stp-shield", +] + +[[package]] +name = "stp-io" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "sp-externalities", + "sp-runtime-interface", + "stp-shield", +] + +[[package]] +name = "stp-shield" +version = "0.1.0" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" +dependencies = [ + "parity-scale-codec", + "scale-info", + "sp-api", + "sp-externalities", + "sp-inherents", + "sp-runtime", +] + [[package]] name = "string-interner" version = "0.17.0" @@ -18103,7 +18165,7 @@ dependencies = [ [[package]] name = "substrate-bip39" version = "0.6.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "hmac 0.12.1", "pbkdf2", @@ -18128,7 +18190,7 @@ dependencies = [ [[package]] name = "substrate-build-script-utils" version = "11.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" [[package]] name = "substrate-fixed" @@ -18144,7 +18206,7 @@ dependencies = [ [[package]] name = "substrate-frame-rpc-system" version = "45.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "docify", "frame-system-rpc-runtime-api", @@ -18164,7 +18226,7 @@ dependencies = [ [[package]] name = "substrate-prometheus-endpoint" version = "0.17.6" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "http-body-util", "hyper 1.7.0", @@ -18178,7 +18240,7 @@ dependencies = [ [[package]] name = "substrate-state-trie-migration-rpc" version = "44.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "jsonrpsee", "parity-scale-codec", @@ -18205,7 +18267,7 @@ dependencies = [ [[package]] name = "substrate-wasm-builder" version = "27.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "array-bytes 6.2.3", "build-helper", @@ -18253,7 +18315,7 @@ dependencies = [ "log", "num_enum", "pallet-balances", - "pallet-contracts 40.1.0", + "pallet-contracts", "pallet-crowdloan", "pallet-drand", "pallet-preimage", @@ -19235,7 +19297,7 @@ dependencies = [ [[package]] name = "tracing-gum" version = "20.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "coarsetime", "polkadot-primitives", @@ -19246,7 +19308,7 @@ dependencies = [ [[package]] name = "tracing-gum-proc-macro" version = "5.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "expander", "proc-macro-crate 3.4.0", @@ -19717,7 +19779,16 @@ version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.46.0", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", ] [[package]] @@ -19801,6 +19872,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser 0.244.0", +] + [[package]] name = "wasm-instrument" version = "0.4.0" @@ -19810,6 +19891,18 @@ dependencies = [ "parity-wasm", ] +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.11.4", + "wasm-encoder", + "wasmparser 0.244.0", +] + [[package]] name = "wasm-opt" version = "0.116.1" @@ -19946,6 +20039,18 @@ dependencies = [ "url", ] +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.9.4", + "hashbrown 0.15.5", + "indexmap 2.11.4", + "semver 1.0.27", +] + [[package]] name = "wasmparser-nostd" version = "0.100.2" @@ -19974,7 +20079,7 @@ dependencies = [ "rayon", "serde", "target-lexicon", - "wasmparser", + "wasmparser 0.102.0", "wasmtime-cache", "wasmtime-cranelift", "wasmtime-environ", @@ -20029,7 +20134,7 @@ dependencies = [ "object 0.30.4", "target-lexicon", "thiserror 1.0.69", - "wasmparser", + "wasmparser 0.102.0", "wasmtime-cranelift-shared", "wasmtime-environ", ] @@ -20064,7 +20169,7 @@ dependencies = [ "serde", "target-lexicon", "thiserror 1.0.69", - "wasmparser", + "wasmparser 0.102.0", "wasmtime-types", ] @@ -20147,7 +20252,7 @@ dependencies = [ "cranelift-entity", "serde", "thiserror 1.0.69", - "wasmparser", + "wasmparser 0.102.0", ] [[package]] @@ -20197,7 +20302,7 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "westend-runtime" version = "24.0.1" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "binary-merkle-tree", "bitvec", @@ -20304,7 +20409,7 @@ dependencies = [ [[package]] name = "westend-runtime-constants" version = "21.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "polkadot-primitives", @@ -20793,6 +20898,94 @@ version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck 0.5.0", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck 0.5.0", + "indexmap 2.11.4", + "prettyplease", + "syn 2.0.106", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.106", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.9.4", + "indexmap 2.11.4", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser 0.244.0", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.11.4", + "log", + "semver 1.0.27", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.244.0", +] + [[package]] name = "writeable" version = "0.6.1" @@ -20857,7 +21050,7 @@ dependencies = [ [[package]] name = "xcm-procedural" version = "11.0.2" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "Inflector", "proc-macro2", @@ -20868,7 +21061,7 @@ dependencies = [ [[package]] name = "xcm-runtime-apis" version = "0.8.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "parity-scale-codec", @@ -20882,7 +21075,7 @@ dependencies = [ [[package]] name = "xcm-simulator" version = "21.0.0" -source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8#a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" +source = "git+https://github.com/opentensor/polkadot-sdk.git?rev=63332fd67a3e676b064b5ecde8ddad308714e42f#63332fd67a3e676b064b5ecde8ddad308714e42f" dependencies = [ "frame-support", "frame-system", diff --git a/Cargo.toml b/Cargo.toml index d1784b025b..466500e57d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -39,6 +39,9 @@ resolver = "2" [workspace.package] edition = "2024" +[workspace.lints.rust] +unexpected_cfgs = { level = "allow", check-cfg = ['cfg(substrate_runtime)'] } + [workspace.lints.clippy] arithmetic-side-effects = "deny" expect-used = "deny" @@ -71,6 +74,9 @@ subtensor-runtime-common = { default-features = false, path = "common" } subtensor-swap-interface = { default-features = false, path = "pallets/swap-interface" } subtensor-transaction-fee = { default-features = false, path = "pallets/transaction-fee" } subtensor-chain-extensions = { default-features = false, path = "chain-extensions" } +stp-io = { path = "primitives/io", default-features = false } +stp-shield = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +stc-shield = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } ed25519-dalek = { version = "2.1.0", default-features = false } async-trait = "0.1" @@ -86,7 +92,7 @@ libsecp256k1 = { version = "0.7.2", default-features = false } log = { version = "0.4.21", default-features = false } memmap2 = "0.9.8" ndarray = { version = "0.16.1", default-features = false } -rand = "0.8.5" +rand = { version = "0.10.0", default-features = false } scale-info = { version = "2.11.2", default-features = false } serde = { version = "1.0.214", default-features = false } serde-tuple-vec-map = { version = "1.0.1", default-features = false } @@ -119,159 +125,160 @@ ahash = { version = "0.8", default-features = false } regex = { version = "1.11.1", default-features = false } ethereum = { version = "0.18.2", default-features = false } num_enum = { version = "0.7.4", default-features = false } +tokio = { version = "1.38", default-features = false } -frame = { package = "polkadot-sdk-frame", git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -frame-benchmarking = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -frame-benchmarking-cli = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -frame-executive = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -frame-metadata-hash-extension = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -frame-support = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -frame-system = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -frame-system-benchmarking = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -frame-system-rpc-runtime-api = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -frame-try-runtime = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } +frame = { package = "polkadot-sdk-frame", git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +frame-support = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +frame-system = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +frame-executive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +frame-system-rpc-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +frame-system-benchmarking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +frame-try-runtime = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +frame-benchmarking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +frame-benchmarking-cli = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +frame-metadata-hash-extension = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } frame-metadata = { version = "23.0.0", default-features = false } pallet-subtensor-proxy = { path = "pallets/proxy", default-features = false } pallet-subtensor-utility = { path = "pallets/utility", default-features = false } -pallet-babe = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-aura = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-balances = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-grandpa = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-insecure-randomness-collective-flip = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-multisig = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-preimage = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-safe-mode = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-scheduler = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-sudo = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-timestamp = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-transaction-payment = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-transaction-payment-rpc = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-root-testing = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-contracts = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } +pallet-babe = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-aura = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-balances = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-grandpa = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-insecure-randomness-collective-flip = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-multisig = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-preimage = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-safe-mode = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-scheduler = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-sudo = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-timestamp = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-transaction-payment = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-transaction-payment-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-root-testing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-contracts = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } # NPoS -frame-election-provider-support = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-authority-discovery = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-authorship = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-bags-list = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-election-provider-multi-phase = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-fast-unstake = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-nomination-pools = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-nomination-pools-runtime-api = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-session = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-staking = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-staking-runtime-api = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-staking-reward-fn = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-staking-reward-curve = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -pallet-offences = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } +frame-election-provider-support = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-authority-discovery = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-authorship = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-bags-list = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-election-provider-multi-phase = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-fast-unstake = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-nomination-pools = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-nomination-pools-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-session = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-staking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-staking-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-staking-reward-fn = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-staking-reward-curve = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +pallet-offences = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } -sc-basic-authorship = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-cli = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-client-api = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-consensus = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-consensus-aura = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-consensus-babe = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-consensus-babe-rpc = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-consensus-grandpa-rpc = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-consensus-epochs = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-chain-spec-derive = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-chain-spec = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-consensus-slots = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-executor = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-keystore = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-network = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-offchain = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-rpc = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-rpc-api = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-service = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-telemetry = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-transaction-pool = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-transaction-pool-api = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-consensus-manual-seal = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sc-network-sync = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } +sc-basic-authorship = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-cli = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-client-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-consensus = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-consensus-aura = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-consensus-babe = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-consensus-babe-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-consensus-grandpa = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-consensus-grandpa-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-consensus-epochs = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-chain-spec-derive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-chain-spec = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-consensus-slots = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-executor = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-keystore = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-network = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-offchain = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-rpc-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-service = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-telemetry = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-transaction-pool = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-transaction-pool-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-consensus-manual-seal = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sc-network-sync = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } -sp-api = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-authority-discovery = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-arithmetic = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-block-builder = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-blockchain = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-staking = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-consensus = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-consensus-aura = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-consensus-babe = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-consensus-slots = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-npos-elections = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-consensus-grandpa = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-genesis-builder = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-core = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-inherents = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-io = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-keyring = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-offchain = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-rpc = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-runtime = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-session = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-std = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-storage = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-timestamp = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-tracing = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-transaction-pool = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-version = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-weights = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-crypto-hashing = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -sp-application-crypto = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } +sp-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-authority-discovery = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-arithmetic = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-block-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-blockchain = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-staking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-consensus = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-consensus-aura = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-consensus-babe = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-consensus-slots = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-npos-elections = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-consensus-grandpa = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-genesis-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-core = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-inherents = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-io = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-keyring = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-offchain = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-runtime = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-session = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-std = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-storage = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-timestamp = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-tracing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-transaction-pool = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-version = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-weights = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-crypto-hashing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-application-crypto = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-debug-derive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-externalities = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-runtime-interface = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } -substrate-build-script-utils = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } +substrate-build-script-utils = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } substrate-fixed = { git = "https://github.com/encointer/substrate-fixed.git", tag = "v0.6.0", default-features = false } -substrate-frame-rpc-system = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -substrate-wasm-builder = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -substrate-prometheus-endpoint = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } +substrate-frame-rpc-system = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +substrate-wasm-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +substrate-prometheus-endpoint = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } -polkadot-sdk = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } +polkadot-sdk = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } -runtime-common = { package = "polkadot-runtime-common", git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } +runtime-common = { package = "polkadot-runtime-common", git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } # Frontier -fp-evm = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fp-rpc = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fp-self-contained = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fp-account = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fc-storage = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fc-db = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fc-consensus = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fp-consensus = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fp-dynamic-fee = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fc-api = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fc-rpc = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fc-rpc-core = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fc-aura = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fc-babe = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -fc-mapping-sync = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -precompile-utils = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } +fp-evm = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fp-rpc = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fp-self-contained = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fp-account = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fc-storage = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fc-db = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fc-consensus = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fp-consensus = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fp-dynamic-fee = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fc-api = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fc-rpc = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fc-rpc-core = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fc-aura = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fc-babe = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +fc-mapping-sync = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +precompile-utils = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } # Frontier FRAME -pallet-base-fee = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -pallet-dynamic-fee = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -pallet-ethereum = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -pallet-evm = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -pallet-evm-precompile-dispatch = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -pallet-evm-chain-id = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -pallet-evm-precompile-modexp = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -pallet-evm-precompile-sha3fips = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -pallet-evm-precompile-simple = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -pallet-evm-precompile-bn128 = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } -pallet-hotfix-sufficients = { git = "https://github.com/opentensor/frontier", rev = "f12a1274f91442a564bb722a2b9547caba487fa0", default-features = false } +pallet-base-fee = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +pallet-dynamic-fee = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +pallet-ethereum = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +pallet-evm = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +pallet-evm-precompile-dispatch = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +pallet-evm-chain-id = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +pallet-evm-precompile-modexp = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +pallet-evm-precompile-sha3fips = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +pallet-evm-precompile-simple = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +pallet-evm-precompile-bn128 = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } +pallet-hotfix-sufficients = { git = "https://github.com/opentensor/frontier", rev = "b4ee632bbc81321d3891c82dd2c4c01438625d83", default-features = false } #DRAND pallet-drand = { path = "pallets/drand", default-features = false } -sp-crypto-ec-utils = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } -getrandom = { version = "0.2.15", default-features = false, features = [ - "custom", -] } -sp-keystore = { git = "https://github.com/paritytech/polkadot-sdk.git", tag = "polkadot-stable2503-6", default-features = false } +sp-crypto-ec-utils = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } +sp-keystore = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "63332fd67a3e676b064b5ecde8ddad308714e42f", default-features = false } w3f-bls = { git = "https://github.com/opentensor/bls", branch = "fix-no-std", default-features = false } ark-crypto-primitives = { version = "0.4.0", default-features = false } ark-scale = { version = "0.0.11", default-features = false } @@ -286,7 +293,9 @@ rand_chacha = { version = "0.3.1", default-features = false } tle = { git = "https://github.com/ideal-lab5/timelock", rev = "5416406cfd32799e31e1795393d4916894de4468", default-features = false } pallet-shield = { path = "pallets/shield", default-features = false } -ml-kem = { version = "0.2.0", default-features = true } +ml-kem = { version = "0.2.2", default-features = false } +chacha20poly1305 = { version = "0.10", default-features = false } +blake2 = "0.10.6" # Primitives @@ -307,202 +316,3 @@ pow-faucet = [] [patch.crates-io] w3f-bls = { git = "https://github.com/opentensor/bls", branch = "fix-no-std" } - -# Patches automatically generated with `diener`: -# `diener patch --target https://github.com/paritytech/polkadot-sdk --point-to-git https://github.com/opentensor/polkadot-sdk.git --point-to-git-commit 81fa2c54e94f824eba7dabe9dffd063481cb2d80 --crates-to-patch ../polkadot-sdk --ignore-unused` -# -# Using latest commit from `polkadot-stable2506-2-otf-patches`. -# -# View code changes here: -# -# -# NOTE: The Diener will patch unnecesarry crates while this is waiting to be merged: . -# You may install diener from `liamaharon:ignore-unused-flag` if you like in the meantime. -[patch."https://github.com/paritytech/polkadot-sdk"] -frame-support = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -binary-merkle-tree = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-core = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-crypto-hashing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-crypto-hashing-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-debug-derive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-externalities = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-storage = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-runtime-interface = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-runtime-interface-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-std = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-tracing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-wasm-interface = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-io = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-keystore = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-state-machine = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-panic-handler = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-trie = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-runtime = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-application-crypto = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-arithmetic = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-weights = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-api-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-metadata-ir = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-version = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-version-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-block-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-block-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-inherents = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-blockchain = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-consensus = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-database = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-client-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -substrate-prometheus-endpoint = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-executor = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-executor-common = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-allocator = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-maybe-compressed-blob = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-executor-polkavm = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-executor-wasmtime = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -substrate-wasm-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-tracing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-tracing-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -frame-executive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -frame-system = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -frame-try-runtime = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-balances = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -frame-benchmarking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -frame-support-procedural = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -frame-support-procedural-tools = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -frame-support-procedural-tools-derive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-client-db = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-state-db = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-sdk-frame = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -frame-system-benchmarking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -frame-system-rpc-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-consensus-aura = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-consensus-slots = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-timestamp = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-consensus-grandpa = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-genesis-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-keyring = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-offchain = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-session = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-staking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-transaction-pool = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-sdk = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -cumulus-primitives-core = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-core-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-parachain-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-authority-discovery = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -staging-xcm = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -xcm-procedural = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -cumulus-primitives-parachain-inherent = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -cumulus-primitives-proof-size-hostfunction = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-message-queue = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-runtime-parachains = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-authority-discovery = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-session = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-timestamp = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-authorship = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-babe = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-consensus-babe = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -frame-election-provider-support = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -frame-election-provider-solution-type = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-npos-elections = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-offences = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-staking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-bags-list = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-staking-reward-curve = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-broker = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-mmr = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-mmr-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-runtime-metrics = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -staging-xcm-executor = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-keystore = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -staging-xcm-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-asset-conversion = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-transaction-payment = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-grandpa = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-sudo = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-transaction-payment-rpc-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-vesting = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-runtime-common = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-asset-rate = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-election-provider-multi-phase = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-election-provider-support-benchmarking = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-fast-unstake = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-identity = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-staking-reward-fn = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-treasury = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-utility = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-root-testing = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -slot-range-helper = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -cumulus-primitives-storage-weight-reclaim = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-aura = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -cumulus-test-relay-sproof-builder = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-chain-spec = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-chain-spec-derive = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-network = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-network-common = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-network-types = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-utils = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-telemetry = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-cli = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-mixnet = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-transaction-pool-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-mixnet = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-service = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-consensus = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-informant = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-network-sync = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -fork-tree = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-network-light = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-network-transactions = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-rpc-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-statement-store = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-transaction-pool = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-rpc-server = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-rpc-spec-v2 = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-sysinfo = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-transaction-storage-proof = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -cumulus-relay-chain-interface = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-overseer = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -tracing-gum = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -tracing-gum-proc-macro = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-node-metrics = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-node-primitives = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-node-subsystem-types = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-node-network-protocol = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-authority-discovery = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -polkadot-statement-table = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -frame-benchmarking-cli = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -cumulus-client-parachain-inherent = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-runtime-utilities = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -frame-metadata-hash-extension = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-nomination-pools = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-membership = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-multisig = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-nomination-pools-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-preimage = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-proxy = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-scheduler = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-staking-runtime-api = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-offchain = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-consensus-babe = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-consensus-epochs = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-consensus-slots = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-transaction-payment-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-consensus-babe-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-network-gossip = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-consensus-grandpa = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-consensus-grandpa-rpc = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -substrate-frame-rpc-system = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-basic-authorship = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-proposer-metrics = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -substrate-build-script-utils = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-consensus-aura = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-insecure-randomness-collective-flip = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -pallet-safe-mode = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sc-consensus-manual-seal = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -sp-crypto-ec-utils = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } -substrate-bip39 = { git = "https://github.com/opentensor/polkadot-sdk.git", rev = "a584a577eeaf31e3f1a65e91b0e0b41f0356f7c8" } diff --git a/common/src/lib.rs b/common/src/lib.rs index f28ec6d878..58ab1d89a1 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -15,8 +15,10 @@ use sp_runtime::{ use subtensor_macros::freeze_struct; pub use currency::*; +pub use transaction_error::*; mod currency; +mod transaction_error; /// Balance of an account. pub type Balance = u64; diff --git a/common/src/transaction_error.rs b/common/src/transaction_error.rs new file mode 100644 index 0000000000..b43f3686f3 --- /dev/null +++ b/common/src/transaction_error.rs @@ -0,0 +1,70 @@ +use sp_runtime::transaction_validity::{InvalidTransaction, TransactionValidityError}; + +#[derive(Debug, PartialEq)] +pub enum CustomTransactionError { + ColdkeySwapAnnounced, + StakeAmountTooLow, + BalanceTooLow, + SubnetNotExists, + HotkeyAccountDoesntExist, + NotEnoughStakeToWithdraw, + RateLimitExceeded, + InsufficientLiquidity, + SlippageTooHigh, + TransferDisallowed, + HotKeyNotRegisteredInNetwork, + InvalidIpAddress, + ServingRateLimitExceeded, + InvalidPort, + BadRequest, + ZeroMaxAmount, + InvalidRevealRound, + CommitNotFound, + CommitBlockNotInRevealRange, + InputLengthsUnequal, + UidNotFound, + EvmKeyAssociateRateLimitExceeded, + ColdkeySwapDisputed, + InvalidRealAccount, + FailedShieldedTxParsing, + InvalidShieldedTxPubKeyHash, +} + +impl From for u8 { + fn from(variant: CustomTransactionError) -> u8 { + match variant { + CustomTransactionError::ColdkeySwapAnnounced => 0, + CustomTransactionError::StakeAmountTooLow => 1, + CustomTransactionError::BalanceTooLow => 2, + CustomTransactionError::SubnetNotExists => 3, + CustomTransactionError::HotkeyAccountDoesntExist => 4, + CustomTransactionError::NotEnoughStakeToWithdraw => 5, + CustomTransactionError::RateLimitExceeded => 6, + CustomTransactionError::InsufficientLiquidity => 7, + CustomTransactionError::SlippageTooHigh => 8, + CustomTransactionError::TransferDisallowed => 9, + CustomTransactionError::HotKeyNotRegisteredInNetwork => 10, + CustomTransactionError::InvalidIpAddress => 11, + CustomTransactionError::ServingRateLimitExceeded => 12, + CustomTransactionError::InvalidPort => 13, + CustomTransactionError::BadRequest => 255, + CustomTransactionError::ZeroMaxAmount => 14, + CustomTransactionError::InvalidRevealRound => 15, + CustomTransactionError::CommitNotFound => 16, + CustomTransactionError::CommitBlockNotInRevealRange => 17, + CustomTransactionError::InputLengthsUnequal => 18, + CustomTransactionError::UidNotFound => 19, + CustomTransactionError::EvmKeyAssociateRateLimitExceeded => 20, + CustomTransactionError::ColdkeySwapDisputed => 21, + CustomTransactionError::InvalidRealAccount => 22, + CustomTransactionError::FailedShieldedTxParsing => 23, + CustomTransactionError::InvalidShieldedTxPubKeyHash => 24, + } + } +} + +impl From for TransactionValidityError { + fn from(variant: CustomTransactionError) -> Self { + TransactionValidityError::Invalid(InvalidTransaction::Custom(variant.into())) + } +} diff --git a/e2e/.gitignore b/e2e/.gitignore new file mode 100644 index 0000000000..8084bdaf01 --- /dev/null +++ b/e2e/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +node-subtensor/ +.papi \ No newline at end of file diff --git a/e2e/.nvmrc b/e2e/.nvmrc new file mode 100644 index 0000000000..cabf43b5dd --- /dev/null +++ b/e2e/.nvmrc @@ -0,0 +1 @@ +24 \ No newline at end of file diff --git a/e2e/.prettierrc b/e2e/.prettierrc new file mode 100644 index 0000000000..90abee2393 --- /dev/null +++ b/e2e/.prettierrc @@ -0,0 +1,6 @@ +{ + "printWidth": 100, + "semi": true, + "singleQuote": false, + "trailingComma": "all" +} diff --git a/e2e/README.md b/e2e/README.md new file mode 100644 index 0000000000..d564ba4e3c --- /dev/null +++ b/e2e/README.md @@ -0,0 +1,82 @@ +# E2E Tests + +End-to-end tests that run against a local multi-node subtensor network. + +## Quick start + +```bash +cd e2e + +# 1. Set up the development environment (nvm, node, pnpm, jq, yq). +./setup_env.sh + +# 2. Build the node binary and generate polkadot-api type descriptors. +# Installs polkadot-api globally for the CLI and type resolution. +# Re-run this step whenever runtime metadata changes (new pallets, +# modified storage/calls, etc.) to keep descriptors in sync. +./bootstrap_types.sh + +# 3. Install dependencies (requires descriptors from step 2). +pnpm install + +# 4. Run a test suite. +pnpm --filter e2e-shield test # run the shield suite +pnpm --filter e2e- test # run any suite by name +pnpm -r test # run all suites +``` + +## Creating a new test package + +```bash +./bootstrap_package.sh +pnpm install +pnpm --filter e2e- test +``` + +This creates a package with: +- `package.json` — depends on `e2e-shared` and `polkadot-api` +- `vitest.config.ts` — sequential execution, 120s timeout, alphabetical sequencer +- `setup.ts` — global setup/teardown that spawns a 2-node network +- `tests/00-basic.test.ts` — sample test + +Edit `setup.ts` to configure the number of nodes, extra authorities, and +ports for your suite. Add test-specific dependencies to `package.json`. + +## How it works + +### Network lifecycle + +Each test suite manages its own local network via vitest's `globalSetup`: + +1. **setup()** generates a chain spec, optionally patches it with extra + authorities, spawns validator nodes, waits for peering and finalization, + then writes `NetworkState` to a JSON file under `/tmp/subtensor-e2e/`. +2. **Test files** read the state file in `beforeAll()` to get RPC ports and + connect via polkadot-api. Tests run sequentially (alphabetical by filename), + so later files can build on earlier state changes (e.g. scaling the network). +3. **teardown()** stops all nodes (including extras added mid-suite), cleans + up temp directories and the state file. + +### Shared utilities (`e2e-shared`) + +The `shared/` package provides reusable helpers for all test suites: +spawning and monitoring substrate nodes, generating and patching chain specs, +connecting polkadot-api clients with dev signers, and a custom vitest +sequencer that ensures test files run in alphabetical order. + +### Conventions + +- **File prefixes** — Name test files `00-`, `01-`, `02-` etc. The custom + sequencer sorts alphabetically, so numbering controls execution order. +- **State file** — Each suite writes to `/tmp/subtensor-e2e//`. Tests + can update this file mid-suite (e.g. to register extra nodes). +- **Catalog versions** — To add a new dependency, first pin its version in + `pnpm-workspace.yaml` under `catalog:`, then reference it in your + package's `package.json` with `"catalog:"` as the version. This prevents + version drift across packages. +- **Query at "best"** — Storage queries for values that change every block + (e.g. rotating keys) should use `{ at: "best" }` instead of the default + `"finalized"`, since finalized lags ~2 blocks behind with GRANDPA. +- **Built-in shortcuts** — Substrate dev accounts (`one`, `two`, `alice`, + `bob`, etc.) have their keys auto-injected. Custom authorities need + `insertKeys()` before starting the node. diff --git a/e2e/bootstrap_package.sh b/e2e/bootstrap_package.sh new file mode 100755 index 0000000000..e37dc7f26c --- /dev/null +++ b/e2e/bootstrap_package.sh @@ -0,0 +1,286 @@ +#!/bin/bash +# +# Scaffold a new e2e test package. +# +# Usage: +# ./bootstrap_package.sh +# +# Example: +# ./bootstrap_package.sh staking +# +set -e + +if [ -z "$1" ]; then + echo "Usage: $0 " + exit 1 +fi + +for cmd in jq yq; do + if ! command -v "$cmd" &>/dev/null; then + echo "ERROR: $cmd is required. Run ./setup_env.sh first." + exit 1 + fi +done + +NAME="$1" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +DIR="$SCRIPT_DIR/$NAME" +WORKSPACE="$SCRIPT_DIR/pnpm-workspace.yaml" + +if [ -d "$DIR" ]; then + echo "ERROR: Directory $DIR already exists" + exit 1 +fi + +echo "==> Creating package e2e-$NAME..." +mkdir -p "$DIR/tests" + +# -- package.json -- +jq -n \ + --arg name "e2e-$NAME" \ + '{ + name: $name, + version: "1.0.0", + type: "module", + scripts: { test: "vitest run" }, + dependencies: { + "e2e-shared": "workspace:*", + "@polkadot-api/descriptors": "file:../.papi/descriptors", + "polkadot-api": "catalog:" + }, + devDependencies: { + "@types/node": "catalog:", + "vitest": "catalog:" + } + }' > "$DIR/package.json" + +# -- tsconfig.json -- +jq -n '{ + compilerOptions: { + target: "ES2022", + module: "ESNext", + moduleResolution: "bundler", + esModuleInterop: true, + strict: true, + skipLibCheck: true, + types: ["node", "vitest/globals"] + } +}' > "$DIR/tsconfig.json" + +# -- vitest.config.ts -- +cat > "$DIR/vitest.config.ts" << 'EOF' +import { defineConfig } from "vitest/config"; +import AlphabeticalSequencer from "e2e-shared/sequencer.js"; + +export default defineConfig({ + test: { + globals: true, + testTimeout: 120_000, + hookTimeout: 300_000, + fileParallelism: false, + globalSetup: "./setup.ts", + include: ["tests/**/*.test.ts"], + sequence: { + sequencer: AlphabeticalSequencer, + }, + }, +}); +EOF + +# -- setup.ts -- +sed "s/__NAME__/$NAME/g" << 'SETUP_EOF' > "$DIR/setup.ts" +import { writeFile, readFile, rm, mkdir } from "node:fs/promises"; +import { + generateChainSpec, + insertKeys, + getGenesisPatch, + addAuthority, +} from "e2e-shared/chainspec.js"; +import { + startNode, + started, + peerCount, + finalizedBlocks, + stop, + log, + type Node, + type NodeOptions, +} from "e2e-shared/node.js"; + +const CHAIN_SPEC_PATH = "/tmp/subtensor-e2e/__NAME__/chain-spec.json"; +const STATE_FILE = "/tmp/subtensor-e2e/__NAME__/nodes.json"; + +export type NetworkState = { + binaryPath: string; + chainSpec: string; + nodes: { + name: string; + rpcPort: number; + port: number; + pid: number; + basePath: string; + }[]; +}; + +const nodes: Node[] = []; + +const BINARY_PATH = process.env.BINARY_PATH || "../../target/release/node-subtensor"; + +// The local chain spec has 2 built-in authorities (One, Two). +// Add extra authorities here if needed. +const EXTRA_AUTHORITY_SEEDS: string[] = []; + +type NodeConfig = Omit & { + keySeed?: string; +}; + +// TODO: Adjust node configs for your test suite. +const NODE_CONFIGS: NodeConfig[] = [ + { name: "one", port: 30333, rpcPort: 9944, basePath: "/tmp/subtensor-e2e/__NAME__/one", validator: true }, + { name: "two", port: 30334, rpcPort: 9945, basePath: "/tmp/subtensor-e2e/__NAME__/two", validator: true }, +]; + +export async function setup() { + log(`Setting up ${NODE_CONFIGS.length}-node network for __NAME__ E2E tests`); + log(`Binary path: ${BINARY_PATH}`); + + await mkdir("/tmp/subtensor-e2e/__NAME__", { recursive: true }); + + await generateChainSpec(BINARY_PATH, CHAIN_SPEC_PATH, (spec) => { + const patch = getGenesisPatch(spec); + for (const seed of EXTRA_AUTHORITY_SEEDS) { + addAuthority(patch, seed); + } + }); + + for (const config of NODE_CONFIGS) { + await rm(config.basePath, { recursive: true, force: true }); + } + + for (const config of NODE_CONFIGS) { + if (config.keySeed) { + insertKeys(BINARY_PATH, config.basePath, CHAIN_SPEC_PATH, config.keySeed); + } + } + + for (const config of NODE_CONFIGS) { + const node = startNode({ + binaryPath: BINARY_PATH, + chainSpec: CHAIN_SPEC_PATH, + ...config, + }); + nodes.push(node); + await started(node); + } + + const all = Promise.all.bind(Promise); + + await all(nodes.map((n) => peerCount(n, nodes.length - 1))); + log("All nodes peered"); + + await all(nodes.map((n) => finalizedBlocks(n, 3))); + log("All nodes finalized block 3"); + + const state: NetworkState = { + binaryPath: BINARY_PATH, + chainSpec: CHAIN_SPEC_PATH, + nodes: NODE_CONFIGS.map((c, i) => ({ + name: c.name, + rpcPort: c.rpcPort, + port: c.port, + pid: nodes[i].process.pid!, + basePath: c.basePath, + })), + }; + + await writeFile(STATE_FILE, JSON.stringify(state, null, 2)); + log("Network state written to " + STATE_FILE); +} + +export async function teardown() { + log("Tearing down __NAME__ E2E test network"); + + let state: NetworkState | undefined; + try { + const data = await readFile(STATE_FILE, "utf-8"); + state = JSON.parse(data); + } catch {} + + for (const node of nodes) { + try { + await stop(node); + } catch (e) { + log(`Warning: failed to stop ${node.name}: ${e}`); + } + } + + if (state) { + const ownPids = new Set(nodes.map((n) => n.process.pid)); + for (const nodeInfo of state.nodes) { + if (!ownPids.has(nodeInfo.pid)) { + try { + process.kill(nodeInfo.pid, "SIGTERM"); + log(`Killed extra node ${nodeInfo.name} (pid ${nodeInfo.pid})`); + } catch {} + } + } + + } + + await rm("/tmp/subtensor-e2e/__NAME__", { recursive: true, force: true }); + + log("Teardown complete"); +} +SETUP_EOF + +# -- tests/00-basic.test.ts -- +sed "s/__NAME__/$NAME/g" << 'TEST_EOF' > "$DIR/tests/00-basic.test.ts" +import { describe, it, expect, beforeAll, afterAll } from "vitest"; +import { readFile } from "node:fs/promises"; +import type { PolkadotClient, TypedApi } from "polkadot-api"; +import { subtensor } from "@polkadot-api/descriptors"; +import type { NetworkState } from "../setup.js"; +import { + connectClient, + createSigner, + waitForFinalizedBlocks, +} from "e2e-shared/client.js"; + +let client: PolkadotClient; +let api: TypedApi; +let state: NetworkState; + +const alice = createSigner("//Alice"); + +beforeAll(async () => { + const data = await readFile("/tmp/subtensor-e2e/__NAME__/nodes.json", "utf-8"); + state = JSON.parse(data); + ({ client, api } = await connectClient(state.nodes[0].rpcPort)); + await waitForFinalizedBlocks(client, 3); +}); + +afterAll(() => { + client?.destroy(); +}); + +describe("__NAME__", () => { + it("should produce finalized blocks", async () => { + const block = await api.query.System.Number.getValue(); + expect(block).toBeGreaterThan(0); + }); +}); +TEST_EOF + +# -- Add to pnpm-workspace.yaml -- +if ! yq '.packages[] | select(. == "'"$NAME"'")' "$WORKSPACE" | grep -q .; then + yq -i '.packages += ["'"$NAME"'"]' "$WORKSPACE" + echo " Added '$NAME' to pnpm-workspace.yaml" +fi + +echo "==> Created e2e/$NAME/" +echo "" +echo "Next steps:" +echo " 1. Edit $NAME/setup.ts to configure your network" +echo " 2. Add test-specific dependencies to $NAME/package.json" +echo " 3. Run: pnpm install" +echo " 4. Run: cd $NAME && pnpm test" diff --git a/e2e/bootstrap_types.sh b/e2e/bootstrap_types.sh new file mode 100755 index 0000000000..620f3c8efd --- /dev/null +++ b/e2e/bootstrap_types.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# +# Build the node binary and (re)generate polkadot-api type descriptors. +# Installs polkadot-api globally for the CLI and type resolution. +# Run this whenever the runtime changes to keep descriptors in sync. +# +# Usage: +# ./bootstrap_types.sh # build + generate types +# ./bootstrap_types.sh --skip-build # generate types only (binary must exist) +# +set -e + +BINARY="${BINARY_PATH:-../target/release/node-subtensor}" +NODE_LOG="/tmp/e2e-bootstrap-node.log" + +if [ "$1" != "--skip-build" ]; then + echo "==> Building node-subtensor..." + pnpm build-node:debug + BINARY="../target/debug/node-subtensor" +fi + +echo "==> Starting dev node (logs at $NODE_LOG)..." +"$BINARY" --one --dev &>"$NODE_LOG" & +NODE_PID=$! +trap "kill $NODE_PID 2>/dev/null; wait $NODE_PID 2>/dev/null" EXIT + +TIMEOUT=60 +ELAPSED=0 +echo "==> Waiting for node to be ready (timeout: ${TIMEOUT}s)..." +until curl -sf -o /dev/null \ + -H "Content-Type: application/json" \ + -d '{"id":1,"jsonrpc":"2.0","method":"system_health","params":[]}' \ + http://localhost:9944; do + sleep 1 + ELAPSED=$((ELAPSED + 1)) + if [ "$ELAPSED" -ge "$TIMEOUT" ]; then + echo "ERROR: Node failed to start within ${TIMEOUT}s. Check $NODE_LOG" + exit 1 + fi +done + +echo "==> Installing polkadot-api globally..." +npm install -g polkadot-api + +echo "==> Generating papi types..." +pnpm generate-types + +echo "==> Done." diff --git a/e2e/package.json b/e2e/package.json new file mode 100644 index 0000000000..db6090fae4 --- /dev/null +++ b/e2e/package.json @@ -0,0 +1,19 @@ +{ + "name": "e2e", + "private": true, + "scripts": { + "build-node:debug": "cargo build --manifest-path ../Cargo.toml -p node-subtensor", + "build-node:release": "cargo build --manifest-path ../Cargo.toml --profile release -p node-subtensor", + "build-node:fast": "pnpm build-node:release --features fast-runtime", + "generate-types": "polkadot-api add subtensor --wsUrl ws://localhost:9944 --skip-codegen && polkadot-api", + "format": "prettier --write .", + "format:check": "prettier --check ." + }, + "dependencies": { + "@polkadot-api/descriptors": "file:.papi/descriptors", + "polkadot-api": "catalog:" + }, + "devDependencies": { + "prettier": "catalog:" + } +} diff --git a/e2e/pnpm-lock.yaml b/e2e/pnpm-lock.yaml new file mode 100644 index 0000000000..b97c90b17a --- /dev/null +++ b/e2e/pnpm-lock.yaml @@ -0,0 +1,2871 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +catalogs: + default: + '@noble/ciphers': + specifier: ^2.1.1 + version: 2.1.1 + '@polkadot-labs/hdkd': + specifier: ^0.0.25 + version: 0.0.25 + '@polkadot-labs/hdkd-helpers': + specifier: ^0.0.25 + version: 0.0.25 + '@polkadot/keyring': + specifier: ^14.0.1 + version: 14.0.1 + '@polkadot/util': + specifier: ^14.0.1 + version: 14.0.1 + '@polkadot/util-crypto': + specifier: ^14.0.1 + version: 14.0.1 + '@types/node': + specifier: ^24 + version: 24.10.13 + mlkem: + specifier: ^2.5.0 + version: 2.5.0 + polkadot-api: + specifier: ^1.22.0 + version: 1.23.3 + prettier: + specifier: ^3.0.0 + version: 3.8.1 + vitest: + specifier: ^4.0.0 + version: 4.0.18 + +importers: + + .: + dependencies: + '@polkadot-api/descriptors': + specifier: file:.papi/descriptors + version: file:.papi/descriptors(polkadot-api@1.23.3(postcss@8.5.6)(rxjs@7.8.2)) + polkadot-api: + specifier: 'catalog:' + version: 1.23.3(postcss@8.5.6)(rxjs@7.8.2) + devDependencies: + prettier: + specifier: 'catalog:' + version: 3.8.1 + + shared: + dependencies: + '@polkadot-api/descriptors': + specifier: file:../.papi/descriptors + version: file:.papi/descriptors(polkadot-api@1.23.3(postcss@8.5.6)(rxjs@7.8.2)) + '@polkadot-labs/hdkd': + specifier: 'catalog:' + version: 0.0.25 + '@polkadot-labs/hdkd-helpers': + specifier: 'catalog:' + version: 0.0.25 + '@polkadot/keyring': + specifier: 'catalog:' + version: 14.0.1(@polkadot/util-crypto@14.0.1(@polkadot/util@14.0.1))(@polkadot/util@14.0.1) + polkadot-api: + specifier: 'catalog:' + version: 1.23.3(postcss@8.5.6)(rxjs@7.8.2) + devDependencies: + '@types/node': + specifier: 'catalog:' + version: 24.10.13 + vitest: + specifier: 'catalog:' + version: 4.0.18(@types/node@24.10.13) + + shield: + dependencies: + '@noble/ciphers': + specifier: 'catalog:' + version: 2.1.1 + '@polkadot-api/descriptors': + specifier: file:../.papi/descriptors + version: file:.papi/descriptors(polkadot-api@1.23.3(postcss@8.5.6)(rxjs@7.8.2)) + '@polkadot/util': + specifier: 'catalog:' + version: 14.0.1 + '@polkadot/util-crypto': + specifier: 'catalog:' + version: 14.0.1(@polkadot/util@14.0.1) + e2e-shared: + specifier: workspace:* + version: link:../shared + mlkem: + specifier: 'catalog:' + version: 2.5.0 + polkadot-api: + specifier: 'catalog:' + version: 1.23.3(postcss@8.5.6)(rxjs@7.8.2) + devDependencies: + '@types/node': + specifier: 'catalog:' + version: 24.10.13 + vitest: + specifier: 'catalog:' + version: 4.0.18(@types/node@24.10.13) + +packages: + + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@commander-js/extra-typings@14.0.0': + resolution: {integrity: sha512-hIn0ncNaJRLkZrxBIp5AsW/eXEHNKYQBh0aPdoUqNgD+Io3NIykQqpKFyKcuasZhicGaEZJX/JBSIkZ4e5x8Dg==} + peerDependencies: + commander: ~14.0.0 + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@noble/ciphers@2.1.1': + resolution: {integrity: sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==} + engines: {node: '>= 20.19.0'} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@2.0.1': + resolution: {integrity: sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==} + engines: {node: '>= 20.19.0'} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@2.0.1': + resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} + engines: {node: '>= 20.19.0'} + + '@polkadot-api/cli@0.18.1': + resolution: {integrity: sha512-jPa8WSNPZWdy372sBAUnm0nU1XX5mLbmgkOOU39+zpYPSE12mYXyM3r7JuT5IHdAccEJr6qK2DplPFTeNSyq9A==} + hasBin: true + + '@polkadot-api/codegen@0.21.2': + resolution: {integrity: sha512-e1Of2TfB13YndPQ71WrtOIPfRrSlkG6wGprP8/VHC484kkt2JPDOY+io3NdPWkafDblDQ47aG0368sxT+4RSZA==} + + '@polkadot-api/descriptors@file:.papi/descriptors': + resolution: {directory: .papi/descriptors, type: directory} + peerDependencies: + polkadot-api: '>=1.21.0' + + '@polkadot-api/ink-contracts@0.4.6': + resolution: {integrity: sha512-wpFPa8CnGnmq+cFYMzuTEDmtt3ElBM0UWgTz4RpmI9E7knZ1ctWBhO7amXxOWcILqIG6sqWIE95x0cfF1PRcQg==} + + '@polkadot-api/json-rpc-provider-proxy@0.2.8': + resolution: {integrity: sha512-AC5KK4p2IamAQuqR0S3YaiiUDRB2r1pWNrdF0Mntm5XGYEmeiAILBmnFa7gyWwemhkTWPYrK5HCurlGfw2EsDA==} + + '@polkadot-api/json-rpc-provider@0.0.4': + resolution: {integrity: sha512-9cDijLIxzHOBuq6yHqpqjJ9jBmXrctjc1OFqU+tQrS96adQze3mTIH6DTgfb/0LMrqxzxffz1HQGrIlEH00WrA==} + + '@polkadot-api/known-chains@0.9.18': + resolution: {integrity: sha512-zdU4FA01lXcpNXUiFgSmFKIwDKbTw15KT4U6Zlqo6FPUMZgncVEbbS4dSgVrf+TGw9SDOUjGlEdyTHAiOAG5Tw==} + + '@polkadot-api/legacy-provider@0.3.8': + resolution: {integrity: sha512-Q747MN/7IUxxXGLWLQfhmSLqFyOLUsUFqQQytlEBjt66ZAv9VwYiHZ8JMBCnMzFuaUpKEWDT62ESKhgXn/hmEQ==} + peerDependencies: + rxjs: '>=7.8.0' + + '@polkadot-api/logs-provider@0.0.6': + resolution: {integrity: sha512-4WgHlvy+xee1ADaaVf6+MlK/+jGMtsMgAzvbQOJZnP4PfQuagoTqaeayk8HYKxXGphogLlPbD06tANxcb+nvAg==} + + '@polkadot-api/merkleize-metadata@1.1.29': + resolution: {integrity: sha512-z8ivYDdr4xlh50MQ7hLaSVw4VM6EV7gGgd+v/ej09nue0W08NG77zf7pXWeRKgOXe3+hPOSQQRSZT2OlIYRfqA==} + + '@polkadot-api/metadata-builders@0.13.9': + resolution: {integrity: sha512-V2GljT6StuK40pfmO5l53CvgFNgy60Trrv20mOZDCsFU9J82F+a1HYAABDYlRgoZ9d0IDwc+u+vI+RHUJoR4xw==} + + '@polkadot-api/metadata-compatibility@0.4.4': + resolution: {integrity: sha512-V4ye5d2ns32YC45Fdc/IF9Y7CgM8inzJbmHQ2DCPSNd6omTRLJd81gU9zU88QAqPAcH2gKGnS5UF+wLL2VagSQ==} + + '@polkadot-api/observable-client@0.17.3': + resolution: {integrity: sha512-SJhbMKBIzxNgUUy7ZWflYf/TX9soMqiR2WYyggA7U3DLhgdx4wzFjOSbxCk8RuX9Kf/AmJE4dfleu9HBSCZv6g==} + peerDependencies: + rxjs: '>=7.8.0' + + '@polkadot-api/pjs-signer@0.6.19': + resolution: {integrity: sha512-jTHKoanZg9ewupthOczWNb2pici+GK+TBQmp9MwhwGs/3uMD2144aA8VNNBEi8rMxOBZlvKYfGkgjiTEGbBwuQ==} + + '@polkadot-api/polkadot-sdk-compat@2.4.1': + resolution: {integrity: sha512-+sET0N3GpnKkLvsazBZEC5vhqAlamlL1KkJK9STB1tRxHSZcY/yBBa1Udn9DXJfX48kE9cnzfYldl9zsjqpARg==} + + '@polkadot-api/polkadot-signer@0.1.6': + resolution: {integrity: sha512-X7ghAa4r7doETtjAPTb50IpfGtrBmy3BJM5WCfNKa1saK04VFY9w+vDn+hwEcM4p0PcDHt66Ts74hzvHq54d9A==} + + '@polkadot-api/raw-client@0.1.1': + resolution: {integrity: sha512-HxalpNEo8JCYXfxKM5p3TrK8sEasTGMkGjBNLzD4TLye9IK2smdb5oTvp2yfkU1iuVBdmjr69uif4NaukOYo2g==} + + '@polkadot-api/signer@0.2.13': + resolution: {integrity: sha512-XBOtjFsRGETVm/aXeZnsvFcJ1qvtZhRtwUMmpCOBt9s8PWfILaQH/ecOegzda3utNIZGmXXaOoJ5w9Hc/6I3ww==} + + '@polkadot-api/signers-common@0.1.20': + resolution: {integrity: sha512-v1mrTdRjQOV17riZ8172OsOQ/RJbv1QsEpjwnvxzvdCnjuNpYwtYHZaE+cSdDBb4n1p73XIBMvB/uAK/QFC2JA==} + + '@polkadot-api/sm-provider@0.1.16': + resolution: {integrity: sha512-3LEDU7nkgtDx1A6ATHLLm3+nFAY6cdkNA9tGltfDzW0efACrhhfDjNqJdI1qLNY0wDyT1aGdoWr5r+4CckRpXA==} + peerDependencies: + '@polkadot-api/smoldot': '>=0.3' + + '@polkadot-api/smoldot@0.3.15': + resolution: {integrity: sha512-YyV+ytP8FcmKEgLRV7uXepJ5Y6md/7u2F8HKxmkWytmnGXO1z+umg2pHbOxLGifD9V2NhkPY+awpzErtVIzqAA==} + + '@polkadot-api/substrate-bindings@0.17.0': + resolution: {integrity: sha512-YdbkvG/27N5A94AiKE4soVjDy0Nw74Nn+KD29mUnFmIZvL3fsN/DTYkxvMDVsOuanFXyAIXmzDMoi7iky0fyIw==} + + '@polkadot-api/substrate-client@0.5.0': + resolution: {integrity: sha512-J+gyZONCak+n6NxADZWtldH+gatYORqEScMAgI9gGu43pHUe7/xNRCqnin0dgDIzmuL3m1ERglF8LR7YhB0nHQ==} + + '@polkadot-api/utils@0.2.0': + resolution: {integrity: sha512-nY3i5fQJoAxU4n3bD7Fs208/KR2J95SGfVc58kDjbRYN5a84kWaGEqzjBNtP9oqht49POM8Bm9mbIrkvC1Bzuw==} + + '@polkadot-api/wasm-executor@0.2.3': + resolution: {integrity: sha512-B2h1o+Qlo9idpASaHvMSoViB2I5ko5OAfwfhYF8LQDkTADK0B+SeStzNj1Qn+FG34wqTuv7HzBCdjaUgzYINJQ==} + + '@polkadot-api/ws-provider@0.7.5': + resolution: {integrity: sha512-2ZLEo0PAFeuOx2DUDkbex85HZMf9lgnmZ8oGB5+NaButIydkoqXy5SHYJNPc45GcZy2tvwzImMZInNMLa5GJhg==} + + '@polkadot-labs/hdkd-helpers@0.0.25': + resolution: {integrity: sha512-GwHayBuyHKfzvGD0vG47NbjFeiK6rRQHQAn1syut9nt0mhXMg4yb3tJ//IyM317qWuDU3HbD2OIp5jKDEQz2/A==} + + '@polkadot-labs/hdkd-helpers@0.0.27': + resolution: {integrity: sha512-GTSj/Mw5kwtZbefvq2BhvBnHvs7AY4OnJgppO0kE2S/AuDbD6288C9rmO6qwMNmiNVX8OrYMWaJcs46Mt1UbBw==} + + '@polkadot-labs/hdkd@0.0.25': + resolution: {integrity: sha512-+yZJC1TE4ZKdfoILw8nGxu3H/klrYXm9GdVB0kcyQDecq320ThUmM1M4l8d1F/3QD0Nez9NwHi9t5B++OgJU5A==} + + '@polkadot/keyring@14.0.1': + resolution: {integrity: sha512-kHydQPCeTvJrMC9VQO8LPhAhTUxzxfNF1HEknhZDBPPsxP/XpkYsEy/Ln1QzJmQqD5VsgwzLDE6cExbJ2CT9CA==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': 14.0.1 + '@polkadot/util-crypto': 14.0.1 + + '@polkadot/networks@14.0.1': + resolution: {integrity: sha512-wGlBtXDkusRAj4P7uxfPz80gLO1+j99MLBaQi3bEym2xrFrFhgIWVHOZlBit/1PfaBjhX2Z8XjRxaM2w1p7w2w==} + engines: {node: '>=18'} + + '@polkadot/util-crypto@14.0.1': + resolution: {integrity: sha512-Cu7AKUzBTsUkbOtyuNzXcTpDjR9QW0fVR56o3gBmzfUCmvO1vlsuGzmmPzqpHymQQ3rrfqV78CPs62EGhw0R+A==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': 14.0.1 + + '@polkadot/util@14.0.1': + resolution: {integrity: sha512-764HhxkPV3x5rM0/p6QdynC2dw26n+SaE+jisjx556ViCd4E28Ke4xSPef6C0Spy4aoXf2gt0PuLEcBvd6fVZg==} + engines: {node: '>=18'} + + '@polkadot/wasm-bridge@7.5.4': + resolution: {integrity: sha512-6xaJVvoZbnbgpQYXNw9OHVNWjXmtcoPcWh7hlwx3NpfiLkkjljj99YS+XGZQlq7ks2fVCg7FbfknkNb8PldDaA==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': '*' + '@polkadot/x-randomvalues': '*' + + '@polkadot/wasm-crypto-asmjs@7.5.4': + resolution: {integrity: sha512-ZYwxQHAJ8pPt6kYk9XFmyuFuSS+yirJLonvP+DYbxOrARRUHfN4nzp4zcZNXUuaFhpbDobDSFn6gYzye6BUotA==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': '*' + + '@polkadot/wasm-crypto-init@7.5.4': + resolution: {integrity: sha512-U6s4Eo2rHs2n1iR01vTz/sOQ7eOnRPjaCsGWhPV+ZC/20hkVzwPAhiizu/IqMEol4tO2yiSheD4D6bn0KxUJhg==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': '*' + '@polkadot/x-randomvalues': '*' + + '@polkadot/wasm-crypto-wasm@7.5.4': + resolution: {integrity: sha512-PsHgLsVTu43eprwSvUGnxybtOEuHPES6AbApcs7y5ZbM2PiDMzYbAjNul098xJK/CPtrxZ0ePDFnaQBmIJyTFw==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': '*' + + '@polkadot/wasm-crypto@7.5.4': + resolution: {integrity: sha512-1seyClxa7Jd7kQjfnCzTTTfYhTa/KUTDUaD3DMHBk5Q4ZUN1D1unJgX+v1aUeXSPxmzocdZETPJJRZjhVOqg9g==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': '*' + '@polkadot/x-randomvalues': '*' + + '@polkadot/wasm-util@7.5.4': + resolution: {integrity: sha512-hqPpfhCpRAqCIn/CYbBluhh0TXmwkJnDRjxrU9Bnqtw9nMNa97D8JuOjdd2pi0rxm+eeLQ/f1rQMp71RMM9t4w==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': '*' + + '@polkadot/x-bigint@14.0.1': + resolution: {integrity: sha512-gfozjGnebr2rqURs31KtaWumbW4rRZpbiluhlmai6luCNrf5u8pB+oLA35kPEntrsLk9PnIG9OsC/n4hEtx4OQ==} + engines: {node: '>=18'} + + '@polkadot/x-global@14.0.1': + resolution: {integrity: sha512-aCI44DJU4fU0XXqrrSGIpi7JrZXK2kpe0jaQ2p6oDVXOOYEnZYXnMhTTmBE1lF/xtxzX50MnZrrU87jziU0qbA==} + engines: {node: '>=18'} + + '@polkadot/x-randomvalues@14.0.1': + resolution: {integrity: sha512-/XkQcvshzJLHITuPrN3zmQKuFIPdKWoaiHhhVLD6rQWV60lTXA3ajw3ocju8ZN7xRxnweMS9Ce0kMPYa0NhRMg==} + engines: {node: '>=18'} + peerDependencies: + '@polkadot/util': 14.0.1 + '@polkadot/wasm-util': '*' + + '@polkadot/x-textdecoder@14.0.1': + resolution: {integrity: sha512-CcWiPCuPVJsNk4Vq43lgFHqLRBQHb4r9RD7ZIYgmwoebES8TNm4g2ew9ToCzakFKSpzKu6I07Ne9wv/dt5zLuw==} + engines: {node: '>=18'} + + '@polkadot/x-textencoder@14.0.1': + resolution: {integrity: sha512-VY51SpQmF1ccmAGLfxhYnAe95Spfz049WZ/+kK4NfsGF9WejxVdU53Im5C80l45r8qHuYQsCWU3+t0FNunh2Kg==} + engines: {node: '>=18'} + + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + cpu: [x64] + os: [win32] + + '@rx-state/core@0.1.4': + resolution: {integrity: sha512-Z+3hjU2xh1HisLxt+W5hlYX/eGSDaXXP+ns82gq/PLZpkXLu0uwcNUh9RLY3Clq4zT+hSsA3vcpIGt6+UAb8rQ==} + peerDependencies: + rxjs: '>=7' + + '@scure/base@1.2.6': + resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + + '@scure/base@2.0.0': + resolution: {integrity: sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w==} + + '@scure/sr25519@0.2.0': + resolution: {integrity: sha512-uUuLP7Z126XdSizKtrCGqYyR3b3hYtJ6Fg/XFUXmc2//k2aXHDLqZwFeXxL97gg4XydPROPVnuaHGF2+xriSKg==} + + '@scure/sr25519@0.3.0': + resolution: {integrity: sha512-SKsinX2sImunfcsH3seGrwH/OayBwwaJqVN8J1cJBNRCfbBq5q0jyTKGa9PcW1HWv9vXT6Yuq41JsxFLvF59ew==} + engines: {node: '>= 20.19.0'} + + '@scure/sr25519@1.0.0': + resolution: {integrity: sha512-b+uhK5akMINXZP95F3gJGcb5CMKYxf+q55fwMl0GoBwZDbWolmGNi1FrBSwuaZX5AhqS2byHiAueZgtDNpot2A==} + engines: {node: '>= 20.19.0'} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@substrate/ss58-registry@1.51.0': + resolution: {integrity: sha512-TWDurLiPxndFgKjVavCniytBIw+t4ViOi7TYp9h/D0NMmkEc9klFTo+827eyEJ0lELpqO207Ey7uGxUa+BS1jQ==} + + '@types/bn.js@5.2.0': + resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/node@24.10.13': + resolution: {integrity: sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==} + + '@types/node@25.3.0': + resolution: {integrity: sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + bn.js@5.2.2: + resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} + + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.18' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@3.4.0: + resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} + engines: {node: '>=18.20'} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deepmerge-ts@7.1.5: + resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} + engines: {node: '>=16.0.0'} + + detect-indent@7.0.2: + resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} + engines: {node: '>=12.20'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + + fs.promises.exists@1.1.4: + resolution: {integrity: sha512-lJzUGWbZn8vhGWBedA+RYjB/BeJ+3458ljUfmplqhIeb6ewzTFWNPCR1HCiYCkXV9zxcHz9zXkJzMsEgDLzh3Q==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + hosted-git-info@9.0.2: + resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} + engines: {node: ^20.17.0 || >=22.9.0} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + index-to-position@1.2.0: + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + engines: {node: '>=18'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.6: + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + engines: {node: 20 || >=22} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mlkem@2.5.0: + resolution: {integrity: sha512-TnSvGBs0EVPukQcdPF0882ZoYXYuD2rb+VgO0kUDbFi/XM1rJOwnQoFW3wGGuc3nG3AT/zp3oWJ86W7ewwKYyA==} + engines: {node: '>=16.0.0'} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + + normalize-package-data@8.0.0: + resolution: {integrity: sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + ora@9.3.0: + resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==} + engines: {node: '>=20'} + + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + polkadot-api@1.23.3: + resolution: {integrity: sha512-wOWli6Cfk3bO1u/W8qmwriCIKxATkNea8Jyg1jj7GzAqafxy295BYPzYHy2mJZCQ0PAVFPR4/JvCXocTLBsp5A==} + hasBin: true + peerDependencies: + rxjs: '>=7.8.0' + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true + + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + read-pkg@10.1.0: + resolution: {integrity: sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==} + engines: {node: '>=20'} + + read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + scale-ts@1.6.1: + resolution: {integrity: sha512-PBMc2AWc6wSEqJYBDPcyCLUj9/tMKnLX70jLOSndMtcUoLQucP/DM0vnQo1wJAYjTrQiq8iG9rD0q6wFzgjH7g==} + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + smoldot@2.0.40: + resolution: {integrity: sha512-h6XC/kKDLdZBBTI0X8y4ZxmaZ2KYVVB0+5isCQm6j26ljeNjHZUDOV+hf8VyoE23+jg00wrxNJ2IVcIAURxwtg==} + + sort-keys@5.1.0: + resolution: {integrity: sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ==} + engines: {node: '>=12'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + stdin-discarder@0.3.1: + resolution: {integrity: sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==} + engines: {node: '>=18'} + + string-width@8.1.1: + resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==} + engines: {node: '>=20'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsc-prog@2.3.0: + resolution: {integrity: sha512-ycET2d75EgcX7y8EmG4KiZkLAwUzbY4xRhA6NU0uVbHkY4ZjrAAuzTMxXI85kOwATqPnBI5C/7y7rlpY0xdqHA==} + engines: {node: '>=12'} + peerDependencies: + typescript: '>=4' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsup@8.5.0: + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + type-fest@5.4.4: + resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==} + engines: {node: '>=20'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unicorn-magic@0.4.0: + resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} + engines: {node: '>=20'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + write-json-file@6.0.0: + resolution: {integrity: sha512-MNHcU3f9WxnNyR6MxsYSj64Jz0+dwIpisWKWq9gqLj/GwmA9INg3BZ3vt70/HB3GEwrnDQWr4RPrywnhNzmUFA==} + engines: {node: '>=18'} + + write-package@7.2.0: + resolution: {integrity: sha512-uMQTubF/vcu+Wd0b5BGtDmiXePd/+44hUWQz2nZPbs92/BnxRo74tqs+hqDo12RLiEd+CXFKUwxvvIZvtt34Jw==} + engines: {node: '>=18'} + + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + +snapshots: + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.28.5': {} + + '@commander-js/extra-typings@14.0.0(commander@14.0.3)': + dependencies: + commander: 14.0.3 + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/aix-ppc64@0.27.3': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.27.3': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-arm@0.27.3': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/android-x64@0.27.3': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.27.3': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.27.3': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.27.3': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.27.3': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.27.3': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-arm@0.27.3': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.27.3': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.27.3': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.27.3': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.27.3': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.27.3': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.27.3': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/linux-x64@0.27.3': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.27.3': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.27.3': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.27.3': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.27.3': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.27.3': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.27.3': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.27.3': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.27.3': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@esbuild/win32-x64@0.27.3': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@noble/ciphers@2.1.1': {} + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/curves@2.0.1': + dependencies: + '@noble/hashes': 2.0.1 + + '@noble/hashes@1.8.0': {} + + '@noble/hashes@2.0.1': {} + + '@polkadot-api/cli@0.18.1(postcss@8.5.6)': + dependencies: + '@commander-js/extra-typings': 14.0.0(commander@14.0.3) + '@polkadot-api/codegen': 0.21.2 + '@polkadot-api/ink-contracts': 0.4.6 + '@polkadot-api/json-rpc-provider': 0.0.4 + '@polkadot-api/known-chains': 0.9.18 + '@polkadot-api/legacy-provider': 0.3.8(rxjs@7.8.2) + '@polkadot-api/metadata-compatibility': 0.4.4 + '@polkadot-api/observable-client': 0.17.3(rxjs@7.8.2) + '@polkadot-api/polkadot-sdk-compat': 2.4.1 + '@polkadot-api/sm-provider': 0.1.16(@polkadot-api/smoldot@0.3.15) + '@polkadot-api/smoldot': 0.3.15 + '@polkadot-api/substrate-bindings': 0.17.0 + '@polkadot-api/substrate-client': 0.5.0 + '@polkadot-api/utils': 0.2.0 + '@polkadot-api/wasm-executor': 0.2.3 + '@polkadot-api/ws-provider': 0.7.5 + '@types/node': 25.3.0 + commander: 14.0.3 + execa: 9.6.1 + fs.promises.exists: 1.1.4 + ora: 9.3.0 + read-pkg: 10.1.0 + rxjs: 7.8.2 + tsc-prog: 2.3.0(typescript@5.9.3) + tsup: 8.5.0(postcss@8.5.6)(typescript@5.9.3) + typescript: 5.9.3 + write-package: 7.2.0 + transitivePeerDependencies: + - '@microsoft/api-extractor' + - '@swc/core' + - bufferutil + - jiti + - postcss + - supports-color + - tsx + - utf-8-validate + - yaml + + '@polkadot-api/codegen@0.21.2': + dependencies: + '@polkadot-api/ink-contracts': 0.4.6 + '@polkadot-api/metadata-builders': 0.13.9 + '@polkadot-api/metadata-compatibility': 0.4.4 + '@polkadot-api/substrate-bindings': 0.17.0 + '@polkadot-api/utils': 0.2.0 + + '@polkadot-api/descriptors@file:.papi/descriptors(polkadot-api@1.23.3(postcss@8.5.6)(rxjs@7.8.2))': + dependencies: + polkadot-api: 1.23.3(postcss@8.5.6)(rxjs@7.8.2) + + '@polkadot-api/ink-contracts@0.4.6': + dependencies: + '@polkadot-api/metadata-builders': 0.13.9 + '@polkadot-api/substrate-bindings': 0.17.0 + '@polkadot-api/utils': 0.2.0 + + '@polkadot-api/json-rpc-provider-proxy@0.2.8': {} + + '@polkadot-api/json-rpc-provider@0.0.4': {} + + '@polkadot-api/known-chains@0.9.18': {} + + '@polkadot-api/legacy-provider@0.3.8(rxjs@7.8.2)': + dependencies: + '@polkadot-api/json-rpc-provider': 0.0.4 + '@polkadot-api/raw-client': 0.1.1 + '@polkadot-api/substrate-bindings': 0.17.0 + '@polkadot-api/utils': 0.2.0 + rxjs: 7.8.2 + + '@polkadot-api/logs-provider@0.0.6': + dependencies: + '@polkadot-api/json-rpc-provider': 0.0.4 + + '@polkadot-api/merkleize-metadata@1.1.29': + dependencies: + '@polkadot-api/metadata-builders': 0.13.9 + '@polkadot-api/substrate-bindings': 0.17.0 + '@polkadot-api/utils': 0.2.0 + + '@polkadot-api/metadata-builders@0.13.9': + dependencies: + '@polkadot-api/substrate-bindings': 0.17.0 + '@polkadot-api/utils': 0.2.0 + + '@polkadot-api/metadata-compatibility@0.4.4': + dependencies: + '@polkadot-api/metadata-builders': 0.13.9 + '@polkadot-api/substrate-bindings': 0.17.0 + + '@polkadot-api/observable-client@0.17.3(rxjs@7.8.2)': + dependencies: + '@polkadot-api/metadata-builders': 0.13.9 + '@polkadot-api/substrate-bindings': 0.17.0 + '@polkadot-api/substrate-client': 0.5.0 + '@polkadot-api/utils': 0.2.0 + rxjs: 7.8.2 + + '@polkadot-api/pjs-signer@0.6.19': + dependencies: + '@polkadot-api/metadata-builders': 0.13.9 + '@polkadot-api/polkadot-signer': 0.1.6 + '@polkadot-api/signers-common': 0.1.20 + '@polkadot-api/substrate-bindings': 0.17.0 + '@polkadot-api/utils': 0.2.0 + + '@polkadot-api/polkadot-sdk-compat@2.4.1': + dependencies: + '@polkadot-api/json-rpc-provider': 0.0.4 + + '@polkadot-api/polkadot-signer@0.1.6': {} + + '@polkadot-api/raw-client@0.1.1': + dependencies: + '@polkadot-api/json-rpc-provider': 0.0.4 + + '@polkadot-api/signer@0.2.13': + dependencies: + '@noble/hashes': 2.0.1 + '@polkadot-api/merkleize-metadata': 1.1.29 + '@polkadot-api/polkadot-signer': 0.1.6 + '@polkadot-api/signers-common': 0.1.20 + '@polkadot-api/substrate-bindings': 0.17.0 + '@polkadot-api/utils': 0.2.0 + + '@polkadot-api/signers-common@0.1.20': + dependencies: + '@polkadot-api/metadata-builders': 0.13.9 + '@polkadot-api/polkadot-signer': 0.1.6 + '@polkadot-api/substrate-bindings': 0.17.0 + '@polkadot-api/utils': 0.2.0 + + '@polkadot-api/sm-provider@0.1.16(@polkadot-api/smoldot@0.3.15)': + dependencies: + '@polkadot-api/json-rpc-provider': 0.0.4 + '@polkadot-api/json-rpc-provider-proxy': 0.2.8 + '@polkadot-api/smoldot': 0.3.15 + + '@polkadot-api/smoldot@0.3.15': + dependencies: + '@types/node': 24.10.13 + smoldot: 2.0.40 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@polkadot-api/substrate-bindings@0.17.0': + dependencies: + '@noble/hashes': 2.0.1 + '@polkadot-api/utils': 0.2.0 + '@scure/base': 2.0.0 + scale-ts: 1.6.1 + + '@polkadot-api/substrate-client@0.5.0': + dependencies: + '@polkadot-api/json-rpc-provider': 0.0.4 + '@polkadot-api/raw-client': 0.1.1 + '@polkadot-api/utils': 0.2.0 + + '@polkadot-api/utils@0.2.0': {} + + '@polkadot-api/wasm-executor@0.2.3': {} + + '@polkadot-api/ws-provider@0.7.5': + dependencies: + '@polkadot-api/json-rpc-provider': 0.0.4 + '@polkadot-api/json-rpc-provider-proxy': 0.2.8 + '@types/ws': 8.18.1 + ws: 8.19.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@polkadot-labs/hdkd-helpers@0.0.25': + dependencies: + '@noble/curves': 2.0.1 + '@noble/hashes': 2.0.1 + '@scure/base': 2.0.0 + '@scure/sr25519': 0.3.0 + scale-ts: 1.6.1 + + '@polkadot-labs/hdkd-helpers@0.0.27': + dependencies: + '@noble/curves': 2.0.1 + '@noble/hashes': 2.0.1 + '@scure/base': 2.0.0 + '@scure/sr25519': 1.0.0 + scale-ts: 1.6.1 + + '@polkadot-labs/hdkd@0.0.25': + dependencies: + '@polkadot-labs/hdkd-helpers': 0.0.27 + + '@polkadot/keyring@14.0.1(@polkadot/util-crypto@14.0.1(@polkadot/util@14.0.1))(@polkadot/util@14.0.1)': + dependencies: + '@polkadot/util': 14.0.1 + '@polkadot/util-crypto': 14.0.1(@polkadot/util@14.0.1) + tslib: 2.8.1 + + '@polkadot/networks@14.0.1': + dependencies: + '@polkadot/util': 14.0.1 + '@substrate/ss58-registry': 1.51.0 + tslib: 2.8.1 + + '@polkadot/util-crypto@14.0.1(@polkadot/util@14.0.1)': + dependencies: + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@polkadot/networks': 14.0.1 + '@polkadot/util': 14.0.1 + '@polkadot/wasm-crypto': 7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1))) + '@polkadot/wasm-util': 7.5.4(@polkadot/util@14.0.1) + '@polkadot/x-bigint': 14.0.1 + '@polkadot/x-randomvalues': 14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)) + '@scure/base': 1.2.6 + '@scure/sr25519': 0.2.0 + tslib: 2.8.1 + + '@polkadot/util@14.0.1': + dependencies: + '@polkadot/x-bigint': 14.0.1 + '@polkadot/x-global': 14.0.1 + '@polkadot/x-textdecoder': 14.0.1 + '@polkadot/x-textencoder': 14.0.1 + '@types/bn.js': 5.2.0 + bn.js: 5.2.2 + tslib: 2.8.1 + + '@polkadot/wasm-bridge@7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)))': + dependencies: + '@polkadot/util': 14.0.1 + '@polkadot/wasm-util': 7.5.4(@polkadot/util@14.0.1) + '@polkadot/x-randomvalues': 14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)) + tslib: 2.8.1 + + '@polkadot/wasm-crypto-asmjs@7.5.4(@polkadot/util@14.0.1)': + dependencies: + '@polkadot/util': 14.0.1 + tslib: 2.8.1 + + '@polkadot/wasm-crypto-init@7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)))': + dependencies: + '@polkadot/util': 14.0.1 + '@polkadot/wasm-bridge': 7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1))) + '@polkadot/wasm-crypto-asmjs': 7.5.4(@polkadot/util@14.0.1) + '@polkadot/wasm-crypto-wasm': 7.5.4(@polkadot/util@14.0.1) + '@polkadot/wasm-util': 7.5.4(@polkadot/util@14.0.1) + '@polkadot/x-randomvalues': 14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)) + tslib: 2.8.1 + + '@polkadot/wasm-crypto-wasm@7.5.4(@polkadot/util@14.0.1)': + dependencies: + '@polkadot/util': 14.0.1 + '@polkadot/wasm-util': 7.5.4(@polkadot/util@14.0.1) + tslib: 2.8.1 + + '@polkadot/wasm-crypto@7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)))': + dependencies: + '@polkadot/util': 14.0.1 + '@polkadot/wasm-bridge': 7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1))) + '@polkadot/wasm-crypto-asmjs': 7.5.4(@polkadot/util@14.0.1) + '@polkadot/wasm-crypto-init': 7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1))) + '@polkadot/wasm-crypto-wasm': 7.5.4(@polkadot/util@14.0.1) + '@polkadot/wasm-util': 7.5.4(@polkadot/util@14.0.1) + '@polkadot/x-randomvalues': 14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)) + tslib: 2.8.1 + + '@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)': + dependencies: + '@polkadot/util': 14.0.1 + tslib: 2.8.1 + + '@polkadot/x-bigint@14.0.1': + dependencies: + '@polkadot/x-global': 14.0.1 + tslib: 2.8.1 + + '@polkadot/x-global@14.0.1': + dependencies: + tslib: 2.8.1 + + '@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1))': + dependencies: + '@polkadot/util': 14.0.1 + '@polkadot/wasm-util': 7.5.4(@polkadot/util@14.0.1) + '@polkadot/x-global': 14.0.1 + tslib: 2.8.1 + + '@polkadot/x-textdecoder@14.0.1': + dependencies: + '@polkadot/x-global': 14.0.1 + tslib: 2.8.1 + + '@polkadot/x-textencoder@14.0.1': + dependencies: + '@polkadot/x-global': 14.0.1 + tslib: 2.8.1 + + '@rollup/rollup-android-arm-eabi@4.57.1': + optional: true + + '@rollup/rollup-android-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-x64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.57.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.57.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.57.1': + optional: true + + '@rollup/rollup-openbsd-x64@4.57.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.57.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.57.1': + optional: true + + '@rx-state/core@0.1.4(rxjs@7.8.2)': + dependencies: + rxjs: 7.8.2 + + '@scure/base@1.2.6': {} + + '@scure/base@2.0.0': {} + + '@scure/sr25519@0.2.0': + dependencies: + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + + '@scure/sr25519@0.3.0': + dependencies: + '@noble/curves': 2.0.1 + '@noble/hashes': 2.0.1 + + '@scure/sr25519@1.0.0': + dependencies: + '@noble/curves': 2.0.1 + '@noble/hashes': 2.0.1 + + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@standard-schema/spec@1.1.0': {} + + '@substrate/ss58-registry@1.51.0': {} + + '@types/bn.js@5.2.0': + dependencies: + '@types/node': 25.3.0 + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} + + '@types/node@24.10.13': + dependencies: + undici-types: 7.16.0 + + '@types/node@25.3.0': + dependencies: + undici-types: 7.18.2 + + '@types/normalize-package-data@2.4.4': {} + + '@types/ws@8.18.1': + dependencies: + '@types/node': 25.3.0 + + '@vitest/expect@4.0.18': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + chai: 6.2.2 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@24.10.13))': + dependencies: + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@24.10.13) + + '@vitest/pretty-format@4.0.18': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.18': + dependencies: + '@vitest/utils': 4.0.18 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.18': {} + + '@vitest/utils@4.0.18': + dependencies: + '@vitest/pretty-format': 4.0.18 + tinyrainbow: 3.0.3 + + acorn@8.16.0: {} + + ansi-regex@6.2.2: {} + + any-promise@1.3.0: {} + + assertion-error@2.0.1: {} + + bn.js@5.2.2: {} + + bundle-require@5.1.0(esbuild@0.25.12): + dependencies: + esbuild: 0.25.12 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + + chai@6.2.2: {} + + chalk@5.6.2: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@3.4.0: {} + + commander@14.0.3: {} + + commander@4.1.1: {} + + confbox@0.1.8: {} + + consola@3.4.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deepmerge-ts@7.1.5: {} + + detect-indent@7.0.2: {} + + es-module-lexer@1.7.0: {} + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esbuild@0.27.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + + expect-type@1.3.0: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.21 + mlly: 1.8.0 + rollup: 4.57.1 + + fs.promises.exists@1.1.4: {} + + fsevents@2.3.3: + optional: true + + get-east-asian-width@1.4.0: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + + hosted-git-info@9.0.2: + dependencies: + lru-cache: 11.2.6 + + human-signals@8.0.1: {} + + imurmurhash@0.1.4: {} + + index-to-position@1.2.0: {} + + is-interactive@2.0.0: {} + + is-plain-obj@4.1.0: {} + + is-stream@4.0.1: {} + + is-unicode-supported@2.1.0: {} + + isexe@2.0.0: {} + + joycon@3.1.1: {} + + js-tokens@4.0.0: {} + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + + lodash.sortby@4.7.0: {} + + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + + lru-cache@10.4.3: {} + + lru-cache@11.2.6: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + mimic-function@5.0.1: {} + + mlkem@2.5.0: {} + + mlly@1.8.0: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.11: {} + + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.7.4 + validate-npm-package-license: 3.0.4 + + normalize-package-data@8.0.0: + dependencies: + hosted-git-info: 9.0.2 + semver: 7.7.4 + validate-npm-package-license: 3.0.4 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + object-assign@4.1.1: {} + + obug@2.1.1: {} + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + ora@9.3.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.4.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.3.1 + string-width: 8.1.1 + + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.29.0 + index-to-position: 1.2.0 + type-fest: 4.41.0 + + parse-ms@4.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pirates@4.0.7: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + polkadot-api@1.23.3(postcss@8.5.6)(rxjs@7.8.2): + dependencies: + '@polkadot-api/cli': 0.18.1(postcss@8.5.6) + '@polkadot-api/ink-contracts': 0.4.6 + '@polkadot-api/json-rpc-provider': 0.0.4 + '@polkadot-api/known-chains': 0.9.18 + '@polkadot-api/logs-provider': 0.0.6 + '@polkadot-api/metadata-builders': 0.13.9 + '@polkadot-api/metadata-compatibility': 0.4.4 + '@polkadot-api/observable-client': 0.17.3(rxjs@7.8.2) + '@polkadot-api/pjs-signer': 0.6.19 + '@polkadot-api/polkadot-sdk-compat': 2.4.1 + '@polkadot-api/polkadot-signer': 0.1.6 + '@polkadot-api/signer': 0.2.13 + '@polkadot-api/sm-provider': 0.1.16(@polkadot-api/smoldot@0.3.15) + '@polkadot-api/smoldot': 0.3.15 + '@polkadot-api/substrate-bindings': 0.17.0 + '@polkadot-api/substrate-client': 0.5.0 + '@polkadot-api/utils': 0.2.0 + '@polkadot-api/ws-provider': 0.7.5 + '@rx-state/core': 0.1.4(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@microsoft/api-extractor' + - '@swc/core' + - bufferutil + - jiti + - postcss + - supports-color + - tsx + - utf-8-validate + - yaml + + postcss-load-config@6.0.1(postcss@8.5.6): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.6 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@3.8.1: {} + + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + + punycode@2.3.1: {} + + read-pkg@10.1.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 8.0.0 + parse-json: 8.3.0 + type-fest: 5.4.4 + unicorn-magic: 0.4.0 + + read-pkg@9.0.1: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 8.3.0 + type-fest: 4.41.0 + unicorn-magic: 0.1.0 + + readdirp@4.1.2: {} + + resolve-from@5.0.0: {} + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + rollup@4.57.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 + fsevents: 2.3.3 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + scale-ts@1.6.1: {} + + semver@7.7.4: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + smoldot@2.0.40: + dependencies: + ws: 8.19.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + sort-keys@5.1.0: + dependencies: + is-plain-obj: 4.1.0 + + source-map-js@1.2.1: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.23 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 + + spdx-license-ids@3.0.23: {} + + stackback@0.0.2: {} + + std-env@3.10.0: {} + + stdin-discarder@0.3.1: {} + + string-width@8.1.1: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-final-newline@4.0.0: {} + + sucrase@3.35.1: + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + commander: 4.1.1 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.7 + tinyglobby: 0.2.15 + ts-interface-checker: 0.1.13 + + tagged-tag@1.0.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyrainbow@3.0.3: {} + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + ts-interface-checker@0.1.13: {} + + tsc-prog@2.3.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + tslib@2.8.1: {} + + tsup@8.5.0(postcss@8.5.6)(typescript@5.9.3): + dependencies: + bundle-require: 5.1.0(esbuild@0.25.12) + cac: 6.7.14 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.25.12 + fix-dts-default-cjs-exports: 1.0.1 + joycon: 3.1.1 + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.5.6) + resolve-from: 5.0.0 + rollup: 4.57.1 + source-map: 0.8.0-beta.0 + sucrase: 3.35.1 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.5.6 + typescript: 5.9.3 + transitivePeerDependencies: + - jiti + - supports-color + - tsx + - yaml + + type-fest@4.41.0: {} + + type-fest@5.4.4: + dependencies: + tagged-tag: 1.0.0 + + typescript@5.9.3: {} + + ufo@1.6.3: {} + + undici-types@7.16.0: {} + + undici-types@7.18.2: {} + + unicorn-magic@0.1.0: {} + + unicorn-magic@0.3.0: {} + + unicorn-magic@0.4.0: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + vite@7.3.1(@types/node@24.10.13): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.10.13 + fsevents: 2.3.3 + + vitest@4.0.18(@types/node@24.10.13): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@24.10.13)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.3.1(@types/node@24.10.13) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.10.13 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + webidl-conversions@4.0.2: {} + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + write-json-file@6.0.0: + dependencies: + detect-indent: 7.0.2 + is-plain-obj: 4.1.0 + sort-keys: 5.1.0 + write-file-atomic: 5.0.1 + + write-package@7.2.0: + dependencies: + deepmerge-ts: 7.1.5 + read-pkg: 9.0.1 + sort-keys: 5.1.0 + type-fest: 4.41.0 + write-json-file: 6.0.0 + + ws@8.19.0: {} + + yoctocolors@2.1.2: {} diff --git a/e2e/pnpm-workspace.yaml b/e2e/pnpm-workspace.yaml new file mode 100644 index 0000000000..d1504a1228 --- /dev/null +++ b/e2e/pnpm-workspace.yaml @@ -0,0 +1,16 @@ +packages: + - shared + - shield + +catalog: + "@noble/ciphers": "^2.1.1" + "@polkadot/keyring": "^14.0.1" + "@polkadot/util": "^14.0.1" + "@polkadot/util-crypto": "^14.0.1" + "@polkadot-labs/hdkd": "^0.0.25" + "@polkadot-labs/hdkd-helpers": "^0.0.25" + "@types/node": "^24" + "mlkem": "^2.5.0" + "polkadot-api": "^1.22.0" + "prettier": "^3.0.0" + "vitest": "^4.0.0" diff --git a/e2e/setup_env.sh b/e2e/setup_env.sh new file mode 100755 index 0000000000..96b531e22b --- /dev/null +++ b/e2e/setup_env.sh @@ -0,0 +1,66 @@ +#!/bin/bash +# +# Verify and set up the development environment for e2e tests. +# Checks for nvm, the correct Node.js version (.nvmrc), pnpm, jq, and yq. +# Installs what it can, exits with an error for what it cannot. +# +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +NVMRC="$SCRIPT_DIR/.nvmrc" + +check() { + local name="$1" + if command -v "$name" &>/dev/null; then + echo " $name: $(command -v "$name")" + return 0 + fi + return 1 +} + +echo "==> Checking prerequisites..." + +# -- nvm -- +NVM_DIR="${NVM_DIR:-$HOME/.nvm}" +if [ -s "$NVM_DIR/nvm.sh" ]; then + echo " nvm: $NVM_DIR" + # shellcheck source=/dev/null + source "$NVM_DIR/nvm.sh" +else + echo "ERROR: nvm not found. Install it from https://github.com/nvm-sh/nvm" + exit 1 +fi + +# -- Node.js (version from .nvmrc) -- +REQUIRED_NODE="$(cat "$NVMRC")" +if ! nvm ls "$REQUIRED_NODE" &>/dev/null; then + echo " Node $REQUIRED_NODE not installed, installing..." + nvm install "$REQUIRED_NODE" +fi +nvm use "$REQUIRED_NODE" +echo " node: $(node --version)" + +# -- pnpm -- +if ! check pnpm; then + echo " pnpm not found, installing..." + npm install -g pnpm + check pnpm || { echo "ERROR: Failed to install pnpm"; exit 1; } +fi + +# -- jq -- +if ! check jq; then + echo "ERROR: jq not found. Install it:" + echo " macOS: brew install jq" + echo " Ubuntu: sudo apt install jq" + exit 1 +fi + +# -- yq -- +if ! check yq; then + echo "ERROR: yq not found. Install it:" + echo " macOS: brew install yq" + echo " Ubuntu: sudo snap install yq" + exit 1 +fi + +echo "==> All prerequisites satisfied." diff --git a/e2e/shared/chainspec.ts b/e2e/shared/chainspec.ts new file mode 100644 index 0000000000..514b6c0028 --- /dev/null +++ b/e2e/shared/chainspec.ts @@ -0,0 +1,191 @@ +import { spawn, execFileSync } from "node:child_process"; +import { writeFile, readFile } from "node:fs/promises"; +import { Keyring } from "@polkadot/keyring"; +import { log } from "./node.js"; + +// --------------------------------------------------------------------------- +// Chain spec generation +// --------------------------------------------------------------------------- + +/** + * Generate a raw chain spec. If `patchSpec` is provided, first generates a + * non-raw spec, applies the patch, then converts to raw. This allows adding + * extra authorities, balances, etc. without modifying the Rust chain spec. + */ +export const generateChainSpec = async ( + binaryPath: string, + outputPath: string, + patchSpec?: (spec: any) => void, +) => { + if (!patchSpec) { + return generateRawChainSpec(binaryPath, outputPath, "local"); + } + + // 2-step: generate non-raw → patch → generate raw. + const nonRawPath = outputPath + ".nonraw.json"; + + await new Promise((resolve, reject) => { + const proc = spawn(binaryPath, [ + "build-spec", + "--disable-default-bootnode", + "--chain", + "local", + ]); + const chunks: Buffer[] = []; + proc.stdout.on("data", (chunk: Buffer) => chunks.push(chunk)); + let stderr = ""; + proc.stderr?.on("data", (chunk: Buffer) => { + stderr += chunk.toString(); + }); + proc.on("close", async (code) => { + if (code !== 0) { + reject(new Error(`Failed to generate non-raw chain spec (exit ${code}): ${stderr}`)); + return; + } + await writeFile(nonRawPath, Buffer.concat(chunks)); + resolve(); + }); + proc.on("error", reject); + }); + + const specJson = JSON.parse(await readFile(nonRawPath, "utf-8")); + patchSpec(specJson); + await writeFile(nonRawPath, JSON.stringify(specJson, null, 2)); + + await generateRawChainSpec(binaryPath, outputPath, nonRawPath); +}; + +async function generateRawChainSpec(binaryPath: string, outputPath: string, chain: string) { + return new Promise((resolve, reject) => { + const proc = spawn(binaryPath, [ + "build-spec", + "--disable-default-bootnode", + "--raw", + "--chain", + chain, + ]); + + const chunks: Buffer[] = []; + proc.stdout.on("data", (chunk: Buffer) => chunks.push(chunk)); + + let stderr = ""; + proc.stderr?.on("data", (chunk: Buffer) => { + stderr += chunk.toString(); + }); + + proc.on("close", async (code) => { + if (code !== 0) { + reject(new Error(`Failed to generate chain spec (exit ${code}): ${stderr}`)); + return; + } + const data = Buffer.concat(chunks); + await writeFile(outputPath, data); + log(`Chain spec written to ${outputPath} (${data.length} bytes)`); + resolve(); + }); + + proc.on("error", reject); + }); +} + +// --------------------------------------------------------------------------- +// Chain spec patching helpers (composable) +// --------------------------------------------------------------------------- + +/** + * Extract the genesis runtime patch object from a non-raw chain spec. + * Works with both the `runtimeGenesis.patch` and legacy `runtime` formats. + */ +export function getGenesisPatch(spec: any): any { + const patch = spec.genesis?.runtimeGenesis?.patch ?? spec.genesis?.runtime; + if (!patch) throw new Error("Cannot find genesis patch in chain spec"); + return patch; +} + +/** Add an Aura authority (sr25519 address) to the chain spec. */ +export function addAuraAuthority(patch: any, address: string) { + if (patch.aura?.authorities) { + patch.aura.authorities.push(address); + } +} + +/** Add a GRANDPA authority (ed25519 address, weight) to the chain spec. */ +export function addGrandpaAuthority(patch: any, address: string, weight = 1) { + if (patch.grandpa?.authorities) { + patch.grandpa.authorities.push([address, weight]); + } +} + +/** Add a balance entry to the chain spec. */ +export function addBalance(patch: any, address: string, amount: number | bigint) { + if (patch.balances?.balances) { + patch.balances.balances.push([address, Number(amount)]); + } +} + +// --------------------------------------------------------------------------- +// Authority key helpers +// --------------------------------------------------------------------------- + +export type AuthorityKeys = { + aura: string; + grandpa: string; + account: string; +}; + +/** Derive authority keys (aura sr25519, grandpa ed25519, account) from a seed. */ +export function generateAuthorityKeys(seed: string): AuthorityKeys { + const sr = new Keyring({ type: "sr25519" }); + const ed = new Keyring({ type: "ed25519" }); + return { + aura: sr.addFromUri(`//${seed}`).address, + grandpa: ed.addFromUri(`//${seed}`).address, + account: sr.addFromUri(`//${seed}`).address, + }; +} + +/** + * Convenience: add a full authority (aura + grandpa + funded account) to a + * chain spec genesis patch. Derives keys from the given seed. + */ +export function addAuthority(patch: any, seed: string, balance = 2_000_000_000_000) { + const keys = generateAuthorityKeys(seed); + addAuraAuthority(patch, keys.aura); + addGrandpaAuthority(patch, keys.grandpa); + addBalance(patch, keys.account, balance); +} + +// --------------------------------------------------------------------------- +// Key insertion +// --------------------------------------------------------------------------- + +/** + * Insert Aura (sr25519) and GRANDPA (ed25519) keys into a node's keystore. + * Required for authority nodes that don't have a built-in substrate CLI shortcut. + */ +export const insertKeys = ( + binaryPath: string, + basePath: string, + chainSpec: string, + seed: string, +) => { + const run = (scheme: string, keyType: string) => { + execFileSync(binaryPath, [ + "key", + "insert", + "--base-path", + basePath, + "--chain", + chainSpec, + "--suri", + seed, + "--scheme", + scheme, + "--key-type", + keyType, + ]); + }; + run("sr25519", "aura"); + run("ed25519", "gran"); + log(`Inserted aura+grandpa keys for ${seed} into ${basePath}`); +}; diff --git a/e2e/shared/client.ts b/e2e/shared/client.ts new file mode 100644 index 0000000000..1dd76dd48e --- /dev/null +++ b/e2e/shared/client.ts @@ -0,0 +1,82 @@ +import { createClient, type PolkadotClient, type TypedApi } from "polkadot-api"; +import { getWsProvider } from "polkadot-api/ws-provider"; +import { getPolkadotSigner, type PolkadotSigner } from "polkadot-api/signer"; +import { sr25519CreateDerive } from "@polkadot-labs/hdkd"; +import { + DEV_PHRASE, + entropyToMiniSecret, + mnemonicToEntropy, + ss58Address, +} from "@polkadot-labs/hdkd-helpers"; +import { subtensor } from "@polkadot-api/descriptors"; + +const SECOND = 1000; + +export type ClientConnection = { + client: PolkadotClient; + api: TypedApi; +}; + +export const connectClient = async (rpcPort: number): Promise => { + const provider = getWsProvider(`ws://localhost:${rpcPort}`); + const client = createClient(provider); + const api = client.getTypedApi(subtensor); + return { client, api }; +}; + +export type Signer = { + signer: PolkadotSigner; + address: string; +}; + +export const createSigner = (uri: string): Signer => { + const entropy = mnemonicToEntropy(DEV_PHRASE); + const miniSecret = entropyToMiniSecret(entropy); + const derive = sr25519CreateDerive(miniSecret); + const keypair = derive(uri); + return { + signer: getPolkadotSigner(keypair.publicKey, "Sr25519", keypair.sign), + address: ss58Address(keypair.publicKey), + }; +}; + +export const getAccountNonce = async ( + api: TypedApi, + address: string, +): Promise => { + const account = await api.query.System.Account.getValue(address, { at: "best" }); + return account.nonce; +}; + +export const getBalance = async ( + api: TypedApi, + address: string, +): Promise => { + const account = await api.query.System.Account.getValue(address); + return account.data.free; +}; + +export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +/** Polls the chain until `count` new finalized blocks have been produced. */ +export async function waitForFinalizedBlocks( + client: PolkadotClient, + count: number, + pollInterval = 1 * SECOND, + timeout = 120 * SECOND, +): Promise { + const startBlock = await client.getFinalizedBlock(); + const start = startBlock.number; + const target = start + count; + const deadline = Date.now() + timeout; + + while (Date.now() < deadline) { + await sleep(pollInterval); + const block = await client.getFinalizedBlock(); + if (block.number >= target) return; + } + + throw new Error( + `Timed out waiting for ${count} finalized blocks (from #${start}, target #${target})`, + ); +} diff --git a/e2e/shared/node.ts b/e2e/shared/node.ts new file mode 100644 index 0000000000..51b80a0c18 --- /dev/null +++ b/e2e/shared/node.ts @@ -0,0 +1,149 @@ +import { spawn, ChildProcess } from "node:child_process"; + +const SECOND = 1000; +const MINUTE = 60 * SECOND; + +// Substrate CLI shortcuts that inject keystore keys automatically. +const SUBSTRATE_SHORTCUTS = new Set([ + "alice", + "bob", + "charlie", + "dave", + "eve", + "ferdie", + "one", + "two", +]); + +export type NodeOptions = { + binaryPath: string; + basePath: string; + name: string; + port: number; + rpcPort: number; + validator: boolean; + chainSpec: string; +}; + +export type Node = { + name: string; + binaryPath: string; + rpcPort: number; + port: number; + process: ChildProcess; +}; + +export const log = (message: string) => console.log(`[${new Date().toISOString()}] ${message}`); + +export const startNode = (opts: NodeOptions): Node => { + const nameArgs = SUBSTRATE_SHORTCUTS.has(opts.name) ? [`--${opts.name}`] : ["--name", opts.name]; + + const child = spawn(opts.binaryPath, [ + ...nameArgs, + ...["--chain", opts.chainSpec], + ...["--base-path", opts.basePath], + ...["--port", opts.port.toString()], + ...["--rpc-port", opts.rpcPort.toString()], + ...(opts.validator ? ["--validator"] : []), + "--rpc-cors=all", + "--allow-private-ipv4", + "--discover-local", + "--unsafe-force-node-key-generation", + ]); + + let lastStderr = ""; + child.stderr?.on("data", (chunk: Buffer) => { + lastStderr = chunk.toString(); + }); + child.on("error", (error) => console.error(`${opts.name} (error): ${error}`)); + child.on("close", (code) => { + if (code !== 0 && code !== null) { + log(`${opts.name}: process crashed with code ${code}. Last stderr: ${lastStderr}`); + } else { + log(`${opts.name}: process closed with code ${code}`); + } + }); + + return { + name: opts.name, + binaryPath: opts.binaryPath, + rpcPort: opts.rpcPort, + port: opts.port, + process: child, + }; +}; + +export const stop = (node: Node): Promise => { + return new Promise((resolve, reject) => { + node.process.on("close", () => resolve()); + node.process.on("error", reject); + + if (!node.process.kill()) { + reject(new Error(`Failed to stop ${node.name}`)); + } + }); +}; + +export const started = (node: Node, timeout = 60 * SECOND) => { + const errorMessage = `${node.name} failed to start in time`; + + return innerEnsure(node, errorMessage, timeout, (data, ok) => { + if (data.includes("💤 Idle")) { + log(`${node.name}: started using ${node.binaryPath}`); + ok(); + } + }); +}; + +export const peerCount = (node: Node, expectedPeers: number, timeout = 60 * SECOND) => { + const errorMessage = `${node.name} failed to reach ${expectedPeers} peers in time`; + + return innerEnsure(node, errorMessage, timeout, (data, ok) => { + const maybePeers = /Idle \((?\d+) peers\)/.exec(data)?.groups?.peers; + if (!maybePeers) return; + + const peers = parseInt(maybePeers); + if (peers >= expectedPeers) { + log(`${node.name}: reached ${expectedPeers} peers`); + ok(); + } + }); +}; + +export const finalizedBlocks = (node: Node, expectedFinalized: number, timeout = 10 * MINUTE) => { + const errorMessage = `${node.name} failed to reach ${expectedFinalized} finalized blocks in time`; + + return innerEnsure(node, errorMessage, timeout, (data, ok) => { + const maybeFinalized = /finalized #(?\d+)/.exec(data)?.groups?.blocks; + if (!maybeFinalized) return; + + const finalized = parseInt(maybeFinalized); + if (finalized >= expectedFinalized) { + log(`${node.name}: reached ${expectedFinalized} finalized blocks`); + ok(); + } + }); +}; + +export function innerEnsure( + node: Node, + errorMessage: string, + timeout: number, + f: (data: string, ok: () => void) => void, +) { + return new Promise((resolve, reject) => { + const id = setTimeout(() => reject(new Error(errorMessage)), timeout); + + const fn = (chunk: Buffer) => { + const data = chunk.toString(); + f(data, () => { + clearTimeout(id); + node.process.stderr?.off("data", fn); + resolve(); + }); + }; + + node.process.stderr?.on("data", fn); + }); +} + diff --git a/e2e/shared/package.json b/e2e/shared/package.json new file mode 100644 index 0000000000..85889063ec --- /dev/null +++ b/e2e/shared/package.json @@ -0,0 +1,22 @@ +{ + "name": "e2e-shared", + "version": "1.0.0", + "type": "module", + "exports": { + "./node.js": "./node.ts", + "./chainspec.js": "./chainspec.ts", + "./sequencer.js": "./sequencer.ts", + "./client.js": "./client.ts" + }, + "dependencies": { + "@polkadot/keyring": "catalog:", + "@polkadot-api/descriptors": "file:../.papi/descriptors", + "@polkadot-labs/hdkd": "catalog:", + "@polkadot-labs/hdkd-helpers": "catalog:", + "polkadot-api": "catalog:" + }, + "devDependencies": { + "@types/node": "catalog:", + "vitest": "catalog:" + } +} diff --git a/e2e/shared/pnpm-lock.yaml b/e2e/shared/pnpm-lock.yaml new file mode 100644 index 0000000000..767156e260 --- /dev/null +++ b/e2e/shared/pnpm-lock.yaml @@ -0,0 +1,1628 @@ +lockfileVersion: "9.0" + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + .: + dependencies: + "@polkadot/keyring": + specifier: ^14.0.1 + version: 14.0.1(@polkadot/util-crypto@14.0.1(@polkadot/util@14.0.1))(@polkadot/util@14.0.1) + devDependencies: + "@types/node": + specifier: ^24 + version: 24.10.13 + vitest: + specifier: ^3.0.0 + version: 3.2.4(@types/node@24.10.13) + +packages: + "@esbuild/aix-ppc64@0.27.3": + resolution: + { + integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==, + } + engines: { node: ">=18" } + cpu: [ppc64] + os: [aix] + + "@esbuild/android-arm64@0.27.3": + resolution: + { + integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [android] + + "@esbuild/android-arm@0.27.3": + resolution: + { + integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==, + } + engines: { node: ">=18" } + cpu: [arm] + os: [android] + + "@esbuild/android-x64@0.27.3": + resolution: + { + integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [android] + + "@esbuild/darwin-arm64@0.27.3": + resolution: + { + integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [darwin] + + "@esbuild/darwin-x64@0.27.3": + resolution: + { + integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [darwin] + + "@esbuild/freebsd-arm64@0.27.3": + resolution: + { + integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [freebsd] + + "@esbuild/freebsd-x64@0.27.3": + resolution: + { + integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [freebsd] + + "@esbuild/linux-arm64@0.27.3": + resolution: + { + integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [linux] + + "@esbuild/linux-arm@0.27.3": + resolution: + { + integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==, + } + engines: { node: ">=18" } + cpu: [arm] + os: [linux] + + "@esbuild/linux-ia32@0.27.3": + resolution: + { + integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==, + } + engines: { node: ">=18" } + cpu: [ia32] + os: [linux] + + "@esbuild/linux-loong64@0.27.3": + resolution: + { + integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==, + } + engines: { node: ">=18" } + cpu: [loong64] + os: [linux] + + "@esbuild/linux-mips64el@0.27.3": + resolution: + { + integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==, + } + engines: { node: ">=18" } + cpu: [mips64el] + os: [linux] + + "@esbuild/linux-ppc64@0.27.3": + resolution: + { + integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==, + } + engines: { node: ">=18" } + cpu: [ppc64] + os: [linux] + + "@esbuild/linux-riscv64@0.27.3": + resolution: + { + integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==, + } + engines: { node: ">=18" } + cpu: [riscv64] + os: [linux] + + "@esbuild/linux-s390x@0.27.3": + resolution: + { + integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==, + } + engines: { node: ">=18" } + cpu: [s390x] + os: [linux] + + "@esbuild/linux-x64@0.27.3": + resolution: + { + integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [linux] + + "@esbuild/netbsd-arm64@0.27.3": + resolution: + { + integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [netbsd] + + "@esbuild/netbsd-x64@0.27.3": + resolution: + { + integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [netbsd] + + "@esbuild/openbsd-arm64@0.27.3": + resolution: + { + integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [openbsd] + + "@esbuild/openbsd-x64@0.27.3": + resolution: + { + integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [openbsd] + + "@esbuild/openharmony-arm64@0.27.3": + resolution: + { + integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [openharmony] + + "@esbuild/sunos-x64@0.27.3": + resolution: + { + integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [sunos] + + "@esbuild/win32-arm64@0.27.3": + resolution: + { + integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [win32] + + "@esbuild/win32-ia32@0.27.3": + resolution: + { + integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==, + } + engines: { node: ">=18" } + cpu: [ia32] + os: [win32] + + "@esbuild/win32-x64@0.27.3": + resolution: + { + integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [win32] + + "@jridgewell/sourcemap-codec@1.5.5": + resolution: + { + integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==, + } + + "@noble/curves@1.9.7": + resolution: + { + integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==, + } + engines: { node: ^14.21.3 || >=16 } + + "@noble/hashes@1.8.0": + resolution: + { + integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==, + } + engines: { node: ^14.21.3 || >=16 } + + "@polkadot/keyring@14.0.1": + resolution: + { + integrity: sha512-kHydQPCeTvJrMC9VQO8LPhAhTUxzxfNF1HEknhZDBPPsxP/XpkYsEy/Ln1QzJmQqD5VsgwzLDE6cExbJ2CT9CA==, + } + engines: { node: ">=18" } + peerDependencies: + "@polkadot/util": 14.0.1 + "@polkadot/util-crypto": 14.0.1 + + "@polkadot/networks@14.0.1": + resolution: + { + integrity: sha512-wGlBtXDkusRAj4P7uxfPz80gLO1+j99MLBaQi3bEym2xrFrFhgIWVHOZlBit/1PfaBjhX2Z8XjRxaM2w1p7w2w==, + } + engines: { node: ">=18" } + + "@polkadot/util-crypto@14.0.1": + resolution: + { + integrity: sha512-Cu7AKUzBTsUkbOtyuNzXcTpDjR9QW0fVR56o3gBmzfUCmvO1vlsuGzmmPzqpHymQQ3rrfqV78CPs62EGhw0R+A==, + } + engines: { node: ">=18" } + peerDependencies: + "@polkadot/util": 14.0.1 + + "@polkadot/util@14.0.1": + resolution: + { + integrity: sha512-764HhxkPV3x5rM0/p6QdynC2dw26n+SaE+jisjx556ViCd4E28Ke4xSPef6C0Spy4aoXf2gt0PuLEcBvd6fVZg==, + } + engines: { node: ">=18" } + + "@polkadot/wasm-bridge@7.5.4": + resolution: + { + integrity: sha512-6xaJVvoZbnbgpQYXNw9OHVNWjXmtcoPcWh7hlwx3NpfiLkkjljj99YS+XGZQlq7ks2fVCg7FbfknkNb8PldDaA==, + } + engines: { node: ">=18" } + peerDependencies: + "@polkadot/util": "*" + "@polkadot/x-randomvalues": "*" + + "@polkadot/wasm-crypto-asmjs@7.5.4": + resolution: + { + integrity: sha512-ZYwxQHAJ8pPt6kYk9XFmyuFuSS+yirJLonvP+DYbxOrARRUHfN4nzp4zcZNXUuaFhpbDobDSFn6gYzye6BUotA==, + } + engines: { node: ">=18" } + peerDependencies: + "@polkadot/util": "*" + + "@polkadot/wasm-crypto-init@7.5.4": + resolution: + { + integrity: sha512-U6s4Eo2rHs2n1iR01vTz/sOQ7eOnRPjaCsGWhPV+ZC/20hkVzwPAhiizu/IqMEol4tO2yiSheD4D6bn0KxUJhg==, + } + engines: { node: ">=18" } + peerDependencies: + "@polkadot/util": "*" + "@polkadot/x-randomvalues": "*" + + "@polkadot/wasm-crypto-wasm@7.5.4": + resolution: + { + integrity: sha512-PsHgLsVTu43eprwSvUGnxybtOEuHPES6AbApcs7y5ZbM2PiDMzYbAjNul098xJK/CPtrxZ0ePDFnaQBmIJyTFw==, + } + engines: { node: ">=18" } + peerDependencies: + "@polkadot/util": "*" + + "@polkadot/wasm-crypto@7.5.4": + resolution: + { + integrity: sha512-1seyClxa7Jd7kQjfnCzTTTfYhTa/KUTDUaD3DMHBk5Q4ZUN1D1unJgX+v1aUeXSPxmzocdZETPJJRZjhVOqg9g==, + } + engines: { node: ">=18" } + peerDependencies: + "@polkadot/util": "*" + "@polkadot/x-randomvalues": "*" + + "@polkadot/wasm-util@7.5.4": + resolution: + { + integrity: sha512-hqPpfhCpRAqCIn/CYbBluhh0TXmwkJnDRjxrU9Bnqtw9nMNa97D8JuOjdd2pi0rxm+eeLQ/f1rQMp71RMM9t4w==, + } + engines: { node: ">=18" } + peerDependencies: + "@polkadot/util": "*" + + "@polkadot/x-bigint@14.0.1": + resolution: + { + integrity: sha512-gfozjGnebr2rqURs31KtaWumbW4rRZpbiluhlmai6luCNrf5u8pB+oLA35kPEntrsLk9PnIG9OsC/n4hEtx4OQ==, + } + engines: { node: ">=18" } + + "@polkadot/x-global@14.0.1": + resolution: + { + integrity: sha512-aCI44DJU4fU0XXqrrSGIpi7JrZXK2kpe0jaQ2p6oDVXOOYEnZYXnMhTTmBE1lF/xtxzX50MnZrrU87jziU0qbA==, + } + engines: { node: ">=18" } + + "@polkadot/x-randomvalues@14.0.1": + resolution: + { + integrity: sha512-/XkQcvshzJLHITuPrN3zmQKuFIPdKWoaiHhhVLD6rQWV60lTXA3ajw3ocju8ZN7xRxnweMS9Ce0kMPYa0NhRMg==, + } + engines: { node: ">=18" } + peerDependencies: + "@polkadot/util": 14.0.1 + "@polkadot/wasm-util": "*" + + "@polkadot/x-textdecoder@14.0.1": + resolution: + { + integrity: sha512-CcWiPCuPVJsNk4Vq43lgFHqLRBQHb4r9RD7ZIYgmwoebES8TNm4g2ew9ToCzakFKSpzKu6I07Ne9wv/dt5zLuw==, + } + engines: { node: ">=18" } + + "@polkadot/x-textencoder@14.0.1": + resolution: + { + integrity: sha512-VY51SpQmF1ccmAGLfxhYnAe95Spfz049WZ/+kK4NfsGF9WejxVdU53Im5C80l45r8qHuYQsCWU3+t0FNunh2Kg==, + } + engines: { node: ">=18" } + + "@rollup/rollup-android-arm-eabi@4.57.1": + resolution: + { + integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==, + } + cpu: [arm] + os: [android] + + "@rollup/rollup-android-arm64@4.57.1": + resolution: + { + integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==, + } + cpu: [arm64] + os: [android] + + "@rollup/rollup-darwin-arm64@4.57.1": + resolution: + { + integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==, + } + cpu: [arm64] + os: [darwin] + + "@rollup/rollup-darwin-x64@4.57.1": + resolution: + { + integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==, + } + cpu: [x64] + os: [darwin] + + "@rollup/rollup-freebsd-arm64@4.57.1": + resolution: + { + integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==, + } + cpu: [arm64] + os: [freebsd] + + "@rollup/rollup-freebsd-x64@4.57.1": + resolution: + { + integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==, + } + cpu: [x64] + os: [freebsd] + + "@rollup/rollup-linux-arm-gnueabihf@4.57.1": + resolution: + { + integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==, + } + cpu: [arm] + os: [linux] + libc: [glibc] + + "@rollup/rollup-linux-arm-musleabihf@4.57.1": + resolution: + { + integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==, + } + cpu: [arm] + os: [linux] + libc: [musl] + + "@rollup/rollup-linux-arm64-gnu@4.57.1": + resolution: + { + integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==, + } + cpu: [arm64] + os: [linux] + libc: [glibc] + + "@rollup/rollup-linux-arm64-musl@4.57.1": + resolution: + { + integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==, + } + cpu: [arm64] + os: [linux] + libc: [musl] + + "@rollup/rollup-linux-loong64-gnu@4.57.1": + resolution: + { + integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==, + } + cpu: [loong64] + os: [linux] + libc: [glibc] + + "@rollup/rollup-linux-loong64-musl@4.57.1": + resolution: + { + integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==, + } + cpu: [loong64] + os: [linux] + libc: [musl] + + "@rollup/rollup-linux-ppc64-gnu@4.57.1": + resolution: + { + integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==, + } + cpu: [ppc64] + os: [linux] + libc: [glibc] + + "@rollup/rollup-linux-ppc64-musl@4.57.1": + resolution: + { + integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==, + } + cpu: [ppc64] + os: [linux] + libc: [musl] + + "@rollup/rollup-linux-riscv64-gnu@4.57.1": + resolution: + { + integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==, + } + cpu: [riscv64] + os: [linux] + libc: [glibc] + + "@rollup/rollup-linux-riscv64-musl@4.57.1": + resolution: + { + integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==, + } + cpu: [riscv64] + os: [linux] + libc: [musl] + + "@rollup/rollup-linux-s390x-gnu@4.57.1": + resolution: + { + integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==, + } + cpu: [s390x] + os: [linux] + libc: [glibc] + + "@rollup/rollup-linux-x64-gnu@4.57.1": + resolution: + { + integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==, + } + cpu: [x64] + os: [linux] + libc: [glibc] + + "@rollup/rollup-linux-x64-musl@4.57.1": + resolution: + { + integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==, + } + cpu: [x64] + os: [linux] + libc: [musl] + + "@rollup/rollup-openbsd-x64@4.57.1": + resolution: + { + integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==, + } + cpu: [x64] + os: [openbsd] + + "@rollup/rollup-openharmony-arm64@4.57.1": + resolution: + { + integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==, + } + cpu: [arm64] + os: [openharmony] + + "@rollup/rollup-win32-arm64-msvc@4.57.1": + resolution: + { + integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==, + } + cpu: [arm64] + os: [win32] + + "@rollup/rollup-win32-ia32-msvc@4.57.1": + resolution: + { + integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==, + } + cpu: [ia32] + os: [win32] + + "@rollup/rollup-win32-x64-gnu@4.57.1": + resolution: + { + integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==, + } + cpu: [x64] + os: [win32] + + "@rollup/rollup-win32-x64-msvc@4.57.1": + resolution: + { + integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==, + } + cpu: [x64] + os: [win32] + + "@scure/base@1.2.6": + resolution: + { + integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==, + } + + "@scure/sr25519@0.2.0": + resolution: + { + integrity: sha512-uUuLP7Z126XdSizKtrCGqYyR3b3hYtJ6Fg/XFUXmc2//k2aXHDLqZwFeXxL97gg4XydPROPVnuaHGF2+xriSKg==, + } + + "@substrate/ss58-registry@1.51.0": + resolution: + { + integrity: sha512-TWDurLiPxndFgKjVavCniytBIw+t4ViOi7TYp9h/D0NMmkEc9klFTo+827eyEJ0lELpqO207Ey7uGxUa+BS1jQ==, + } + + "@types/bn.js@5.2.0": + resolution: + { + integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==, + } + + "@types/chai@5.2.3": + resolution: + { + integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==, + } + + "@types/deep-eql@4.0.2": + resolution: + { + integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==, + } + + "@types/estree@1.0.8": + resolution: + { + integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, + } + + "@types/node@24.10.13": + resolution: + { + integrity: sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==, + } + + "@vitest/expect@3.2.4": + resolution: + { + integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==, + } + + "@vitest/mocker@3.2.4": + resolution: + { + integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==, + } + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + "@vitest/pretty-format@3.2.4": + resolution: + { + integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==, + } + + "@vitest/runner@3.2.4": + resolution: + { + integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==, + } + + "@vitest/snapshot@3.2.4": + resolution: + { + integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==, + } + + "@vitest/spy@3.2.4": + resolution: + { + integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==, + } + + "@vitest/utils@3.2.4": + resolution: + { + integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==, + } + + assertion-error@2.0.1: + resolution: + { + integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, + } + engines: { node: ">=12" } + + bn.js@5.2.2: + resolution: + { + integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==, + } + + cac@6.7.14: + resolution: + { + integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, + } + engines: { node: ">=8" } + + chai@5.3.3: + resolution: + { + integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==, + } + engines: { node: ">=18" } + + check-error@2.1.3: + resolution: + { + integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==, + } + engines: { node: ">= 16" } + + debug@4.4.3: + resolution: + { + integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@5.0.2: + resolution: + { + integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==, + } + engines: { node: ">=6" } + + es-module-lexer@1.7.0: + resolution: + { + integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==, + } + + esbuild@0.27.3: + resolution: + { + integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==, + } + engines: { node: ">=18" } + hasBin: true + + estree-walker@3.0.3: + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } + + expect-type@1.3.0: + resolution: + { + integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==, + } + engines: { node: ">=12.0.0" } + + fdir@6.5.0: + resolution: + { + integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, + } + engines: { node: ">=12.0.0" } + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + + js-tokens@9.0.1: + resolution: + { + integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==, + } + + loupe@3.2.1: + resolution: + { + integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==, + } + + magic-string@0.30.21: + resolution: + { + integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==, + } + + ms@2.1.3: + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } + + nanoid@3.3.11: + resolution: + { + integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + + pathe@2.0.3: + resolution: + { + integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, + } + + pathval@2.0.1: + resolution: + { + integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==, + } + engines: { node: ">= 14.16" } + + picocolors@1.1.1: + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } + + picomatch@4.0.3: + resolution: + { + integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==, + } + engines: { node: ">=12" } + + postcss@8.5.6: + resolution: + { + integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==, + } + engines: { node: ^10 || ^12 || >=14 } + + rollup@4.57.1: + resolution: + { + integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } + hasBin: true + + siginfo@2.0.0: + resolution: + { + integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, + } + + source-map-js@1.2.1: + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: ">=0.10.0" } + + stackback@0.0.2: + resolution: + { + integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, + } + + std-env@3.10.0: + resolution: + { + integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==, + } + + strip-literal@3.1.0: + resolution: + { + integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==, + } + + tinybench@2.9.0: + resolution: + { + integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, + } + + tinyexec@0.3.2: + resolution: + { + integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, + } + + tinyglobby@0.2.15: + resolution: + { + integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==, + } + engines: { node: ">=12.0.0" } + + tinypool@1.1.1: + resolution: + { + integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + + tinyrainbow@2.0.0: + resolution: + { + integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==, + } + engines: { node: ">=14.0.0" } + + tinyspy@4.0.4: + resolution: + { + integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==, + } + engines: { node: ">=14.0.0" } + + tslib@2.8.1: + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } + + undici-types@7.16.0: + resolution: + { + integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==, + } + + vite-node@3.2.4: + resolution: + { + integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + + vite@7.3.1: + resolution: + { + integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==, + } + engines: { node: ^20.19.0 || >=22.12.0 } + hasBin: true + peerDependencies: + "@types/node": ^20.19.0 || >=22.12.0 + jiti: ">=1.21.0" + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: ">=0.54.8" + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + "@types/node": + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.2.4: + resolution: + { + integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + peerDependencies: + "@edge-runtime/vm": "*" + "@types/debug": ^4.1.12 + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@vitest/browser": 3.2.4 + "@vitest/ui": 3.2.4 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/debug": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + why-is-node-running@2.3.0: + resolution: + { + integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, + } + engines: { node: ">=8" } + hasBin: true + +snapshots: + "@esbuild/aix-ppc64@0.27.3": + optional: true + + "@esbuild/android-arm64@0.27.3": + optional: true + + "@esbuild/android-arm@0.27.3": + optional: true + + "@esbuild/android-x64@0.27.3": + optional: true + + "@esbuild/darwin-arm64@0.27.3": + optional: true + + "@esbuild/darwin-x64@0.27.3": + optional: true + + "@esbuild/freebsd-arm64@0.27.3": + optional: true + + "@esbuild/freebsd-x64@0.27.3": + optional: true + + "@esbuild/linux-arm64@0.27.3": + optional: true + + "@esbuild/linux-arm@0.27.3": + optional: true + + "@esbuild/linux-ia32@0.27.3": + optional: true + + "@esbuild/linux-loong64@0.27.3": + optional: true + + "@esbuild/linux-mips64el@0.27.3": + optional: true + + "@esbuild/linux-ppc64@0.27.3": + optional: true + + "@esbuild/linux-riscv64@0.27.3": + optional: true + + "@esbuild/linux-s390x@0.27.3": + optional: true + + "@esbuild/linux-x64@0.27.3": + optional: true + + "@esbuild/netbsd-arm64@0.27.3": + optional: true + + "@esbuild/netbsd-x64@0.27.3": + optional: true + + "@esbuild/openbsd-arm64@0.27.3": + optional: true + + "@esbuild/openbsd-x64@0.27.3": + optional: true + + "@esbuild/openharmony-arm64@0.27.3": + optional: true + + "@esbuild/sunos-x64@0.27.3": + optional: true + + "@esbuild/win32-arm64@0.27.3": + optional: true + + "@esbuild/win32-ia32@0.27.3": + optional: true + + "@esbuild/win32-x64@0.27.3": + optional: true + + "@jridgewell/sourcemap-codec@1.5.5": {} + + "@noble/curves@1.9.7": + dependencies: + "@noble/hashes": 1.8.0 + + "@noble/hashes@1.8.0": {} + + "@polkadot/keyring@14.0.1(@polkadot/util-crypto@14.0.1(@polkadot/util@14.0.1))(@polkadot/util@14.0.1)": + dependencies: + "@polkadot/util": 14.0.1 + "@polkadot/util-crypto": 14.0.1(@polkadot/util@14.0.1) + tslib: 2.8.1 + + "@polkadot/networks@14.0.1": + dependencies: + "@polkadot/util": 14.0.1 + "@substrate/ss58-registry": 1.51.0 + tslib: 2.8.1 + + "@polkadot/util-crypto@14.0.1(@polkadot/util@14.0.1)": + dependencies: + "@noble/curves": 1.9.7 + "@noble/hashes": 1.8.0 + "@polkadot/networks": 14.0.1 + "@polkadot/util": 14.0.1 + "@polkadot/wasm-crypto": 7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1))) + "@polkadot/wasm-util": 7.5.4(@polkadot/util@14.0.1) + "@polkadot/x-bigint": 14.0.1 + "@polkadot/x-randomvalues": 14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)) + "@scure/base": 1.2.6 + "@scure/sr25519": 0.2.0 + tslib: 2.8.1 + + "@polkadot/util@14.0.1": + dependencies: + "@polkadot/x-bigint": 14.0.1 + "@polkadot/x-global": 14.0.1 + "@polkadot/x-textdecoder": 14.0.1 + "@polkadot/x-textencoder": 14.0.1 + "@types/bn.js": 5.2.0 + bn.js: 5.2.2 + tslib: 2.8.1 + + "@polkadot/wasm-bridge@7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)))": + dependencies: + "@polkadot/util": 14.0.1 + "@polkadot/wasm-util": 7.5.4(@polkadot/util@14.0.1) + "@polkadot/x-randomvalues": 14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)) + tslib: 2.8.1 + + "@polkadot/wasm-crypto-asmjs@7.5.4(@polkadot/util@14.0.1)": + dependencies: + "@polkadot/util": 14.0.1 + tslib: 2.8.1 + + "@polkadot/wasm-crypto-init@7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)))": + dependencies: + "@polkadot/util": 14.0.1 + "@polkadot/wasm-bridge": 7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1))) + "@polkadot/wasm-crypto-asmjs": 7.5.4(@polkadot/util@14.0.1) + "@polkadot/wasm-crypto-wasm": 7.5.4(@polkadot/util@14.0.1) + "@polkadot/wasm-util": 7.5.4(@polkadot/util@14.0.1) + "@polkadot/x-randomvalues": 14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)) + tslib: 2.8.1 + + "@polkadot/wasm-crypto-wasm@7.5.4(@polkadot/util@14.0.1)": + dependencies: + "@polkadot/util": 14.0.1 + "@polkadot/wasm-util": 7.5.4(@polkadot/util@14.0.1) + tslib: 2.8.1 + + "@polkadot/wasm-crypto@7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)))": + dependencies: + "@polkadot/util": 14.0.1 + "@polkadot/wasm-bridge": 7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1))) + "@polkadot/wasm-crypto-asmjs": 7.5.4(@polkadot/util@14.0.1) + "@polkadot/wasm-crypto-init": 7.5.4(@polkadot/util@14.0.1)(@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1))) + "@polkadot/wasm-crypto-wasm": 7.5.4(@polkadot/util@14.0.1) + "@polkadot/wasm-util": 7.5.4(@polkadot/util@14.0.1) + "@polkadot/x-randomvalues": 14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)) + tslib: 2.8.1 + + "@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1)": + dependencies: + "@polkadot/util": 14.0.1 + tslib: 2.8.1 + + "@polkadot/x-bigint@14.0.1": + dependencies: + "@polkadot/x-global": 14.0.1 + tslib: 2.8.1 + + "@polkadot/x-global@14.0.1": + dependencies: + tslib: 2.8.1 + + "@polkadot/x-randomvalues@14.0.1(@polkadot/util@14.0.1)(@polkadot/wasm-util@7.5.4(@polkadot/util@14.0.1))": + dependencies: + "@polkadot/util": 14.0.1 + "@polkadot/wasm-util": 7.5.4(@polkadot/util@14.0.1) + "@polkadot/x-global": 14.0.1 + tslib: 2.8.1 + + "@polkadot/x-textdecoder@14.0.1": + dependencies: + "@polkadot/x-global": 14.0.1 + tslib: 2.8.1 + + "@polkadot/x-textencoder@14.0.1": + dependencies: + "@polkadot/x-global": 14.0.1 + tslib: 2.8.1 + + "@rollup/rollup-android-arm-eabi@4.57.1": + optional: true + + "@rollup/rollup-android-arm64@4.57.1": + optional: true + + "@rollup/rollup-darwin-arm64@4.57.1": + optional: true + + "@rollup/rollup-darwin-x64@4.57.1": + optional: true + + "@rollup/rollup-freebsd-arm64@4.57.1": + optional: true + + "@rollup/rollup-freebsd-x64@4.57.1": + optional: true + + "@rollup/rollup-linux-arm-gnueabihf@4.57.1": + optional: true + + "@rollup/rollup-linux-arm-musleabihf@4.57.1": + optional: true + + "@rollup/rollup-linux-arm64-gnu@4.57.1": + optional: true + + "@rollup/rollup-linux-arm64-musl@4.57.1": + optional: true + + "@rollup/rollup-linux-loong64-gnu@4.57.1": + optional: true + + "@rollup/rollup-linux-loong64-musl@4.57.1": + optional: true + + "@rollup/rollup-linux-ppc64-gnu@4.57.1": + optional: true + + "@rollup/rollup-linux-ppc64-musl@4.57.1": + optional: true + + "@rollup/rollup-linux-riscv64-gnu@4.57.1": + optional: true + + "@rollup/rollup-linux-riscv64-musl@4.57.1": + optional: true + + "@rollup/rollup-linux-s390x-gnu@4.57.1": + optional: true + + "@rollup/rollup-linux-x64-gnu@4.57.1": + optional: true + + "@rollup/rollup-linux-x64-musl@4.57.1": + optional: true + + "@rollup/rollup-openbsd-x64@4.57.1": + optional: true + + "@rollup/rollup-openharmony-arm64@4.57.1": + optional: true + + "@rollup/rollup-win32-arm64-msvc@4.57.1": + optional: true + + "@rollup/rollup-win32-ia32-msvc@4.57.1": + optional: true + + "@rollup/rollup-win32-x64-gnu@4.57.1": + optional: true + + "@rollup/rollup-win32-x64-msvc@4.57.1": + optional: true + + "@scure/base@1.2.6": {} + + "@scure/sr25519@0.2.0": + dependencies: + "@noble/curves": 1.9.7 + "@noble/hashes": 1.8.0 + + "@substrate/ss58-registry@1.51.0": {} + + "@types/bn.js@5.2.0": + dependencies: + "@types/node": 24.10.13 + + "@types/chai@5.2.3": + dependencies: + "@types/deep-eql": 4.0.2 + assertion-error: 2.0.1 + + "@types/deep-eql@4.0.2": {} + + "@types/estree@1.0.8": {} + + "@types/node@24.10.13": + dependencies: + undici-types: 7.16.0 + + "@vitest/expect@3.2.4": + dependencies: + "@types/chai": 5.2.3 + "@vitest/spy": 3.2.4 + "@vitest/utils": 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + "@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.10.13))": + dependencies: + "@vitest/spy": 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.3.1(@types/node@24.10.13) + + "@vitest/pretty-format@3.2.4": + dependencies: + tinyrainbow: 2.0.0 + + "@vitest/runner@3.2.4": + dependencies: + "@vitest/utils": 3.2.4 + pathe: 2.0.3 + strip-literal: 3.1.0 + + "@vitest/snapshot@3.2.4": + dependencies: + "@vitest/pretty-format": 3.2.4 + magic-string: 0.30.21 + pathe: 2.0.3 + + "@vitest/spy@3.2.4": + dependencies: + tinyspy: 4.0.4 + + "@vitest/utils@3.2.4": + dependencies: + "@vitest/pretty-format": 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + assertion-error@2.0.1: {} + + bn.js@5.2.2: {} + + cac@6.7.14: {} + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + check-error@2.1.3: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-eql@5.0.2: {} + + es-module-lexer@1.7.0: {} + + esbuild@0.27.3: + optionalDependencies: + "@esbuild/aix-ppc64": 0.27.3 + "@esbuild/android-arm": 0.27.3 + "@esbuild/android-arm64": 0.27.3 + "@esbuild/android-x64": 0.27.3 + "@esbuild/darwin-arm64": 0.27.3 + "@esbuild/darwin-x64": 0.27.3 + "@esbuild/freebsd-arm64": 0.27.3 + "@esbuild/freebsd-x64": 0.27.3 + "@esbuild/linux-arm": 0.27.3 + "@esbuild/linux-arm64": 0.27.3 + "@esbuild/linux-ia32": 0.27.3 + "@esbuild/linux-loong64": 0.27.3 + "@esbuild/linux-mips64el": 0.27.3 + "@esbuild/linux-ppc64": 0.27.3 + "@esbuild/linux-riscv64": 0.27.3 + "@esbuild/linux-s390x": 0.27.3 + "@esbuild/linux-x64": 0.27.3 + "@esbuild/netbsd-arm64": 0.27.3 + "@esbuild/netbsd-x64": 0.27.3 + "@esbuild/openbsd-arm64": 0.27.3 + "@esbuild/openbsd-x64": 0.27.3 + "@esbuild/openharmony-arm64": 0.27.3 + "@esbuild/sunos-x64": 0.27.3 + "@esbuild/win32-arm64": 0.27.3 + "@esbuild/win32-ia32": 0.27.3 + "@esbuild/win32-x64": 0.27.3 + + estree-walker@3.0.3: + dependencies: + "@types/estree": 1.0.8 + + expect-type@1.3.0: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fsevents@2.3.3: + optional: true + + js-tokens@9.0.1: {} + + loupe@3.2.1: {} + + magic-string@0.30.21: + dependencies: + "@jridgewell/sourcemap-codec": 1.5.5 + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + pathe@2.0.3: {} + + pathval@2.0.1: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + rollup@4.57.1: + dependencies: + "@types/estree": 1.0.8 + optionalDependencies: + "@rollup/rollup-android-arm-eabi": 4.57.1 + "@rollup/rollup-android-arm64": 4.57.1 + "@rollup/rollup-darwin-arm64": 4.57.1 + "@rollup/rollup-darwin-x64": 4.57.1 + "@rollup/rollup-freebsd-arm64": 4.57.1 + "@rollup/rollup-freebsd-x64": 4.57.1 + "@rollup/rollup-linux-arm-gnueabihf": 4.57.1 + "@rollup/rollup-linux-arm-musleabihf": 4.57.1 + "@rollup/rollup-linux-arm64-gnu": 4.57.1 + "@rollup/rollup-linux-arm64-musl": 4.57.1 + "@rollup/rollup-linux-loong64-gnu": 4.57.1 + "@rollup/rollup-linux-loong64-musl": 4.57.1 + "@rollup/rollup-linux-ppc64-gnu": 4.57.1 + "@rollup/rollup-linux-ppc64-musl": 4.57.1 + "@rollup/rollup-linux-riscv64-gnu": 4.57.1 + "@rollup/rollup-linux-riscv64-musl": 4.57.1 + "@rollup/rollup-linux-s390x-gnu": 4.57.1 + "@rollup/rollup-linux-x64-gnu": 4.57.1 + "@rollup/rollup-linux-x64-musl": 4.57.1 + "@rollup/rollup-openbsd-x64": 4.57.1 + "@rollup/rollup-openharmony-arm64": 4.57.1 + "@rollup/rollup-win32-arm64-msvc": 4.57.1 + "@rollup/rollup-win32-ia32-msvc": 4.57.1 + "@rollup/rollup-win32-x64-gnu": 4.57.1 + "@rollup/rollup-win32-x64-msvc": 4.57.1 + fsevents: 2.3.3 + + siginfo@2.0.0: {} + + source-map-js@1.2.1: {} + + stackback@0.0.2: {} + + std-env@3.10.0: {} + + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.4: {} + + tslib@2.8.1: {} + + undici-types@7.16.0: {} + + vite-node@3.2.4(@types/node@24.10.13): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.3.1(@types/node@24.10.13) + transitivePeerDependencies: + - "@types/node" + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite@7.3.1(@types/node@24.10.13): + dependencies: + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 + optionalDependencies: + "@types/node": 24.10.13 + fsevents: 2.3.3 + + vitest@3.2.4(@types/node@24.10.13): + dependencies: + "@types/chai": 5.2.3 + "@vitest/expect": 3.2.4 + "@vitest/mocker": 3.2.4(vite@7.3.1(@types/node@24.10.13)) + "@vitest/pretty-format": 3.2.4 + "@vitest/runner": 3.2.4 + "@vitest/snapshot": 3.2.4 + "@vitest/spy": 3.2.4 + "@vitest/utils": 3.2.4 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.3.0 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.3.1(@types/node@24.10.13) + vite-node: 3.2.4(@types/node@24.10.13) + why-is-node-running: 2.3.0 + optionalDependencies: + "@types/node": 24.10.13 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 diff --git a/e2e/shared/sequencer.ts b/e2e/shared/sequencer.ts new file mode 100644 index 0000000000..a87490d89b --- /dev/null +++ b/e2e/shared/sequencer.ts @@ -0,0 +1,21 @@ +import { BaseSequencer } from "vitest/node"; +import type { TestSpecification } from "vitest/node"; + +/** + * Sorts test files alphabetically by their module path. + * + * Vitest's default sequencer orders files by cached duration/failure history, + * which does not respect numeric prefixes (00-, 01-, 02-, ...). This sequencer + * ensures files always run in the order they are named, which matters for + * multi-file suites where later files depend on state set up by earlier ones + * (e.g. a scaling test that adds nodes for subsequent edge-case tests). + */ +export default class AlphabeticalSequencer extends BaseSequencer { + async shard(files: TestSpecification[]): Promise { + return super.shard(files); + } + + async sort(files: TestSpecification[]): Promise { + return files.sort((a, b) => a.moduleId.localeCompare(b.moduleId)); + } +} diff --git a/e2e/shared/tsconfig.json b/e2e/shared/tsconfig.json new file mode 100644 index 0000000000..b4cbbb843b --- /dev/null +++ b/e2e/shared/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true, + "types": ["node"] + } +} diff --git a/e2e/shield/.gitignore b/e2e/shield/.gitignore new file mode 100644 index 0000000000..3e6b0f99ff --- /dev/null +++ b/e2e/shield/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +node-subtensor/ diff --git a/e2e/shield/helpers.ts b/e2e/shield/helpers.ts new file mode 100644 index 0000000000..ac8fdb9e8f --- /dev/null +++ b/e2e/shield/helpers.ts @@ -0,0 +1,72 @@ +import type { TypedApi, PolkadotSigner } from "polkadot-api"; +import { Binary } from "polkadot-api"; +import { hexToU8a } from "@polkadot/util"; +import { xchacha20poly1305 } from "@noble/ciphers/chacha.js"; +import { randomBytes } from "@noble/ciphers/utils.js"; +import { MlKem768 } from "mlkem"; +import { xxhashAsU8a } from "@polkadot/util-crypto"; +import type { subtensor } from "@polkadot-api/descriptors"; + +export const getNextKey = async ( + api: TypedApi, +): Promise => { + // Query at "best" (not default "finalized") because keys rotate every block + // and finalized lags ~2 blocks behind best with GRANDPA. Using finalized + // would return a stale key whose hash won't match CurrentKey/NextKey at + // block-building time, causing InvalidShieldedTxPubKeyHash rejection. + const key = await api.query.MevShield.NextKey.getValue({ at: "best" }); + if (!key) return undefined; + if (key instanceof Binary) return key.asBytes(); + return hexToU8a(key as string); +}; + +export const getCurrentKey = async ( + api: TypedApi, +): Promise => { + const key = await api.query.MevShield.CurrentKey.getValue({ at: "best" }); + if (!key) return undefined; + if (key instanceof Binary) return key.asBytes(); + return hexToU8a(key as string); +}; + +export const encryptTransaction = async ( + plaintext: Uint8Array, + publicKey: Uint8Array, +): Promise => { + const keyHash = xxhashAsU8a(publicKey, 128); + + const mlKem = new MlKem768(); + const [kemCt, sharedSecret] = await mlKem.encap(publicKey); + + const nonce = randomBytes(24); + const chacha = xchacha20poly1305(sharedSecret, nonce); + const aeadCt = chacha.encrypt(plaintext); + + const kemLenBytes = new Uint8Array(2); + new DataView(kemLenBytes.buffer).setUint16(0, kemCt.length, true); + + return new Uint8Array([...keyHash, ...kemLenBytes, ...kemCt, ...nonce, ...aeadCt]); +}; + +export const submitEncrypted = async ( + api: TypedApi, + signer: PolkadotSigner, + innerTxBytes: Uint8Array, + publicKey: Uint8Array, + nonce?: number, +) => { + const ciphertext = await encryptTransaction(innerTxBytes, publicKey); + return submitEncryptedRaw(api, signer, ciphertext, nonce); +}; + +export const submitEncryptedRaw = async ( + api: TypedApi, + signer: PolkadotSigner, + ciphertext: Uint8Array, + nonce?: number, +) => { + const tx = api.tx.MevShield.submit_encrypted({ + ciphertext: Binary.fromBytes(ciphertext), + }); + return tx.signAndSubmit(signer, nonce !== undefined ? { nonce } : {}); +}; diff --git a/e2e/shield/package.json b/e2e/shield/package.json new file mode 100644 index 0000000000..d04f2acf6a --- /dev/null +++ b/e2e/shield/package.json @@ -0,0 +1,21 @@ +{ + "name": "e2e-shield", + "version": "1.0.0", + "type": "module", + "scripts": { + "test": "vitest run" + }, + "dependencies": { + "e2e-shared": "workspace:*", + "@noble/ciphers": "catalog:", + "@polkadot/util": "catalog:", + "@polkadot/util-crypto": "catalog:", + "@polkadot-api/descriptors": "file:../.papi/descriptors", + "mlkem": "catalog:", + "polkadot-api": "catalog:" + }, + "devDependencies": { + "@types/node": "catalog:", + "vitest": "catalog:" + } +} diff --git a/e2e/shield/setup.ts b/e2e/shield/setup.ts new file mode 100644 index 0000000000..161346b1b2 --- /dev/null +++ b/e2e/shield/setup.ts @@ -0,0 +1,161 @@ +import { writeFile, readFile, rm, mkdir } from "node:fs/promises"; +import { + generateChainSpec, + insertKeys, + getGenesisPatch, + addAuthority, +} from "e2e-shared/chainspec.js"; +import { + startNode, + started, + peerCount, + finalizedBlocks, + stop, + log, + type Node, + type NodeOptions, +} from "e2e-shared/node.js"; + +const CHAIN_SPEC_PATH = "/tmp/subtensor-e2e/shield/chain-spec.json"; +const STATE_FILE = "/tmp/subtensor-e2e/shield/nodes.json"; + +export type NetworkState = { + binaryPath: string; + chainSpec: string; + nodes: { + name: string; + rpcPort: number; + port: number; + pid: number; + basePath: string; + }[]; +}; + +const nodes: Node[] = []; + +const BINARY_PATH = process.env.BINARY_PATH || "../../target/release/node-subtensor"; + +// The local chain spec has 2 built-in authorities (One, Two). +// We add "Three" dynamically by patching the chain spec JSON. +const EXTRA_AUTHORITY_SEEDS = ["Three"]; + +type NodeConfig = Omit & { + keySeed?: string; +}; + +const NODE_CONFIGS: NodeConfig[] = [ + { name: "one", port: 30333, rpcPort: 9944, basePath: "/tmp/subtensor-e2e/shield/one", validator: true }, + { name: "two", port: 30334, rpcPort: 9945, basePath: "/tmp/subtensor-e2e/shield/two", validator: true }, + { + name: "three", + port: 30335, + rpcPort: 9946, + basePath: "/tmp/subtensor-e2e/shield/three", + validator: true, + keySeed: "//Three", + }, +]; + +export async function setup() { + log(`Setting up ${NODE_CONFIGS.length}-node network for shield E2E tests`); + log(`Binary path: ${BINARY_PATH}`); + + await mkdir("/tmp/subtensor-e2e/shield", { recursive: true }); + + await generateChainSpec(BINARY_PATH, CHAIN_SPEC_PATH, (spec) => { + const patch = getGenesisPatch(spec); + for (const seed of EXTRA_AUTHORITY_SEEDS) { + addAuthority(patch, seed); + } + }); + + for (const config of NODE_CONFIGS) { + await rm(config.basePath, { recursive: true, force: true }); + } + + // Insert keys for authority nodes that don't have built-in substrate shortcuts. + for (const config of NODE_CONFIGS) { + if (config.keySeed) { + insertKeys(BINARY_PATH, config.basePath, CHAIN_SPEC_PATH, config.keySeed); + } + } + + for (const config of NODE_CONFIGS) { + const node = startNode({ + binaryPath: BINARY_PATH, + chainSpec: CHAIN_SPEC_PATH, + ...config, + }); + nodes.push(node); + await started(node); + } + + const all = Promise.all.bind(Promise); + + await all(nodes.map((n) => peerCount(n, nodes.length - 1))); + log("All nodes peered"); + + await all(nodes.map((n) => finalizedBlocks(n, 3))); + log("All nodes finalized block 3"); + + const state: NetworkState = { + binaryPath: BINARY_PATH, + chainSpec: CHAIN_SPEC_PATH, + nodes: NODE_CONFIGS.map((c, i) => ({ + name: c.name, + rpcPort: c.rpcPort, + port: c.port, + pid: nodes[i].process.pid!, + basePath: c.basePath, + })), + }; + + await writeFile(STATE_FILE, JSON.stringify(state, null, 2)); + log("Network state written to " + STATE_FILE); +} + +export async function teardown() { + log("Tearing down shield E2E test network"); + + // Read the state file to find ALL nodes (including extras added by scaling tests). + let state: NetworkState | undefined; + try { + const data = await readFile(STATE_FILE, "utf-8"); + state = JSON.parse(data); + } catch {} + + // Stop nodes we have handles to (from globalSetup). + for (const node of nodes) { + try { + await stop(node); + } catch (e) { + log(`Warning: failed to stop ${node.name}: ${e}`); + } + } + + // Kill any extra nodes (added by scaling tests) by PID. + if (state) { + const ownPids = new Set(nodes.map((n) => n.process.pid)); + for (const nodeInfo of state.nodes) { + if (!ownPids.has(nodeInfo.pid)) { + try { + process.kill(nodeInfo.pid, "SIGTERM"); + log(`Killed extra node ${nodeInfo.name} (pid ${nodeInfo.pid})`); + } catch { + // Already dead, ignore. + } + } + } + + } + + // Clean up the entire suite directory in one shot. + await rm("/tmp/subtensor-e2e/shield", { recursive: true, force: true }); + + log("Teardown complete"); +} + +export async function readNetworkState(): Promise { + const data = await readFile(STATE_FILE, "utf-8"); + return JSON.parse(data); +} diff --git a/e2e/shield/tests/00-basic.test.ts b/e2e/shield/tests/00-basic.test.ts new file mode 100644 index 0000000000..70c801fd7c --- /dev/null +++ b/e2e/shield/tests/00-basic.test.ts @@ -0,0 +1,226 @@ +import { describe, it, expect, beforeAll, afterAll } from "vitest"; +import { readFile } from "node:fs/promises"; +import type { PolkadotClient, TypedApi } from "polkadot-api"; +import { Binary } from "polkadot-api"; +import { hexToU8a } from "@polkadot/util"; +import { subtensor, MultiAddress } from "@polkadot-api/descriptors"; +import type { NetworkState } from "../setup.js"; +import { + connectClient, + createSigner, + getAccountNonce, + getBalance, + waitForFinalizedBlocks, +} from "e2e-shared/client.js"; +import { getNextKey, getCurrentKey, encryptTransaction, submitEncrypted } from "../helpers.js"; + +let client: PolkadotClient; +let api: TypedApi; +let state: NetworkState; + +const alice = createSigner("//Alice"); +const bob = createSigner("//Bob"); +const charlie = createSigner("//Charlie"); + +beforeAll(async () => { + const data = await readFile("/tmp/subtensor-e2e/shield/nodes.json", "utf-8"); + state = JSON.parse(data); + ({ client, api } = await connectClient(state.nodes[0].rpcPort)); + + // Wait for enough finalized blocks so the inherent has had time to run + // and keys have rotated at least once. + await waitForFinalizedBlocks(client, 3); +}); + +afterAll(() => { + client?.destroy(); +}); + +describe("MEV Shield — key rotation", () => { + it("NextKey and CurrentKey are populated and rotate across blocks", async () => { + const nextKey1 = await getNextKey(api); + expect(nextKey1).toBeDefined(); + expect(nextKey1!.length).toBe(1184); // ML-KEM-768 public key + + const currentKey1 = await getCurrentKey(api); + expect(currentKey1).toBeDefined(); + expect(currentKey1!.length).toBe(1184); + + await waitForFinalizedBlocks(client, 2); + + const nextKey2 = await getNextKey(api); + expect(nextKey2).toBeDefined(); + // Keys should have rotated — nextKey changes each block. + expect(nextKey2).not.toEqual(nextKey1); + + const currentKey2 = await getCurrentKey(api); + expect(currentKey2).toBeDefined(); + expect(currentKey2).not.toEqual(currentKey1); + }); + + it("AuthorKeys stores per-author keys", async () => { + const authorities = await api.query.Aura.Authorities.getValue(); + expect(authorities.length).toBeGreaterThan(0); + + let foundKeys = 0; + for (const authority of authorities) { + const key = await api.query.MevShield.AuthorKeys.getValue(authority); + if (key) foundKeys++; + } + + expect(foundKeys).toBeGreaterThan(0); + }); +}); + +describe("MEV Shield — encrypted transactions", () => { + it("Happy path: wrapper and inner tx are included in the same block", async () => { + const nextKey = await getNextKey(api); + expect(nextKey).toBeDefined(); + + const balanceBefore = await getBalance(api, bob.address); + + const nonce = await getAccountNonce(api, alice.address); + const innerTxHex = await api.tx.Balances.transfer_keep_alive({ + dest: MultiAddress.Id(bob.address), + value: 10_000_000_000n, + }).sign(alice.signer, { nonce: nonce + 1 }); + + await submitEncrypted(api, alice.signer, hexToU8a(innerTxHex), nextKey!, nonce); + + const balanceAfter = await getBalance(api, bob.address); + expect(balanceAfter).toBeGreaterThan(balanceBefore); + }); + + it("Failed inner tx: wrapper succeeds but inner transfer has no effect", async () => { + const nextKey = await getNextKey(api); + expect(nextKey).toBeDefined(); + + const balanceBefore = await getBalance(api, bob.address); + + // Encrypt a transfer of more than Alice has. + // The wrapper is valid (correct key_hash, valid encryption), but the + // inner transfer should fail at dispatch with InsufficientBalance. + const nonce = await getAccountNonce(api, alice.address); + const innerTxHex = await api.tx.Balances.transfer_keep_alive({ + dest: MultiAddress.Id(bob.address), + value: 9_000_000_000_000_000_000n, + }).sign(alice.signer, { nonce: nonce + 1 }); + + await submitEncrypted(api, alice.signer, hexToU8a(innerTxHex), nextKey!, nonce); + + // The inner transfer failed, so bob's balance should not increase. + const balanceAfter = await getBalance(api, bob.address); + expect(balanceAfter).toBe(balanceBefore); + }); + + it("Malformed ciphertext is rejected at pool level", async () => { + const nonce = await getAccountNonce(api, alice.address); + + // 5 bytes of garbage — not valid ciphertext at all. + const garbage = new Uint8Array([0x01, 0x02, 0x03, 0x04, 0x05]); + + const tx = api.tx.MevShield.submit_encrypted({ + ciphertext: Binary.fromBytes(garbage), + }); + + // Pool validation rejects with FailedShieldedTxParsing (Custom code 23). + await expect(tx.signAndSubmit(alice.signer, { nonce })).rejects.toThrow(); + }); + + it("Wrong key hash is not included by the block proposer", async () => { + const nextKey = await getNextKey(api); + expect(nextKey).toBeDefined(); + + const balanceBefore = await getBalance(api, bob.address); + + const nonce = await getAccountNonce(api, alice.address); + const innerTxHex = await api.tx.Balances.transfer_keep_alive({ + dest: MultiAddress.Id(bob.address), + value: 1_000_000_000n, + }).sign(alice.signer, { nonce: nonce + 1 }); + + const ciphertext = await encryptTransaction(hexToU8a(innerTxHex), nextKey!); + + // Tamper the first 16 bytes (key_hash). + const tampered = new Uint8Array(ciphertext); + for (let i = 0; i < 16; i++) tampered[i] = 0xff; + + const tx = api.tx.MevShield.submit_encrypted({ + ciphertext: Binary.fromBytes(tampered), + }); + const signedHex = await tx.sign(alice.signer, { nonce }); + // Send without waiting — the tx enters the pool but the block + // proposer will skip it because the key_hash doesn't match. + client.submit(signedHex).catch(() => {}); + + await waitForFinalizedBlocks(client, 3); + + // The inner transfer should NOT have executed. + const balanceAfter = await getBalance(api, bob.address); + expect(balanceAfter).toBe(balanceBefore); + }); + + it("Stale key is not included after rotation", async () => { + const staleKey = await getNextKey(api); + expect(staleKey).toBeDefined(); + + // Wait for enough blocks that the key has rotated past both + // currentKey and nextKey positions. + await waitForFinalizedBlocks(client, 3); + + const balanceBefore = await getBalance(api, bob.address); + + const nonce = await getAccountNonce(api, alice.address); + const innerTxHex = await api.tx.Balances.transfer_keep_alive({ + dest: MultiAddress.Id(bob.address), + value: 1_000_000_000n, + }).sign(alice.signer, { nonce: nonce + 1 }); + + const ciphertext = await encryptTransaction(hexToU8a(innerTxHex), staleKey!); + + const tx = api.tx.MevShield.submit_encrypted({ + ciphertext: Binary.fromBytes(ciphertext), + }); + const signedHex = await tx.sign(alice.signer, { nonce }); + // Send without waiting — the block proposer will reject because + // key_hash no longer matches currentKey or nextKey. + client.submit(signedHex).catch(() => {}); + + await waitForFinalizedBlocks(client, 3); + + // The inner transfer should NOT have executed. + const balanceAfter = await getBalance(api, bob.address); + expect(balanceAfter).toBe(balanceBefore); + }); + + it("Multiple encrypted txs in same block", async () => { + // Use different signers to avoid nonce ordering issues between + // the outer wrappers and decrypted inner transactions. + const nextKey = await getNextKey(api); + expect(nextKey).toBeDefined(); + + const balanceBefore = await getBalance(api, charlie.address); + + const senders = [alice, bob]; + const amount = 1_000_000_000n; + const txPromises = []; + + for (const sender of senders) { + const nonce = await getAccountNonce(api, sender.address); + + const innerTxHex = await api.tx.Balances.transfer_keep_alive({ + dest: MultiAddress.Id(charlie.address), + value: amount, + }).sign(sender.signer, { nonce: nonce + 1 }); + + txPromises.push( + submitEncrypted(api, sender.signer, hexToU8a(innerTxHex), nextKey!, nonce), + ); + } + + await Promise.all(txPromises); + + const balanceAfter = await getBalance(api, charlie.address); + expect(balanceAfter).toBeGreaterThan(balanceBefore); + }); +}); diff --git a/e2e/shield/tests/01-scaling.test.ts b/e2e/shield/tests/01-scaling.test.ts new file mode 100644 index 0000000000..bd4bfcaaca --- /dev/null +++ b/e2e/shield/tests/01-scaling.test.ts @@ -0,0 +1,133 @@ +import { describe, it, expect, beforeAll, afterAll } from "vitest"; +import { readFile, writeFile, rm } from "node:fs/promises"; +import type { PolkadotClient, TypedApi } from "polkadot-api"; +import { hexToU8a } from "@polkadot/util"; +import { subtensor, MultiAddress } from "@polkadot-api/descriptors"; +import type { NetworkState } from "../setup.js"; +import { + connectClient, + createSigner, + getAccountNonce, + getBalance, + waitForFinalizedBlocks, +} from "e2e-shared/client.js"; +import { startNode, started, log } from "e2e-shared/node.js"; +import { getNextKey, submitEncrypted } from "../helpers.js"; + +let client: PolkadotClient; +let api: TypedApi; +let state: NetworkState; + +const alice = createSigner("//Alice"); +const bob = createSigner("//Bob"); +const charlie = createSigner("//Charlie"); + +// Extra nodes join as non-authority full nodes. +const EXTRA_NODE_CONFIGS = [ + { name: "four", port: 30336, rpcPort: 9947, basePath: "/tmp/subtensor-e2e/shield/four" }, + { name: "five", port: 30337, rpcPort: 9948, basePath: "/tmp/subtensor-e2e/shield/five" }, + { name: "six", port: 30338, rpcPort: 9949, basePath: "/tmp/subtensor-e2e/shield/six" }, +]; + +beforeAll(async () => { + const data = await readFile("/tmp/subtensor-e2e/shield/nodes.json", "utf-8"); + state = JSON.parse(data); + ({ client, api } = await connectClient(state.nodes[0].rpcPort)); + + // Start 3 additional full nodes to scale from 3 → 6. + for (const config of EXTRA_NODE_CONFIGS) { + await rm(config.basePath, { recursive: true, force: true }); + + const node = startNode({ + ...config, + binaryPath: state.binaryPath, + validator: false, + chainSpec: state.chainSpec, + }); + await started(node); + log(`Extra node ${config.name} started`); + + // Track in state file so global teardown can clean up. + state.nodes.push({ + name: config.name, + rpcPort: config.rpcPort, + port: config.port, + pid: node.process.pid!, + basePath: config.basePath, + }); + } + + // Persist updated state for subsequent test files (edge-cases). + await writeFile("/tmp/subtensor-e2e/shield/nodes.json", JSON.stringify(state, null, 2)); +}); + +afterAll(() => { + client?.destroy(); +}); + +describe("MEV Shield — 6 node scaling", () => { + it("Network scales to 6 nodes with full peering", async () => { + expect(state.nodes.length).toBe(6); + + // Verify the network is healthy by checking finalization continues. + await waitForFinalizedBlocks(client, 2); + }); + + it("Key rotation continues with more peers", async () => { + const key1 = await getNextKey(api); + expect(key1).toBeDefined(); + + await waitForFinalizedBlocks(client, 2); + + const key2 = await getNextKey(api); + expect(key2).toBeDefined(); + expect(key2!.length).toBe(1184); + }); + + it("Encrypted tx works with 6 nodes", async () => { + const nextKey = await getNextKey(api); + expect(nextKey).toBeDefined(); + + const balanceBefore = await getBalance(api, bob.address); + + const nonce = await getAccountNonce(api, alice.address); + const innerTxHex = await api.tx.Balances.transfer_keep_alive({ + dest: MultiAddress.Id(bob.address), + value: 5_000_000_000n, + }).sign(alice.signer, { nonce: nonce + 1 }); + + await submitEncrypted(api, alice.signer, hexToU8a(innerTxHex), nextKey!, nonce); + + const balanceAfter = await getBalance(api, bob.address); + expect(balanceAfter).toBeGreaterThan(balanceBefore); + }); + + it("Multiple encrypted txs in same block with 6 nodes", async () => { + const nextKey = await getNextKey(api); + expect(nextKey).toBeDefined(); + + const balanceBefore = await getBalance(api, charlie.address); + + const senders = [alice, bob]; + const amount = 1_000_000_000n; + const txPromises = []; + + for (const sender of senders) { + const nonce = await getAccountNonce(api, sender.address); + + const innerTxHex = await api.tx.Balances.transfer_keep_alive({ + dest: MultiAddress.Id(charlie.address), + value: amount, + }).sign(sender.signer, { nonce: nonce + 1 }); + + txPromises.push( + submitEncrypted(api, sender.signer, hexToU8a(innerTxHex), nextKey!, nonce), + ); + } + + await Promise.all(txPromises); + + const balanceAfter = await getBalance(api, charlie.address); + expect(balanceAfter).toBeGreaterThan(balanceBefore); + }); +}); diff --git a/e2e/shield/tests/02-edge-cases.test.ts b/e2e/shield/tests/02-edge-cases.test.ts new file mode 100644 index 0000000000..63baa27c56 --- /dev/null +++ b/e2e/shield/tests/02-edge-cases.test.ts @@ -0,0 +1,80 @@ +import { describe, it, expect, beforeAll, afterAll } from "vitest"; +import { readFile } from "node:fs/promises"; +import type { PolkadotClient, TypedApi } from "polkadot-api"; +import { hexToU8a } from "@polkadot/util"; +import { subtensor, MultiAddress } from "@polkadot-api/descriptors"; +import type { NetworkState } from "../setup.js"; +import { + connectClient, + createSigner, + getAccountNonce, + getBalance, +} from "e2e-shared/client.js"; +import { getNextKey, submitEncrypted } from "../helpers.js"; + +let client: PolkadotClient; +let api: TypedApi; +let state: NetworkState; + +const alice = createSigner("//Alice"); +const bob = createSigner("//Bob"); + +beforeAll(async () => { + const data = await readFile("/tmp/subtensor-e2e/shield/nodes.json", "utf-8"); + state = JSON.parse(data); + ({ client, api } = await connectClient(state.nodes[0].rpcPort)); +}); + +afterAll(() => { + client?.destroy(); +}); + +describe("MEV Shield — edge cases", () => { + it("Encrypted tx persists across blocks (CurrentKey fallback)", async () => { + // The idea: submit an encrypted tx right at a block boundary. + // Even if the key rotates (NextKey changes), the old key becomes + // CurrentKey, so the extension still accepts it. + const nextKey = await getNextKey(api); + expect(nextKey).toBeDefined(); + + const balanceBefore = await getBalance(api, bob.address); + + const nonce = await getAccountNonce(api, alice.address); + const innerTxHex = await api.tx.Balances.transfer_keep_alive({ + dest: MultiAddress.Id(bob.address), + value: 2_000_000_000n, + }).sign(alice.signer, { nonce: nonce + 1 }); + + // Submit and wait for finalization — the tx may land in the next block + // or the one after, where CurrentKey = the old NextKey. + await submitEncrypted(api, alice.signer, hexToU8a(innerTxHex), nextKey!, nonce); + + const balanceAfter = await getBalance(api, bob.address); + expect(balanceAfter).toBeGreaterThan(balanceBefore); + }); + + it("Valid ciphertext with invalid inner call", async () => { + // Encrypt garbage bytes (not a valid extrinsic) using a valid NextKey. + // The wrapper tx should be included in a block because: + // - The ciphertext is well-formed (key_hash, kem_ct, nonce, aead_ct) + // - The key_hash matches a known key + // But the inner decrypted bytes won't decode as a valid extrinsic, + // so no inner transaction should execute. + const nextKey = await getNextKey(api); + expect(nextKey).toBeDefined(); + + const balanceBefore = await getBalance(api, bob.address); + + // Garbage "inner transaction" bytes — not a valid extrinsic at all. + const garbageInner = new Uint8Array(64); + for (let i = 0; i < 64; i++) garbageInner[i] = (i * 7 + 13) & 0xff; + + const nonce = await getAccountNonce(api, alice.address); + + await submitEncrypted(api, alice.signer, garbageInner, nextKey!, nonce); + + // No balance change — the garbage inner call could not have been a valid transfer. + const balanceAfter = await getBalance(api, bob.address); + expect(balanceAfter).toBe(balanceBefore); + }); +}); diff --git a/e2e/shield/tsconfig.json b/e2e/shield/tsconfig.json new file mode 100644 index 0000000000..c2f86d9e2c --- /dev/null +++ b/e2e/shield/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "bundler", + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true, + "types": ["node", "vitest/globals"] + } +} diff --git a/e2e/shield/vitest.config.ts b/e2e/shield/vitest.config.ts new file mode 100644 index 0000000000..d9c2978930 --- /dev/null +++ b/e2e/shield/vitest.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from "vitest/config"; +import AlphabeticalSequencer from "e2e-shared/sequencer.js"; + +export default defineConfig({ + test: { + globals: true, + testTimeout: 120_000, + hookTimeout: 300_000, + fileParallelism: false, + globalSetup: "./setup.ts", + include: ["tests/**/*.test.ts"], + sequence: { + sequencer: AlphabeticalSequencer, + }, + }, +}); diff --git a/node/Cargo.toml b/node/Cargo.toml index 1d2351c265..e7cf0df1e2 100644 --- a/node/Cargo.toml +++ b/node/Cargo.toml @@ -26,6 +26,7 @@ clap = { workspace = true, features = ["derive"] } futures = { workspace = true, features = ["thread-pool"] } serde = { workspace = true, features = ["derive"] } hex.workspace = true +tokio = { workspace = true, features = ["time"] } # Storage import memmap2.workspace = true @@ -77,6 +78,7 @@ sp-keystore.workspace = true polkadot-sdk = { workspace = true, features = [ "cumulus-primitives-proof-size-hostfunction", ] } +stp-io.workspace = true # These dependencies are used for the subtensor's RPCs jsonrpsee = { workspace = true, features = ["server"] } @@ -94,6 +96,7 @@ pallet-transaction-payment-rpc-runtime-api.workspace = true # These dependencies are used for runtime benchmarking frame-benchmarking.workspace = true frame-benchmarking-cli.workspace = true +pallet-subtensor.workspace = true # Needed for Frontier fc-mapping-sync.workspace = true @@ -116,18 +119,8 @@ num-traits = { workspace = true, features = ["std"] } # Mev Shield pallet-shield.workspace = true -tokio = { version = "1.38", features = ["time"] } -x25519-dalek = "2" -hkdf = "0.12" -chacha20poly1305 = { version = "0.10", features = ["std"] } -codec.workspace = true -rand.workspace = true -sha2.workspace = true -anyhow.workspace = true -pallet-subtensor.workspace = true -ml-kem.workspace = true -rand_core = "0.9.3" -blake2 = "0.10.6" +stp-shield.workspace = true +stc-shield.workspace = true # Local Dependencies node-subtensor-runtime = { workspace = true, features = ["std"] } @@ -187,8 +180,8 @@ try-runtime = [ "pallet-commitments/try-runtime", "pallet-drand/try-runtime", "polkadot-sdk/try-runtime", - "pallet-shield/try-runtime", "pallet-subtensor/try-runtime", + "pallet-shield/try-runtime", ] metadata-hash = ["node-subtensor-runtime/metadata-hash"] diff --git a/node/src/benchmarking.rs b/node/src/benchmarking.rs index 02e31e750e..2f7d2fb47d 100644 --- a/node/src/benchmarking.rs +++ b/node/src/benchmarking.rs @@ -124,23 +124,26 @@ pub fn create_benchmark_extrinsic( .checked_next_power_of_two() .map(|c| c / 2) .unwrap_or(2) as u64; - let extra: runtime::TransactionExtensions = ( - frame_system::CheckNonZeroSender::::new(), - frame_system::CheckSpecVersion::::new(), - frame_system::CheckTxVersion::::new(), - frame_system::CheckGenesis::::new(), - frame_system::CheckEra::::from(sp_runtime::generic::Era::mortal( - period, - best_block.saturated_into(), - )), - check_nonce::CheckNonce::::from(nonce), - frame_system::CheckWeight::::new(), - transaction_payment_wrapper::ChargeTransactionPaymentWrapper::new( - pallet_transaction_payment::ChargeTransactionPayment::::from(0), + let extra: runtime::TxExtension = ( + ( + frame_system::CheckNonZeroSender::::new(), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckEra::::from(sp_runtime::generic::Era::mortal( + period, + best_block.saturated_into(), + )), + check_nonce::CheckNonce::::from(nonce), + frame_system::CheckWeight::::new(), + ), + ( + transaction_payment_wrapper::ChargeTransactionPaymentWrapper::new(0), + sudo_wrapper::SudoTransactionExtension::::new(), + pallet_shield::CheckShieldedTxValidity::::new(), + pallet_subtensor::SubtensorTransactionExtension::::new(), + pallet_drand::drand_priority::DrandPriority::::new(), ), - sudo_wrapper::SudoTransactionExtension::::new(), - pallet_subtensor::SubtensorTransactionExtension::::new(), - pallet_drand::drand_priority::DrandPriority::::new(), frame_metadata_hash_extension::CheckMetadataHash::::new(true), ); @@ -148,17 +151,16 @@ pub fn create_benchmark_extrinsic( call.clone(), extra.clone(), ( - (), - runtime::VERSION.spec_version, - runtime::VERSION.transaction_version, - genesis_hash, - best_hash, - (), - (), - (), - (), - (), - (), + ( + (), + runtime::VERSION.spec_version, + runtime::VERSION.transaction_version, + genesis_hash, + best_hash, + (), + (), + ), + ((), (), (), (), ()), None, ), ); diff --git a/node/src/client.rs b/node/src/client.rs index e65683933b..94b0e90e15 100644 --- a/node/src/client.rs +++ b/node/src/client.rs @@ -16,5 +16,6 @@ pub type HostFunctions = ( frame_benchmarking::benchmarking::HostFunctions, sp_crypto_ec_utils::bls12_381::host_calls::HostFunctions, ProofSize, + stp_io::SubtensorHostFunctions, ); pub type RuntimeExecutor = WasmExecutor; diff --git a/node/src/consensus/aura_consensus.rs b/node/src/consensus/aura_consensus.rs index 16bdae6c01..ce34e8125a 100644 --- a/node/src/consensus/aura_consensus.rs +++ b/node/src/consensus/aura_consensus.rs @@ -28,7 +28,9 @@ use sp_inherents::CreateInherentDataProviders; use sp_keystore::KeystorePtr; use sp_runtime::traits::Block as BlockT; use sp_runtime::traits::NumberFor; +use stc_shield::InherentDataProvider as ShieldInherentDataProvider; use std::{error::Error, sync::Arc}; +use stp_shield::ShieldKeystorePtr; pub struct AuraConsensus; @@ -36,6 +38,7 @@ impl ConsensusMechanism for AuraConsensus { type InherentDataProviders = ( sp_consensus_aura::inherents::InherentDataProvider, sp_timestamp::InherentDataProvider, + stc_shield::InherentDataProvider, ); fn start_authoring( @@ -101,6 +104,7 @@ impl ConsensusMechanism for AuraConsensus { fn create_inherent_data_providers( slot_duration: SlotDuration, + shield_keystore: ShieldKeystorePtr, ) -> Result> { let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); let slot = @@ -108,11 +112,13 @@ impl ConsensusMechanism for AuraConsensus { *timestamp, slot_duration, ); - Ok((slot, timestamp)) + let shield = ShieldInherentDataProvider::new(shield_keystore); + Ok((slot, timestamp, shield)) } fn pending_create_inherent_data_providers( slot_duration: SlotDuration, + shield_keystore: ShieldKeystorePtr, ) -> Result> { let current = sp_timestamp::InherentDataProvider::from_system_time(); let next_slot = current @@ -125,7 +131,8 @@ impl ConsensusMechanism for AuraConsensus { *timestamp, slot_duration, ); - Ok((slot, timestamp)) + let shield = stc_shield::InherentDataProvider::new(shield_keystore); + Ok((slot, timestamp, shield)) } fn new() -> Self { diff --git a/node/src/consensus/babe_consensus.rs b/node/src/consensus/babe_consensus.rs index 490a505f4d..4f84cbb87b 100644 --- a/node/src/consensus/babe_consensus.rs +++ b/node/src/consensus/babe_consensus.rs @@ -31,7 +31,9 @@ use sp_consensus_slots::SlotDuration; use sp_inherents::CreateInherentDataProviders; use sp_keystore::KeystorePtr; use sp_runtime::traits::NumberFor; +use stc_shield::InherentDataProvider as ShieldInherentDataProvider; use std::{error::Error, sync::Arc}; +use stp_shield::ShieldKeystorePtr; pub struct BabeConsensus { babe_link: Option>, @@ -42,6 +44,7 @@ impl ConsensusMechanism for BabeConsensus { type InherentDataProviders = ( sp_consensus_babe::inherents::InherentDataProvider, sp_timestamp::InherentDataProvider, + stc_shield::InherentDataProvider, ); #[allow(clippy::expect_used)] @@ -111,6 +114,7 @@ impl ConsensusMechanism for BabeConsensus { fn create_inherent_data_providers( slot_duration: SlotDuration, + shield_keystore: ShieldKeystorePtr, ) -> Result> { let timestamp = sp_timestamp::InherentDataProvider::from_system_time(); let slot = @@ -118,11 +122,13 @@ impl ConsensusMechanism for BabeConsensus { *timestamp, slot_duration, ); - Ok((slot, timestamp)) + let shield = stc_shield::InherentDataProvider::new(shield_keystore); + Ok((slot, timestamp, shield)) } fn pending_create_inherent_data_providers( slot_duration: SlotDuration, + shield_keystore: ShieldKeystorePtr, ) -> Result> { let current = sp_timestamp::InherentDataProvider::from_system_time(); let next_slot = current @@ -135,7 +141,8 @@ impl ConsensusMechanism for BabeConsensus { *timestamp, slot_duration, ); - Ok((slot, timestamp)) + let shield = ShieldInherentDataProvider::new(shield_keystore); + Ok((slot, timestamp, shield)) } fn new() -> Self { diff --git a/node/src/consensus/consensus_mechanism.rs b/node/src/consensus/consensus_mechanism.rs index b88e2d0462..9fd8cad63b 100644 --- a/node/src/consensus/consensus_mechanism.rs +++ b/node/src/consensus/consensus_mechanism.rs @@ -24,6 +24,7 @@ use sp_keystore::KeystorePtr; use sp_runtime::traits::NumberFor; use std::sync::Arc; use std::sync::atomic::AtomicBool; +use stp_shield::ShieldKeystorePtr; use crate::client::FullClient; use crate::service::BIQ; @@ -85,11 +86,13 @@ pub trait ConsensusMechanism { /// Creates IDPs for the consensus mechanism. fn create_inherent_data_providers( slot_duration: SlotDuration, + shield_keystore: ShieldKeystorePtr, ) -> Result>; /// Creates IDPs for the consensus mechanism for pending blocks. fn pending_create_inherent_data_providers( slot_duration: SlotDuration, + shield_keystore: ShieldKeystorePtr, ) -> Result>; /// Creates the frontier consensus data provider with this mechanism. diff --git a/node/src/lib.rs b/node/src/lib.rs index ab4a409e1b..c447a07309 100644 --- a/node/src/lib.rs +++ b/node/src/lib.rs @@ -4,6 +4,5 @@ pub mod client; pub mod conditional_evm_block_import; pub mod consensus; pub mod ethereum; -pub mod mev_shield; pub mod rpc; pub mod service; diff --git a/node/src/main.rs b/node/src/main.rs index 7adffa0ae9..64f25acc67 100644 --- a/node/src/main.rs +++ b/node/src/main.rs @@ -10,7 +10,6 @@ mod command; mod conditional_evm_block_import; mod consensus; mod ethereum; -mod mev_shield; mod rpc; mod service; diff --git a/node/src/mev_shield/author.rs b/node/src/mev_shield/author.rs deleted file mode 100644 index 35f362df3d..0000000000 --- a/node/src/mev_shield/author.rs +++ /dev/null @@ -1,469 +0,0 @@ -use chacha20poly1305::{ - KeyInit, XChaCha20Poly1305, XNonce, - aead::{Aead, Payload}, -}; -use frame_system_rpc_runtime_api::AccountNonceApi; -use ml_kem::{EncodedSizeUser, KemCore, MlKem768}; -use node_subtensor_runtime as runtime; -use rand::rngs::OsRng; -use sp_api::ProvideRuntimeApi; -use sp_core::blake2_256; -use sp_runtime::{AccountId32, KeyTypeId}; -use std::sync::{Arc, Mutex}; -use subtensor_macros::freeze_struct; -use tokio::time::sleep; - -/// Parameters controlling time windows inside the slot. -#[freeze_struct("5c7ce101b36950de")] -#[derive(Clone)] -pub struct TimeParams { - pub slot_ms: u64, - pub announce_at_ms: u64, - pub decrypt_window_ms: u64, -} - -/// Holds the current/next ML‑KEM keypairs and their 32‑byte fingerprints. -#[freeze_struct("5e3c8209248282c3")] -#[derive(Clone)] -pub struct ShieldKeys { - pub current_sk: Vec, // ML‑KEM secret key bytes (encoded form) - pub current_pk: Vec, // ML‑KEM public key bytes (encoded form) - pub current_fp: [u8; 32], // blake2_256(pk) - pub next_sk: Vec, - pub next_pk: Vec, - pub next_fp: [u8; 32], -} - -impl ShieldKeys { - pub fn new() -> Self { - let (sk, pk) = MlKem768::generate(&mut OsRng); - - let sk_bytes = sk.as_bytes(); - let pk_bytes = pk.as_bytes(); - let sk_slice: &[u8] = sk_bytes.as_ref(); - let pk_slice: &[u8] = pk_bytes.as_ref(); - - let current_sk = sk_slice.to_vec(); - let current_pk = pk_slice.to_vec(); - let current_fp = blake2_256(pk_slice); - - let (nsk, npk) = MlKem768::generate(&mut OsRng); - let nsk_bytes = nsk.as_bytes(); - let npk_bytes = npk.as_bytes(); - let nsk_slice: &[u8] = nsk_bytes.as_ref(); - let npk_slice: &[u8] = npk_bytes.as_ref(); - let next_sk = nsk_slice.to_vec(); - let next_pk = npk_slice.to_vec(); - let next_fp = blake2_256(npk_slice); - - Self { - current_sk, - current_pk, - current_fp, - next_sk, - next_pk, - next_fp, - } - } - - pub fn roll_for_next_slot(&mut self) { - // Move next -> current - self.current_sk = core::mem::take(&mut self.next_sk); - self.current_pk = core::mem::take(&mut self.next_pk); - self.current_fp = self.next_fp; - - // Generate fresh next - let (nsk, npk) = MlKem768::generate(&mut OsRng); - let nsk_bytes = nsk.as_bytes(); - let npk_bytes = npk.as_bytes(); - let nsk_slice: &[u8] = nsk_bytes.as_ref(); - let npk_slice: &[u8] = npk_bytes.as_ref(); - self.next_sk = nsk_slice.to_vec(); - self.next_pk = npk_slice.to_vec(); - self.next_fp = blake2_256(npk_slice); - } -} - -impl Default for ShieldKeys { - fn default() -> Self { - Self::new() - } -} - -/// Shared context state. -#[freeze_struct("245b565abca7d403")] -#[derive(Clone)] -pub struct ShieldContext { - pub keys: Arc>, -} - -/// Derive AEAD key directly from the 32‑byte ML‑KEM shared secret. -pub fn derive_aead_key(ss: &[u8]) -> [u8; 32] { - let mut key = [0u8; 32]; - let n = ss.len().min(32); - - if let (Some(dst), Some(src)) = (key.get_mut(..n), ss.get(..n)) { - dst.copy_from_slice(src); - } - key -} - -/// Plain XChaCha20-Poly1305 decrypt helper -pub fn aead_decrypt( - key: [u8; 32], - nonce24: [u8; 24], - ciphertext: &[u8], - aad: &[u8], -) -> Option> { - let aead = XChaCha20Poly1305::new((&key).into()); - aead.decrypt( - XNonce::from_slice(&nonce24), - Payload { - msg: ciphertext, - aad, - }, - ) - .ok() -} - -const AURA_KEY_TYPE: KeyTypeId = KeyTypeId(*b"aura"); - -/// Start background tasks: -/// - per-slot ML‑KEM key rotation -/// - at ~announce_at_ms announce the next key bytes on chain, -pub fn spawn_author_tasks( - task_spawner: &sc_service::SpawnTaskHandle, - client: Arc, - pool: Arc, - keystore: sp_keystore::KeystorePtr, - timing: TimeParams, -) -> ShieldContext -where - B: sp_runtime::traits::Block, - C: sc_client_api::HeaderBackend - + sc_client_api::BlockchainEvents - + ProvideRuntimeApi - + Send - + Sync - + 'static, - C::Api: AccountNonceApi, - Pool: sc_transaction_pool_api::TransactionPool + Send + Sync + 'static, - B::Extrinsic: From, -{ - let ctx = ShieldContext { - keys: Arc::new(Mutex::new(ShieldKeys::new())), - }; - - let aura_keys: Vec = keystore.sr25519_public_keys(AURA_KEY_TYPE); - - let local_aura_pub = match aura_keys.first().copied() { - Some(k) => k, - None => { - log::warn!( - target: "mev-shield", - "spawn_author_tasks: no local Aura sr25519 key in keystore; \ - this node will NOT announce MEV-Shield keys" - ); - return ctx; - } - }; - - let aura_account: AccountId32 = local_aura_pub.into(); - let ctx_clone = ctx.clone(); - let client_clone = client.clone(); - let pool_clone = pool.clone(); - let keystore_clone = keystore.clone(); - - // Slot tick / key-announce loop. - task_spawner.spawn( - "mev-shield-keys-and-announce", - None, - async move { - use futures::StreamExt; - use sp_consensus::BlockOrigin; - - let slot_ms = timing.slot_ms; - - // Clamp announce_at_ms so it never exceeds slot_ms. - let mut announce_at_ms = timing.announce_at_ms; - if announce_at_ms > slot_ms { - log::warn!( - target: "mev-shield", - "spawn_author_tasks: announce_at_ms ({announce_at_ms}) > slot_ms ({slot_ms}); clamping to slot_ms", - ); - announce_at_ms = slot_ms; - } - let tail_ms = slot_ms.saturating_sub(announce_at_ms); - - log::debug!( - target: "mev-shield", - "author timing: slot_ms={slot_ms} announce_at_ms={announce_at_ms} (effective) tail_ms={tail_ms}", - ); - - let mut import_stream = client_clone.import_notification_stream(); - - while let Some(notif) = import_stream.next().await { - // Only act on blocks that this node authored. - if notif.origin != BlockOrigin::Own { - continue; - } - - let (curr_pk_len, next_pk_len) = match ctx_clone.keys.lock() { - Ok(k) => (k.current_pk.len(), k.next_pk.len()), - Err(e) => { - log::debug!( - target: "mev-shield", - "spawn_author_tasks: failed to lock ShieldKeys (poisoned?): {e:?}", - ); - continue; - } - }; - - log::debug!( - target: "mev-shield", - "Slot start (local author): (pk sizes: curr={curr_pk_len}B, next={next_pk_len}B)", - ); - - // Wait until the announce window in this slot. - if announce_at_ms > 0 { - sleep(std::time::Duration::from_millis(announce_at_ms)).await; - } - - // Read the next key we intend to use for the following block. - let next_pk = match ctx_clone.keys.lock() { - Ok(k) => k.next_pk.clone(), - Err(e) => { - log::debug!( - target: "mev-shield", - "spawn_author_tasks: failed to lock ShieldKeys for next_pk: {e:?}", - ); - continue; - } - }; - - // 🔑 Fetch the current on-chain nonce for the Aura account using the best block hash. - let best_hash = client_clone.info().best_hash; - - let nonce: u32 = match client_clone - .runtime_api() - .account_nonce(best_hash, aura_account.clone()) - { - Ok(n) => n, - Err(e) => { - log::debug!( - target: "mev-shield", - "spawn_author_tasks: failed to fetch account nonce for MEV-Shield author: {e:?}", - ); - continue; - } - }; - - // Submit announce_next_key signed with the Aura key using the correct nonce. - if let Err(e) = submit_announce_extrinsic::( - client_clone.clone(), - pool_clone.clone(), - keystore_clone.clone(), - local_aura_pub, - next_pk.clone(), - nonce, - ) - .await - { - log::debug!( - target: "mev-shield", - "announce_next_key submit error (nonce={nonce:?}): {e:?}" - ); - } - - // Sleep the remainder of the slot (if any). - if tail_ms > 0 { - sleep(std::time::Duration::from_millis(tail_ms)).await; - } - - // Roll keys for the next block. - match ctx_clone.keys.lock() { - Ok(mut k) => { - k.roll_for_next_slot(); - log::debug!( - target: "mev-shield", - "Rolled ML-KEM key at slot boundary", - ); - } - Err(e) => { - log::debug!( - target: "mev-shield", - "spawn_author_tasks: failed to lock ShieldKeys for roll_for_next_slot: {e:?}", - ); - } - } - } - }, - ); - - ctx -} - -/// Build & submit the signed `announce_next_key` extrinsic OFF-CHAIN -pub async fn submit_announce_extrinsic( - client: Arc, - pool: Arc, - keystore: sp_keystore::KeystorePtr, - aura_pub: sp_core::sr25519::Public, - next_public_key: Vec, - nonce: u32, -) -> anyhow::Result<()> -where - B: sp_runtime::traits::Block, - C: sc_client_api::HeaderBackend + sp_api::ProvideRuntimeApi + Send + Sync + 'static, - C::Api: sp_api::Core, - Pool: sc_transaction_pool_api::TransactionPool + Send + Sync + 'static, - B::Extrinsic: From, - B::Hash: AsRef<[u8]>, -{ - use node_subtensor_runtime as runtime; - use runtime::{RuntimeCall, SignedPayload, UncheckedExtrinsic}; - - use sc_transaction_pool_api::TransactionSource; - use sp_api::Core as _; - use sp_core::H256; - use sp_runtime::codec::Encode; - use sp_runtime::{ - BoundedVec, MultiSignature, - generic::Era, - traits::{ConstU32, SaturatedConversion, TransactionExtension}, - }; - - fn to_h256>(h: H) -> H256 { - let bytes = h.as_ref(); - let mut out = [0u8; 32]; - - if bytes.is_empty() { - return H256(out); - } - - let n = bytes.len().min(32); - let src_start = bytes.len().saturating_sub(n); - let dst_start = 32usize.saturating_sub(n); - - let src_slice = bytes.get(src_start..).and_then(|s| s.get(..n)); - - if let (Some(dst), Some(src)) = (out.get_mut(dst_start..32), src_slice) { - dst.copy_from_slice(src); - H256(out) - } else { - // Extremely defensive fallback. - H256([0u8; 32]) - } - } - - type MaxPk = ConstU32<2048>; - let public_key: BoundedVec = BoundedVec::try_from(next_public_key) - .map_err(|_| anyhow::anyhow!("public key too long (>2048 bytes)"))?; - - // 1) Runtime call carrying the public key bytes. - let call = RuntimeCall::MevShield(pallet_shield::Call::announce_next_key { public_key }); - - // 2) Build the transaction extensions exactly like the runtime. - type Extra = runtime::TransactionExtensions; - - let info = client.info(); - let at_hash = info.best_hash; - let at_hash_h256: H256 = to_h256(at_hash); - let genesis_h256: H256 = to_h256(info.genesis_hash); - - const ERA_PERIOD: u64 = 12; - let current_block: u64 = info.best_number.saturated_into(); - let era = Era::mortal(ERA_PERIOD, current_block); - - let extra: Extra = ( - frame_system::CheckNonZeroSender::::new(), - frame_system::CheckSpecVersion::::new(), - frame_system::CheckTxVersion::::new(), - frame_system::CheckGenesis::::new(), - frame_system::CheckEra::::from(era), - node_subtensor_runtime::check_nonce::CheckNonce::::from(nonce).into(), - frame_system::CheckWeight::::new(), - node_subtensor_runtime::transaction_payment_wrapper::ChargeTransactionPaymentWrapper::< - runtime::Runtime, - >::new(pallet_transaction_payment::ChargeTransactionPayment::< - runtime::Runtime, - >::from(0u64)), - node_subtensor_runtime::sudo_wrapper::SudoTransactionExtension::::new(), - pallet_subtensor::SubtensorTransactionExtension::::new(), - pallet_drand::drand_priority::DrandPriority::::new(), - frame_metadata_hash_extension::CheckMetadataHash::::new(false), - ); - - // 3) Manually construct the `Implicit` tuple that the runtime will also derive. - type Implicit = >::Implicit; - - // Try to get the *current* runtime version from on-chain WASM; if that fails, - // fall back to the compiled runtime::VERSION. - let (spec_version, tx_version) = match client.runtime_api().version(at_hash) { - Ok(v) => (v.spec_version, v.transaction_version), - Err(e) => { - log::debug!( - target: "mev-shield", - "runtime_api::version failed at_hash={at_hash:?}: {e:?}; \ - falling back to compiled runtime::VERSION", - ); - ( - runtime::VERSION.spec_version, - runtime::VERSION.transaction_version, - ) - } - }; - - let implicit: Implicit = ( - (), // CheckNonZeroSender - spec_version, // dynamic or fallback spec_version - tx_version, // dynamic or fallback transaction_version - genesis_h256, // CheckGenesis::Implicit = Hash - at_hash_h256, // CheckEra::Implicit = hash of the block the tx is created at - (), // CheckNonce::Implicit = () - (), // CheckWeight::Implicit = () - (), // ChargeTransactionPaymentWrapper::Implicit = () - (), // SudoTransactionExtension::Implicit = () - (), // SubtensorTransactionExtension::Implicit = () - (), // DrandPriority::Implicit = () - None, // CheckMetadataHash::Implicit = Option<[u8; 32]> - ); - - // 4) Build the exact signable payload from call + extra + implicit. - let payload: SignedPayload = SignedPayload::from_raw(call.clone(), extra.clone(), implicit); - - // 5) Sign with the local Aura key using the same SCALE bytes the runtime expects. - let sig_opt = payload - .using_encoded(|bytes| keystore.sr25519_sign(AURA_KEY_TYPE, &aura_pub, bytes)) - .map_err(|e| anyhow::anyhow!("keystore sr25519_sign error: {e:?}"))?; - - let sig = sig_opt - .ok_or_else(|| anyhow::anyhow!("keystore sr25519_sign returned None for Aura key"))?; - - let signature: MultiSignature = sig.into(); - - // 6) Sender address = AccountId32 derived from the Aura sr25519 public key. - let who: AccountId32 = aura_pub.into(); - let address = sp_runtime::MultiAddress::Id(who); - - // 7) Assemble the signed extrinsic and submit it to the pool. - let uxt: UncheckedExtrinsic = UncheckedExtrinsic::new_signed(call, address, signature, extra); - - let xt_bytes = uxt.encode(); - let xt_hash = sp_core::hashing::blake2_256(&xt_bytes); - let xt_hash_hex = hex::encode(xt_hash); - - let opaque: sp_runtime::OpaqueExtrinsic = uxt.into(); - let xt: ::Extrinsic = opaque.into(); - - pool.submit_one(at_hash, TransactionSource::Local, xt) - .await?; - - log::debug!( - target: "mev-shield", - "announce_next_key submitted: xt=0x{xt_hash_hex}, nonce={nonce:?}, \ - spec_version={spec_version}, tx_version={tx_version}, era={era:?}", - ); - - Ok(()) -} diff --git a/node/src/mev_shield/mod.rs b/node/src/mev_shield/mod.rs deleted file mode 100644 index 91817097bf..0000000000 --- a/node/src/mev_shield/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod author; -pub mod proposer; diff --git a/node/src/mev_shield/proposer.rs b/node/src/mev_shield/proposer.rs deleted file mode 100644 index a9a854e362..0000000000 --- a/node/src/mev_shield/proposer.rs +++ /dev/null @@ -1,847 +0,0 @@ -use super::author::ShieldContext; -use futures::StreamExt; -use ml_kem::kem::{Decapsulate, DecapsulationKey}; -use ml_kem::{Ciphertext, Encoded, EncodedSizeUser, MlKem768, MlKem768Params}; -use sc_service::SpawnTaskHandle; -use sc_transaction_pool_api::{TransactionPool, TransactionSource}; -use sp_core::H256; -use sp_runtime::traits::{Header, SaturatedConversion}; -use sp_runtime::{AccountId32, OpaqueExtrinsic}; -use std::{ - collections::HashMap, - sync::{Arc, Mutex}, -}; - -/// Truncate a UTF-8 string to at most `max_bytes` bytes without splitting codepoints. -fn truncate_utf8_to_bytes(s: &str, max_bytes: usize) -> String { - if s.len() <= max_bytes { - return s.to_string(); - } - - let mut end = max_bytes.min(s.len()); - - // Decrement until we find a valid UTF-8 boundary. - while end > 0 { - if let Some(prefix) = s.get(..end) { - return prefix.to_string(); - } - end = end.saturating_sub(1); - } - - // If max_bytes was 0 or we couldn't find a boundary (extremely defensive), return empty. - String::new() -} - -/// Helper to build a `mark_decryption_failed` runtime call with a bounded reason string. -fn create_failed_call(id: H256, reason: &str) -> node_subtensor_runtime::RuntimeCall { - use sp_runtime::BoundedVec; - - let reason_bytes = reason.as_bytes(); - let reason_bounded = BoundedVec::try_from(reason_bytes.to_vec()).unwrap_or_else(|_| { - // Fallback if the reason is too long for the bounded vector. - BoundedVec::try_from(b"Decryption failed".to_vec()).unwrap_or_default() - }); - - node_subtensor_runtime::RuntimeCall::MevShield(pallet_shield::Call::mark_decryption_failed { - id, - reason: reason_bounded, - }) -} - -/// Buffer of wrappers keyed by the block number in which they were included. -#[derive(Default, Clone)] -struct WrapperBuffer { - by_id: HashMap< - H256, - ( - Vec, // ciphertext blob - u64, // originating block number - AccountId32, // wrapper author - ), - >, -} - -impl WrapperBuffer { - fn upsert(&mut self, id: H256, block_number: u64, author: AccountId32, ciphertext: Vec) { - self.by_id.insert(id, (ciphertext, block_number, author)); - } - - /// Drain only wrappers whose `block_number` matches the given `block`. - /// - Wrappers with `block_number > block` are kept for future decrypt passes. - /// - Wrappers with `block_number < block` are considered stale and dropped, and - /// we emit `mark_decryption_failed` calls for them so they are visible on-chain. - fn drain_for_block( - &mut self, - block: u64, - failed_calls: &mut Vec<(H256, node_subtensor_runtime::RuntimeCall)>, - ) -> Vec<(H256, u64, sp_runtime::AccountId32, Vec)> { - let mut ready = Vec::new(); - let mut kept_future: usize = 0; - let mut dropped_past: usize = 0; - - self.by_id.retain(|id, (ct, block_number, who)| { - if *block_number == block { - // Ready to process now; remove from buffer. - ready.push((*id, *block_number, who.clone(), ct.clone())); - false - } else if *block_number > block { - // Not yet reveal time; keep for future blocks. - kept_future = kept_future.saturating_add(1); - true - } else { - // block_number < block => stale / missed decrypt opportunity; drop and mark failed. - dropped_past = dropped_past.saturating_add(1); - log::debug!( - target: "mev-shield", - "revealer: dropping stale wrapper id=0x{} block_number={} < block={}", - hex::encode(id.as_bytes()), - *block_number, - block - ); - - // Mark decryption failed on-chain so clients can observe the missed wrapper. - failed_calls.push(( - *id, - create_failed_call( - *id, - "missed decrypt window (wrapper submitted in an earlier block)", - ), - )); - - false - } - }); - - log::debug!( - target: "mev-shield", - "revealer: drain_for_block(block={}): ready={}, kept_future={}, dropped_past={}", - block, - ready.len(), - kept_future, - dropped_past - ); - - ready - } -} - -/// Start a background worker that: -/// • watches imported blocks and captures `MevShield::submit_encrypted` -/// • buffers those wrappers per originating block, -/// • on each **locally authored** block: decrypt & submit wrappers for that block. -/// -pub fn spawn_revealer( - task_spawner: &SpawnTaskHandle, - client: Arc, - pool: Arc, - ctx: ShieldContext, -) where - B: sp_runtime::traits::Block, - C: sc_client_api::HeaderBackend - + sc_client_api::BlockchainEvents - + sc_client_api::BlockBackend - + Send - + Sync - + 'static, - Pool: TransactionPool + Send + Sync + 'static, -{ - use codec::{Decode, Encode}; - - type Address = sp_runtime::MultiAddress; - type RUnchecked = node_subtensor_runtime::UncheckedExtrinsic; - - let buffer: Arc> = Arc::new(Mutex::new(WrapperBuffer::default())); - - { - let client = Arc::clone(&client); - let pool = Arc::clone(&pool); - let buffer = Arc::clone(&buffer); - let ctx = ctx.clone(); - - task_spawner.spawn( - "mev-shield-block-revealer", - None, - async move { - log::debug!(target: "mev-shield", "Revealer task started"); - let mut import_stream = client.import_notification_stream(); - - while let Some(notif) = import_stream.next().await { - - let at_hash = notif.hash; - let block_number_u64: u64 = (*notif.header.number()).saturated_into(); - - log::debug!( - target: "mev-shield", - "imported block hash={:?} number={} origin={:?}", - at_hash, - block_number_u64, - notif.origin - ); - - // ── 1) buffer wrappers from this (locally authored) block ─────────── - match client.block_body(at_hash) { - Ok(Some(body)) => { - log::debug!( - target: "mev-shield", - " block has {} extrinsics", - body.len() - ); - - for (idx, opaque_xt) in body.into_iter().enumerate() { - let encoded = opaque_xt.encode(); - log::debug!( - target: "mev-shield", - " [xt #{idx}] opaque len={} bytes", - encoded.len() - ); - - let uxt: RUnchecked = match RUnchecked::decode(&mut &encoded[..]) { - Ok(u) => u, - Err(e) => { - log::debug!( - target: "mev-shield", - " [xt #{idx}] failed to decode UncheckedExtrinsic: {e:?}", - ); - continue; - } - }; - - log::debug!( - target: "mev-shield", - " [xt #{idx}] decoded call: {:?}", - &uxt.0.function - ); - - let author_opt: Option = - match &uxt.0.preamble { - sp_runtime::generic::Preamble::Signed( - addr, - _sig, - _ext, - ) => match addr.clone() { - Address::Id(acc) => Some(acc), - Address::Address32(bytes) => { - Some(sp_runtime::AccountId32::new(bytes)) - } - _ => None, - }, - _ => None, - }; - - let Some(author) = author_opt else { - log::debug!( - target: "mev-shield", - " [xt #{idx}] not a Signed(AccountId32) extrinsic; skipping" - ); - continue; - }; - - if let node_subtensor_runtime::RuntimeCall::MevShield( - pallet_shield::Call::submit_encrypted { - commitment, - ciphertext, - }, - ) = &uxt.0.function - { - let payload = - (author.clone(), *commitment, ciphertext).encode(); - let id = H256(sp_core::hashing::blake2_256(&payload)); - - log::debug!( - target: "mev-shield", - " [xt #{idx}] buffered submit_encrypted: id=0x{}, block_number={}, author={}, ct_len={}, commitment={:?}", - hex::encode(id.as_bytes()), - block_number_u64, - author, - ciphertext.len(), - commitment - ); - - if let Ok(mut buf) = buffer.lock() { - buf.upsert( - id, - block_number_u64, - author, - ciphertext.to_vec(), - ); - } else { - log::debug!( - target: "mev-shield", - " [xt #{idx}] failed to lock WrapperBuffer; dropping wrapper" - ); - } - } - } - } - Ok(None) => log::debug!( - target: "mev-shield", - " block_body returned None for hash={at_hash:?}", - ), - Err(e) => log::debug!( - target: "mev-shield", - " block_body error for hash={at_hash:?}: {e:?}", - ), - } - - // ── 2) snapshot current ML‑KEM secret for this block ──────────────── - let snapshot_opt = match ctx.keys.lock() { - Ok(k) => { - let sk_hash = sp_core::hashing::blake2_256(&k.current_sk); - Some(( - k.current_sk.clone(), - k.current_pk.len(), - k.next_pk.len(), - sk_hash, - )) - } - Err(e) => { - log::debug!( - target: "mev-shield", - "revealer: failed to lock ShieldKeys (poisoned?): {e:?}", - ); - None - } - }; - - let (curr_sk_bytes, curr_pk_len, next_pk_len, sk_hash) = match snapshot_opt { - Some(v) => v, - None => { - log::debug!( - target: "mev-shield", - "revealer: Cannot snapshot key for this block", - ); - continue; - } - }; - - // Use this block as the reveal block. - let curr_block: u64 = block_number_u64; - - log::debug!( - target: "mev-shield", - "revealer: decrypt for block {}. sk_len={} sk_hash=0x{} curr_pk_len={} next_pk_len={}", - curr_block, - curr_sk_bytes.len(), - hex::encode(sk_hash), - curr_pk_len, - next_pk_len - ); - - // ── 3) drain & decrypt wrappers for this block ───────────────────── - let mut to_submit: Vec<(H256, node_subtensor_runtime::UncheckedExtrinsic)> = - Vec::new(); - let mut failed_calls: Vec<(H256, node_subtensor_runtime::RuntimeCall)> = - Vec::new(); - - // Only process wrappers whose originating block matches this block. - let drained: Vec<(H256, u64, sp_runtime::AccountId32, Vec)> = - match buffer.lock() { - Ok(mut buf) => buf.drain_for_block(curr_block, &mut failed_calls), - Err(e) => { - log::debug!( - target: "mev-shield", - "revealer: failed to lock WrapperBuffer for drain_for_block: {e:?}", - ); - Vec::new() - } - }; - - log::debug!( - target: "mev-shield", - "revealer: drained {} buffered wrappers for block={}", - drained.len(), - curr_block - ); - - for (id, block_number, author, blob) in drained.into_iter() { - log::debug!( - target: "mev-shield", - "revealer: candidate id=0x{} submitted_in={} (block={}) author={} blob_len={}", - hex::encode(id.as_bytes()), - block_number, - curr_block, - author, - blob.len() - ); - - // Safely parse blob: [u16 kem_len][kem_ct][nonce24][aead_ct] - if blob.len() < 2 { - let error_message = "blob too short to contain kem_len"; - log::debug!( - target: "mev-shield", - " id=0x{}: {}", - hex::encode(id.as_bytes()), - error_message - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - - let mut cursor: usize = 0; - - // 1) kem_len (u16 LE) - let kem_len_end = match cursor.checked_add(2usize) { - Some(e) => e, - None => { - let error_message = "kem_len range overflow"; - log::debug!( - target: "mev-shield", - " id=0x{}: {}", - hex::encode(id.as_bytes()), - error_message - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - - let kem_len_slice = match blob.get(cursor..kem_len_end) { - Some(s) => s, - None => { - let error_message = "blob too short for kem_len bytes"; - log::debug!( - target: "mev-shield", - " id=0x{}: {} (cursor={} end={})", - hex::encode(id.as_bytes()), - error_message, - cursor, - kem_len_end - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - - let kem_len_bytes: [u8; 2] = match kem_len_slice.try_into() { - Ok(arr) => arr, - Err(_) => { - let error_message = "kem_len slice not 2 bytes"; - log::debug!( - target: "mev-shield", - " id=0x{}: {}", - hex::encode(id.as_bytes()), - error_message - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - - let kem_len = u16::from_le_bytes(kem_len_bytes) as usize; - cursor = kem_len_end; - - // 2) KEM ciphertext - let kem_ct_end = match cursor.checked_add(kem_len) { - Some(e) => e, - None => { - let error_message = "kem_ct range overflow"; - log::debug!( - target: "mev-shield", - " id=0x{}: {} (cursor={} kem_len={})", - hex::encode(id.as_bytes()), - error_message, - cursor, - kem_len - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - - let kem_ct_bytes = match blob.get(cursor..kem_ct_end) { - Some(s) => s, - None => { - let error_message = "blob too short for kem_ct"; - log::debug!( - target: "mev-shield", - " id=0x{}: {} (cursor={} end={})", - hex::encode(id.as_bytes()), - error_message, - cursor, - kem_ct_end - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - cursor = kem_ct_end; - - // 3) Nonce (24 bytes) - const NONCE_LEN: usize = 24; - let nonce_end = match cursor.checked_add(NONCE_LEN) { - Some(e) => e, - None => { - let error_message = "nonce range overflow"; - log::debug!( - target: "mev-shield", - " id=0x{}: {} (cursor={})", - hex::encode(id.as_bytes()), - error_message, - cursor - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - - let nonce_bytes = match blob.get(cursor..nonce_end) { - Some(s) => s, - None => { - let error_message = "blob too short for nonce24"; - log::debug!( - target: "mev-shield", - " id=0x{}: {} (cursor={} end={})", - hex::encode(id.as_bytes()), - error_message, - cursor, - nonce_end - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - cursor = nonce_end; - - // 4) AEAD body (rest) - let aead_body = match blob.get(cursor..) { - Some(s) => s, - None => { - let error_message = "blob too short for aead_body"; - log::debug!( - target: "mev-shield", - " id=0x{}: {} (cursor={})", - hex::encode(id.as_bytes()), - error_message, - cursor - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - - let kem_ct_hash = sp_core::hashing::blake2_256(kem_ct_bytes); - let aead_body_hash = sp_core::hashing::blake2_256(aead_body); - - log::debug!( - target: "mev-shield", - " id=0x{}: kem_len={} kem_ct_hash=0x{} nonce=0x{} aead_body_len={} aead_body_hash=0x{}", - hex::encode(id.as_bytes()), - kem_len, - hex::encode(kem_ct_hash), - hex::encode(nonce_bytes), - aead_body.len(), - hex::encode(aead_body_hash), - ); - - // Rebuild DecapsulationKey and decapsulate. - let enc_sk = - match Encoded::>::try_from( - &curr_sk_bytes[..], - ) { - Ok(e) => e, - Err(e) => { - let error_message = "DecapsulationKey::try_from failed"; - log::debug!( - target: "mev-shield", - " id=0x{}: {} (len={}, err={:?})", - hex::encode(id.as_bytes()), - error_message, - curr_sk_bytes.len(), - e - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - let sk = DecapsulationKey::::from_bytes(&enc_sk); - - let ct = match Ciphertext::::try_from(kem_ct_bytes) { - Ok(c) => c, - Err(e) => { - let error_message = "Ciphertext::try_from failed"; - log::debug!( - target: "mev-shield", - " id=0x{}: {}: {:?}", - hex::encode(id.as_bytes()), - error_message, - e - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - - let ss = match sk.decapsulate(&ct) { - Ok(s) => s, - Err(_) => { - let error_message = "ML-KEM decapsulate failed"; - log::debug!( - target: "mev-shield", - " id=0x{}: {}", - hex::encode(id.as_bytes()), - error_message - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - - let ss_bytes: &[u8] = ss.as_ref(); - if ss_bytes.len() != 32 { - let error_message = "shared secret length != 32"; - log::debug!( - target: "mev-shield", - " id=0x{}: {} (len={})", - hex::encode(id.as_bytes()), - error_message, - ss_bytes.len() - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - let mut ss32 = [0u8; 32]; - ss32.copy_from_slice(ss_bytes); - - let ss_hash = sp_core::hashing::blake2_256(&ss32); - let aead_key = crate::mev_shield::author::derive_aead_key(&ss32); - let key_hash_dbg = sp_core::hashing::blake2_256(&aead_key); - - log::debug!( - target: "mev-shield", - " id=0x{}: decapsulated shared_secret_len=32 shared_secret_hash=0x{}", - hex::encode(id.as_bytes()), - hex::encode(ss_hash) - ); - log::debug!( - target: "mev-shield", - " id=0x{}: derived AEAD key hash=0x{} (direct-from-ss)", - hex::encode(id.as_bytes()), - hex::encode(key_hash_dbg) - ); - - let mut nonce24 = [0u8; 24]; - nonce24.copy_from_slice(nonce_bytes); - - log::debug!( - target: "mev-shield", - " id=0x{}: attempting AEAD decrypt nonce=0x{} ct_len={}", - hex::encode(id.as_bytes()), - hex::encode(nonce24), - aead_body.len() - ); - - let plaintext = match crate::mev_shield::author::aead_decrypt( - aead_key, - nonce24, - aead_body, - &[], - ) { - Some(pt) => pt, - None => { - let error_message = "AEAD decrypt failed"; - log::debug!( - target: "mev-shield", - " id=0x{}: {}; ct_hash=0x{}", - hex::encode(id.as_bytes()), - error_message, - hex::encode(aead_body_hash), - ); - //failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - - log::debug!( - target: "mev-shield", - " id=0x{}: AEAD decrypt OK, plaintext_len={}", - hex::encode(id.as_bytes()), - plaintext.len() - ); - - if plaintext.is_empty() { - let error_message = "plaintext too short"; - log::debug!( - target: "mev-shield", - " id=0x{}: {} (len={}, min={})", - hex::encode(id.as_bytes()), - error_message, - plaintext.len(), - 1 - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - - let signed_extrinsic_bytes = match plaintext.get(0..plaintext.len()) { - Some(s) if !s.is_empty() => s, - _ => { - let error_message = "missing signed extrinsic bytes"; - log::debug!( - target: "mev-shield", - " id=0x{}: {}", - hex::encode(id.as_bytes()), - error_message - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - - let signed_extrinsic: node_subtensor_runtime::UncheckedExtrinsic = - match Decode::decode(&mut &signed_extrinsic_bytes[..]) { - Ok(c) => c, - Err(e) => { - let error_message = "failed to decode UncheckedExtrinsic"; - log::debug!( - target: "mev-shield", - " id=0x{}: {} (len={}): {:?}", - hex::encode(id.as_bytes()), - error_message, - signed_extrinsic_bytes.len(), - e - ); - failed_calls.push((id, create_failed_call(id, error_message))); - continue; - } - }; - - to_submit.push((id, signed_extrinsic)); - } - - // ── 4) submit decrypted extrinsics to pool ────────────────────────── - let at = client.info().best_hash; - log::debug!( - target: "mev-shield", - "revealer: submitting {} extrinsics to pool at best_hash={:?}", - to_submit.len(), - at - ); - - for (id, uxt) in to_submit.into_iter() { - let xt_bytes = uxt.encode(); - - log::debug!( - target: "mev-shield", - " id=0x{}: encoded UncheckedExtrinsic len={}", - hex::encode(id.as_bytes()), - xt_bytes.len() - ); - - match OpaqueExtrinsic::from_bytes(&xt_bytes) { - Ok(opaque) => { - match pool - .submit_one(at, TransactionSource::External, opaque) - .await - { - Ok(_) => { - let xt_hash = - sp_core::hashing::blake2_256(&xt_bytes); - log::debug!( - target: "mev-shield", - " id=0x{}: submit_one(...) OK, xt_hash=0x{}", - hex::encode(id.as_bytes()), - hex::encode(xt_hash) - ); - } - Err(e) => { - // Emit an on-chain failure event even when the *inner* - // transaction fails pre-dispatch validation in the pool. - let err_dbg = format!("{e:?}"); - let reason = truncate_utf8_to_bytes( - &format!( - "inner extrinsic rejected by tx-pool (pre-dispatch): {err_dbg}" - ), - 240, - ); - log::debug!( - target: "mev-shield", - " id=0x{}: submit_one(...) FAILED (will mark_decryption_failed): {:?}", - hex::encode(id.as_bytes()), - e - ); - failed_calls.push((id, create_failed_call(id, &reason))); - } - } - } - Err(e) => { - let err_dbg = format!("{e:?}"); - let reason = truncate_utf8_to_bytes( - &format!( - "invalid decrypted extrinsic bytes (OpaqueExtrinsic::from_bytes): {err_dbg}" - ), - 240, - ); - log::debug!( - target: "mev-shield", - " id=0x{}: OpaqueExtrinsic::from_bytes failed (will mark_decryption_failed): {:?}", - hex::encode(id.as_bytes()), - e - ); - failed_calls.push((id, create_failed_call(id, &reason))); - } - } - } - - // ── 5) submit decryption-failed markers ───────────────────────────── - if !failed_calls.is_empty() { - log::debug!( - target: "mev-shield", - "revealer: submitting {} mark_decryption_failed calls at best_hash={:?}", - failed_calls.len(), - at - ); - - for (id, call) in failed_calls.into_iter() { - let uxt: node_subtensor_runtime::UncheckedExtrinsic = - node_subtensor_runtime::UncheckedExtrinsic::new_bare(call); - let xt_bytes = uxt.encode(); - - log::debug!( - target: "mev-shield", - " id=0x{}: encoded mark_decryption_failed UncheckedExtrinsic len={}", - hex::encode(id.as_bytes()), - xt_bytes.len() - ); - - match OpaqueExtrinsic::from_bytes(&xt_bytes) { - Ok(opaque) => { - match pool - .submit_one(at, TransactionSource::Local, opaque) - .await - { - Ok(_) => { - let xt_hash = - sp_core::hashing::blake2_256(&xt_bytes); - log::debug!( - target: "mev-shield", - " id=0x{}: submit_one(mark_decryption_failed) OK, xt_hash=0x{}", - hex::encode(id.as_bytes()), - hex::encode(xt_hash) - ); - } - Err(e) => { - log::warn!( - target: "mev-shield", - " id=0x{}: submit_one(mark_decryption_failed) FAILED: {:?}", - hex::encode(id.as_bytes()), - e - ); - } - } - } - Err(e) => { - log::warn!( - target: "mev-shield", - " id=0x{}: OpaqueExtrinsic::from_bytes(mark_decryption_failed) failed: {:?}", - hex::encode(id.as_bytes()), - e - ); - } - } - } - } - } - }, - ); - } -} diff --git a/node/src/service.rs b/node/src/service.rs index 7b2ee0e75f..f33931d210 100644 --- a/node/src/service.rs +++ b/node/src/service.rs @@ -21,11 +21,13 @@ use sp_core::crypto::KeyTypeId; use sp_keystore::Keystore; use sp_runtime::key_types; use sp_runtime::traits::{Block as BlockT, NumberFor}; +use stc_shield::{self, MemoryShieldKeystore}; use std::collections::HashSet; use std::str::FromStr; use std::sync::atomic::AtomicBool; use std::{cell::RefCell, path::Path}; use std::{sync::Arc, time::Duration}; +use stp_shield::ShieldKeystorePtr; use substrate_prometheus_endpoint::Registry; use crate::cli::Sealing; @@ -34,7 +36,6 @@ use crate::ethereum::{ BackendType, EthConfiguration, FrontierBackend, FrontierPartialComponents, StorageOverride, StorageOverrideHandler, db_config_dir, new_frontier_partial, spawn_frontier_tasks, }; -use crate::mev_shield::{author, proposer}; const LOG_TARGET: &str = "node-service"; @@ -452,9 +453,12 @@ where prometheus_registry.clone(), )); + let shield_keystore = Arc::new(MemoryShieldKeystore::new()); let slot_duration = consensus_mechanism.slot_duration(&client)?; - let pending_create_inherent_data_providers = - move |_, ()| async move { CM::pending_create_inherent_data_providers(slot_duration) }; + let pending_create_inherent_data_providers = move |_, ()| { + let keystore = shield_keystore.clone(); + async move { CM::pending_create_inherent_data_providers(slot_duration, keystore) } + }; let rpc_methods = consensus_mechanism.rpc_methods( client.clone(), @@ -483,7 +487,8 @@ where fee_history_cache_limit, execute_gas_limit_multiplier, forced_parent_hashes: None, - pending_create_inherent_data_providers, + pending_create_inherent_data_providers: pending_create_inherent_data_providers + .clone(), }; let deps = crate::rpc::FullDeps { client: client.clone(), @@ -535,49 +540,9 @@ where ) .await; - // ==== MEV-SHIELD HOOKS ==== - let mut mev_timing: Option = None; - if role.is_authority() { - let slot_duration = consensus_mechanism.slot_duration(&client)?; - let slot_duration_ms: u64 = u64::try_from(slot_duration.as_millis()).unwrap_or(u64::MAX); - - // For 12s blocks: announce ≈ 7s, decrypt window ≈ 3s. - // For 250ms blocks: announce ≈ 145ms, decrypt window ≈ 62ms, etc. - let announce_at_ms_raw = slot_duration_ms.saturating_mul(7).saturating_div(12); - - let decrypt_window_ms = slot_duration_ms.saturating_mul(3).saturating_div(12); - - // Ensure announce_at_ms + decrypt_window_ms never exceeds slot_ms. - let max_announce = slot_duration_ms.saturating_sub(decrypt_window_ms); - let announce_at_ms = announce_at_ms_raw.min(max_announce); - - let timing = author::TimeParams { - slot_ms: slot_duration_ms, - announce_at_ms, - decrypt_window_ms, - }; - mev_timing = Some(timing.clone()); - - // Start author-side tasks with dynamic timing. - let mev_ctx = author::spawn_author_tasks::( - &task_manager.spawn_handle(), - client.clone(), - transaction_pool.clone(), - keystore_container.keystore(), - timing.clone(), - ); - - // Start last-portion-of-slot revealer (decrypt -> submit_one). - proposer::spawn_revealer::( - &task_manager.spawn_handle(), - client.clone(), - transaction_pool.clone(), - mev_ctx.clone(), - ); - } + let shield_keystore = Arc::new(MemoryShieldKeystore::new()); - if role.is_authority() { // manual-seal authorship if let Some(sealing) = sealing { run_manual_seal_authorship( @@ -590,43 +555,34 @@ where prometheus_registry.as_ref(), telemetry.as_ref(), commands_stream, + shield_keystore.clone(), )?; log::info!("Manual Seal Ready"); return Ok(task_manager); } + stc_shield::spawn_key_rotation_on_own_import( + &task_manager.spawn_handle(), + client.clone(), + shield_keystore.clone(), + ); + let proposer_factory = sc_basic_authorship::ProposerFactory::new( task_manager.spawn_handle(), client.clone(), transaction_pool.clone(), prometheus_registry.as_ref(), telemetry.as_ref().map(|x| x.handle()), + shield_keystore.clone(), ); let slot_duration = consensus_mechanism.slot_duration(&client)?; - let start_fraction: f32 = { - let (slot_ms, decrypt_ms) = mev_timing - .as_ref() - .map(|t| (t.slot_ms, t.decrypt_window_ms)) - .unwrap_or((slot_duration.as_millis(), 3_000)); - - let guard_ms: u64 = 200; // small cushion so reveals hit the pool first - let after_decrypt_ms = slot_ms.saturating_sub(decrypt_ms).saturating_add(guard_ms); - - let f_raw = if slot_ms > 0 { - (after_decrypt_ms as f32) / (slot_ms as f32) - } else { - // Extremely defensive fallback; should never happen in practice. - 0.75 - }; - - f_raw.clamp(0.50, 0.98) + let create_inherent_data_providers = move |_, ()| { + let keystore = shield_keystore.clone(); + async move { CM::create_inherent_data_providers(slot_duration, keystore) } }; - let create_inherent_data_providers = - move |_, ()| async move { CM::create_inherent_data_providers(slot_duration) }; - consensus_mechanism.start_authoring( &mut task_manager, crate::consensus::StartAuthoringParams { @@ -641,7 +597,7 @@ where force_authoring, backoff_authoring_blocks, keystore: keystore_container.keystore(), - block_proposal_slot_portion: SlotProportion::new(start_fraction), + block_proposal_slot_portion: SlotProportion::new(2f32 / 3f32), max_block_proposal_slot_portion: None, telemetry: telemetry.as_ref().map(|x| x.handle()), }, @@ -766,6 +722,7 @@ fn run_manual_seal_authorship( commands_stream: mpsc::Receiver< sc_consensus_manual_seal::rpc::EngineCommand<::Hash>, >, + shield_keystore: ShieldKeystorePtr, ) -> Result<(), ServiceError> { let proposer_factory = sc_basic_authorship::ProposerFactory::new( task_manager.spawn_handle(), @@ -773,6 +730,7 @@ fn run_manual_seal_authorship( transaction_pool.clone(), prometheus_registry, telemetry.as_ref().map(|x| x.handle()), + shield_keystore, ); thread_local!(static TIMESTAMP: RefCell = const { RefCell::new(0) }); diff --git a/pallets/shield/Cargo.toml b/pallets/shield/Cargo.toml index 1a0d9ef1f5..382e5f481e 100644 --- a/pallets/shield/Cargo.toml +++ b/pallets/shield/Cargo.toml @@ -15,8 +15,10 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { workspace = true, features = ["derive", "max-encoded-len"] } scale-info = { workspace = true, features = ["derive"] } +log.workspace = true subtensor-macros.workspace = true +subtensor-runtime-common.workspace = true # FRAME core frame-support.workspace = true @@ -29,13 +31,25 @@ sp-runtime.workspace = true sp-io.workspace = true sp-std.workspace = true sp-weights.workspace = true +sp-inherents.workspace = true -# Pallets used in Config -pallet-timestamp.workspace = true -pallet-aura.workspace = true -sp-consensus-aura.workspace = true +# Subtensor primitives +stp-io.workspace = true +stp-shield.workspace = true + +# Benchmark-only (optional, activated by runtime-benchmarks feature) +pallet-aura = { workspace = true, optional = true } +sp-consensus-aura = { workspace = true, optional = true } +ml-kem = { workspace = true, optional = true } +chacha20poly1305 = { workspace = true, optional = true } +rand_chacha = { workspace = true, optional = true } [dev-dependencies] +stc-shield.workspace = true +ml-kem.workspace = true +chacha20poly1305.workspace = true +pallet-subtensor-utility.workspace = true +rand_chacha.workspace = true [features] default = ["std"] @@ -43,6 +57,7 @@ default = ["std"] std = [ "codec/std", "scale-info/std", + "log/std", "frame-support/std", "frame-system/std", "frame-benchmarking?/std", @@ -51,9 +66,17 @@ std = [ "sp-io/std", "sp-std/std", "sp-weights/std", - "pallet-timestamp/std", - "pallet-aura/std", - "sp-consensus-aura/std", + "sp-inherents/std", + "stp-io/std", + "stp-shield/std", + "pallet-aura?/std", + "sp-consensus-aura?/std", + "chacha20poly1305?/std", + "ml-kem?/std", + "rand_chacha?/std", + "pallet-subtensor-utility/std", + "stc-shield/std", + "subtensor-runtime-common/std", ] runtime-benchmarks = [ @@ -61,7 +84,12 @@ runtime-benchmarks = [ "frame-support/runtime-benchmarks", "frame-system/runtime-benchmarks", "sp-runtime/runtime-benchmarks", - "pallet-timestamp/runtime-benchmarks", + "pallet-subtensor-utility/runtime-benchmarks", + "chacha20poly1305", + "ml-kem", + "pallet-aura", + "sp-consensus-aura", + "rand_chacha", ] try-runtime = [ @@ -69,5 +97,5 @@ try-runtime = [ "frame-system/try-runtime", "sp-runtime/try-runtime", "pallet-aura/try-runtime", - "pallet-timestamp/try-runtime", + "pallet-subtensor-utility/try-runtime", ] diff --git a/pallets/shield/README.md b/pallets/shield/README.md new file mode 100644 index 0000000000..6ad5628cf1 --- /dev/null +++ b/pallets/shield/README.md @@ -0,0 +1,47 @@ +# pallet-shield + +FRAME pallet for opt-in, per-block ephemeral-key encrypted transactions (MEV shielding). + +## Overview + +Block authors rotate ML-KEM-768 key pairs every slot via a mandatory inherent. Users encrypt their extrinsics to the next block author's public key, preventing front-running and sandwich attacks. + +### Key rotation + +Each block includes an `announce_next_key` inherent that: + +1. Shifts `NextKey` into `CurrentKey` (so the previous key is still accepted during the transition). +2. Stores the current author's freshly generated public key in `AuthorKeys`. +3. Looks up the *next* author's key from `AuthorKeys` and exposes it as `NextKey`. + +### Encrypted transaction flow + +1. User reads `NextKey` from storage (ML-KEM-768 public key, 1184 bytes). +2. User encrypts a signed extrinsic with ML-KEM-768 + XChaCha20-Poly1305, producing: + + ``` + ciphertext = key_hash(16) || kem_len(2) || kem_ct || nonce(24) || aead_ct + ``` + +3. User submits `submit_encrypted(ciphertext)` signed with their account. +4. The block author decrypts and includes the inner extrinsic in the same block. + +### Transaction extension + +`CheckShieldedTxValidity` validates shielded transactions at two levels: + +- **Pool validation** — rejects malformed ciphertext (unparseable structure). +- **Block building** (`InBlock`) — additionally checks that `key_hash` matches either `CurrentKey` or `NextKey`, rejecting stale or tampered submissions. + +## Storage + +| Item | Description | +|------|-------------| +| `CurrentKey` | Previous block's `NextKey`, kept for one-block grace period | +| `NextKey` | Public key users should encrypt to | +| `AuthorKeys` | Per-authority latest announced public key | + +## Dependencies + +- [`stp-shield`](https://github.com/opentensor/polkadot-sdk) — shared types (`ShieldedTransaction`, `ShieldPublicKey`, `InherentType`) +- [`stp-io`](../../primitives/io) — host functions for ML-KEM decapsulation and AEAD decryption diff --git a/pallets/shield/src/benchmarking.rs b/pallets/shield/src/benchmarking.rs index e3890bae76..1ce1c48b99 100644 --- a/pallets/shield/src/benchmarking.rs +++ b/pallets/shield/src/benchmarking.rs @@ -2,145 +2,179 @@ use super::*; use frame_benchmarking::v2::*; use frame_support::{BoundedVec, pallet_prelude::ConstU32}; -use frame_system::{RawOrigin, pallet_prelude::BlockNumberFor}; +use frame_system::RawOrigin; use sp_core::sr25519; -use sp_runtime::{AccountId32, traits::Hash as HashT}; -use sp_std::vec; - -// /// Helper to build bounded bytes (public key) of a given length. -// fn bounded_pk(len: usize) -> BoundedVec> { -// let v = vec![7u8; len]; -// BoundedVec::>::try_from(v).expect("within bound; qed") -// } - -/// Helper to build bounded bytes (ciphertext) of a given length. -fn bounded_ct(len: usize) -> BoundedVec> { - let v = vec![0u8; len]; - BoundedVec::>::try_from(v).expect("within bound; qed") +use sp_std::{vec, vec::Vec}; + +use chacha20poly1305::{ + KeyInit, XChaCha20Poly1305, XNonce, + aead::{Aead, Payload}, +}; +use ml_kem::{ + Ciphertext, KemCore, MlKem768, MlKem768Params, + kem::{Decapsulate, DecapsulationKey, Encapsulate}, +}; +use rand_chacha::{ChaCha20Rng, rand_core::SeedableRng}; +use stp_shield::ShieldedTransaction; + +use codec::Encode; +use sp_consensus_aura::AURA_ENGINE_ID; +use sp_core::crypto::KeyTypeId; +use sp_io::crypto::sr25519_generate; + +/// Seed Aura authorities from sr25519 public keys. +fn seed_aura_authorities(pubkeys: &[sr25519::Public]) +where + T: pallet::Config + pallet_aura::Config, + ::AuthorityId: From, +{ + pallet_aura::Authorities::::mutate(|auths| { + for pk in pubkeys { + let auth_id: ::AuthorityId = (*pk).into(); + let _ = auths.try_push(auth_id); + } + }); } -// /// Seed Aura authorities so `EnsureAuraAuthority` passes for a given sr25519 pubkey. -// /// -// /// We avoid requiring `ByteArray` on `AuthorityId` by relying on: -// /// `::AuthorityId: From`. -// fn seed_aura_authority_from_sr25519(pubkey: &sr25519::Public) -// where -// T: pallet::Config + pallet_aura::Config, -// ::AuthorityId: From, -// { -// let auth_id: ::AuthorityId = (*pubkey).into(); -// pallet_aura::Authorities::::mutate(|auths| { -// let _ = auths.try_push(auth_id); -// }); -// } +/// Deposit an Aura pre-runtime digest for the given slot. +fn deposit_slot_digest(slot: u64) { + frame_system::Pallet::::deposit_log(sp_runtime::DigestItem::PreRuntime( + AURA_ENGINE_ID, + slot.encode(), + )); +} + +/// Build a real max-size encrypted ciphertext (8192 bytes wire format). +/// +/// Returns `(wire_ciphertext, dec_key)` so the benchmark can measure decryption. +fn build_max_encrypted_payload() -> (Vec, DecapsulationKey) { + let mut rng = ChaCha20Rng::from_seed([42u8; 32]); + let (dec_key, enc_key) = MlKem768::generate(&mut rng); + let (kem_ct, shared_secret) = enc_key.encapsulate(&mut rng).unwrap(); + + // Wire overhead: key_hash(16) + kem_ct_len(2) + kem_ct(1088) + nonce(24) = 1130. + // Max aead_ct = 8192 − 1130 = 7062. + // Poly1305 tag = 16 bytes ⇒ max plaintext = 7046. + let plaintext = vec![0x42u8; 7046]; + + let nonce = [0u8; 24]; + let cipher = XChaCha20Poly1305::new(shared_secret.as_slice().into()); + let aead_ct = cipher + .encrypt( + XNonce::from_slice(&nonce), + Payload { + msg: &plaintext, + aad: &[], + }, + ) + .expect("AEAD encryption must succeed in benchmark setup"); + + let kem_ct_bytes = kem_ct.as_slice(); + let key_hash = [0u8; 16]; + + let mut wire = Vec::with_capacity(8192); + wire.extend_from_slice(&key_hash); + wire.extend_from_slice(&(kem_ct_bytes.len() as u16).to_le_bytes()); + wire.extend_from_slice(kem_ct_bytes); + wire.extend_from_slice(&nonce); + wire.extend_from_slice(&aead_ct); + + debug_assert_eq!(wire.len(), 8192); + + (wire, dec_key) +} #[benchmarks( where - // Needed to build a concrete inner call and convert into T::RuntimeCall. - ::RuntimeCall: From>, - // Needed so we can seed Authorities from a dev sr25519 pubkey. + T: pallet_aura::Config, ::AuthorityId: From, - ::AccountId: From + Into, - ::RuntimeOrigin: From> + ::AuthorityId: From, )] mod benches { use super::*; - // We use the custom value for announce_next_key to charge a higher fee, not the benchmark result. - // /// Benchmark `announce_next_key`. - // #[benchmark] - // fn announce_next_key() { - // // Generate a deterministic dev key in the host keystore (for benchmarks). - // // Any 4-byte KeyTypeId works for generation; it does not affect AccountId derivation. - // const KT: KeyTypeId = KeyTypeId(*b"benc"); - // let alice_pub: sr25519::Public = sr25519_generate(KT, Some("//Alice".as_bytes().to_vec())); - // let alice_acc: AccountId32 = alice_pub.into(); - - // // Make this account an Aura authority for the generic runtime. - // seed_aura_authority_from_sr25519::(&alice_pub); - - // // Valid Kyber768 public key length per pallet check. - // const KYBER768_PK_LEN: usize = 1184; - // let public_key: BoundedVec> = bounded_pk::<2048>(KYBER768_PK_LEN); - - // // Measure: dispatch the extrinsic. - // #[extrinsic_call] - // announce_next_key(RawOrigin::Signed(alice_acc.clone()), public_key.clone()); - - // // Assert: NextKey should be set exactly. - // let stored = NextKey::::get().expect("must be set by announce_next_key"); - // assert_eq!(stored, public_key); - // } - - /// Benchmark `submit_encrypted`. + /// Worst-case `announce_next_key`: both current and next author exist, + /// NextKey is populated (shift to CurrentKey), and the next author has a + /// stored key (triggers NextKey write). #[benchmark] - fn submit_encrypted() { - // Any whitelisted caller is fine (no authority requirement). - let who: T::AccountId = whitelisted_caller(); + fn announce_next_key() { + let alice = sr25519_generate(KeyTypeId(*b"aura"), Some("//Alice".as_bytes().to_vec())); + let bob = sr25519_generate(KeyTypeId(*b"aura"), Some("//Bob".as_bytes().to_vec())); - // Dummy commitment and ciphertext (bounded to 8192). - let commitment: T::Hash = ::Hashing::hash(b"bench-commitment"); - const CT_DEFAULT_LEN: usize = 256; - let ciphertext: BoundedVec> = super::bounded_ct::<8192>(CT_DEFAULT_LEN); + // Seed Aura with [alice, bob]. + seed_aura_authorities::(&[alice, bob]); - // Pre-compute expected id to assert postconditions. - let id: T::Hash = - ::Hashing::hash_of(&(who.clone(), commitment, &ciphertext)); + // Slot 0 → current = authorities[0 % 2] = alice, + // next = authorities[1 % 2] = bob. + deposit_slot_digest::(0); + + // Pre-populate NextKey so the shift (CurrentKey ← NextKey) writes. + let old_next_key: ShieldPublicKey = BoundedVec::truncate_from(vec![0x99; MLKEM768_PK_LEN]); + NextKey::::put(old_next_key); + + // Pre-populate AuthorKeys for the next author (bob) so NextKey gets set. + let bob_key: ShieldPublicKey = BoundedVec::truncate_from(vec![0x77; MLKEM768_PK_LEN]); + let bob_id: ::AuthorityId = bob.into(); + AuthorKeys::::insert(&bob_id, bob_key); + + // Valid 1184-byte ML-KEM-768 public key. + let public_key: ShieldPublicKey = BoundedVec::truncate_from(vec![0x42; MLKEM768_PK_LEN]); - // Measure: dispatch the extrinsic. #[extrinsic_call] - submit_encrypted( - RawOrigin::Signed(who.clone()), - commitment, - ciphertext.clone(), - ); - - // Assert: stored under expected id. - let got = Submissions::::get(id).expect("submission must exist"); - assert_eq!(got.author, who); - assert_eq!( - got.commitment, - ::Hashing::hash(b"bench-commitment") - ); - assert_eq!(got.ciphertext.as_slice(), ciphertext.as_slice()); + announce_next_key(RawOrigin::None, Some(public_key.clone())); + + // CurrentKey was shifted from old NextKey. + assert!(CurrentKey::::get().is_some()); + // NextKey was set from bob's AuthorKeys entry. + assert!(NextKey::::get().is_some()); + // Alice's AuthorKeys was updated. + let alice_id: ::AuthorityId = alice.into(); + assert_eq!(AuthorKeys::::get(&alice_id), Some(public_key)); } - /// Benchmark `mark_decryption_failed`. + /// Worst-case `submit_encrypted`: max-size ciphertext (8192 bytes) with + /// real ML-KEM-768 + XChaCha20-Poly1305 decryption to account for the + /// block proposer's off-chain decrypt cost. #[benchmark] - fn mark_decryption_failed() { - // Any account can be the author of the submission. + fn submit_encrypted() { let who: T::AccountId = whitelisted_caller(); - let submitted_in: BlockNumberFor = frame_system::Pallet::::block_number(); - - // Build a dummy commitment and ciphertext. - let commitment: T::Hash = - ::Hashing::hash(b"bench-mark-decryption-failed"); - const CT_DEFAULT_LEN: usize = 32; - let ciphertext: BoundedVec> = - BoundedVec::truncate_from(vec![0u8; CT_DEFAULT_LEN]); - - // Compute the submission id exactly like `submit_encrypted` does. - let id: T::Hash = - ::Hashing::hash_of(&(who.clone(), commitment, &ciphertext)); - - // Seed Submissions with an entry for this id. - let sub = Submission::, ::Hash> { - author: who, - commitment, - ciphertext: ciphertext.clone(), - submitted_in, - }; - Submissions::::insert(id, sub); - - // Reason for failure. - let reason: BoundedVec> = - BoundedVec::truncate_from(b"benchmark-decryption-failed".to_vec()); - - // Measure: dispatch the unsigned extrinsic. - #[extrinsic_call] - mark_decryption_failed(RawOrigin::None, id, reason); - // Assert: submission is removed. - assert!(Submissions::::get(id).is_none()); + // Build a real max-size encrypted payload. + let (wire, dec_key) = build_max_encrypted_payload(); + let ciphertext: BoundedVec> = BoundedVec::truncate_from(wire); + + #[block] + { + // 1. On-chain dispatch (event deposit). + Pallet::::submit_encrypted( + RawOrigin::Signed(who.clone()).into(), + ciphertext.clone(), + ) + .expect("submit_encrypted dispatch must succeed"); + + // 2. Parse wire-format ciphertext (proposer decode). + let shielded_tx = + ShieldedTransaction::parse(&ciphertext).expect("wire format must be valid"); + + // 3. ML-KEM-768 decapsulate (proposer crypto). + let ct = Ciphertext::::try_from(shielded_tx.kem_ct.as_slice()) + .expect("kem_ct must be valid ML-KEM-768 ciphertext"); + let shared_secret = dec_key + .decapsulate(&ct) + .expect("decapsulation must succeed"); + let ss: [u8; 32] = shared_secret.into(); + + // 4. AEAD decrypt (proposer crypto). + let aead = XChaCha20Poly1305::new((&ss).into()); + let _plaintext = aead + .decrypt( + XNonce::from_slice(&shielded_tx.nonce), + Payload { + msg: &shielded_tx.aead_ct, + aad: &[], + }, + ) + .expect("AEAD decryption must succeed"); + } } } diff --git a/pallets/shield/src/extension.rs b/pallets/shield/src/extension.rs new file mode 100644 index 0000000000..e055444a56 --- /dev/null +++ b/pallets/shield/src/extension.rs @@ -0,0 +1,266 @@ +use crate::{Call, Config, CurrentKey, NextKey, ShieldedTransaction}; +use codec::{Decode, DecodeWithMemTracking, Encode}; +use frame_support::pallet_prelude::*; +use frame_support::traits::IsSubType; +use scale_info::TypeInfo; +use sp_io::hashing::twox_128; +use sp_runtime::impl_tx_ext_default; +use sp_runtime::traits::{ + AsSystemOriginSigner, DispatchInfoOf, Dispatchable, Implication, TransactionExtension, + ValidateResult, +}; +use sp_runtime::transaction_validity::{TransactionSource, ValidTransaction}; +use subtensor_macros::freeze_struct; +use subtensor_runtime_common::CustomTransactionError; + +#[freeze_struct("dabd89c6963de25d")] +#[derive(Default, Encode, Decode, DecodeWithMemTracking, Clone, Eq, PartialEq, TypeInfo)] +pub struct CheckShieldedTxValidity(PhantomData); + +impl CheckShieldedTxValidity { + pub fn new() -> Self { + Self(Default::default()) + } +} + +impl sp_std::fmt::Debug for CheckShieldedTxValidity { + fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { + write!(f, "CheckShieldedTxValidity") + } +} + +impl + TransactionExtension<::RuntimeCall> for CheckShieldedTxValidity +where + ::RuntimeCall: Dispatchable + IsSubType>, + ::RuntimeOrigin: AsSystemOriginSigner, +{ + const IDENTIFIER: &'static str = "CheckShieldedTxValidity"; + + type Implicit = (); + type Val = (); + type Pre = (); + + impl_tx_ext_default!(::RuntimeCall; weight prepare); + + fn validate( + &self, + origin: ::RuntimeOrigin, + call: &::RuntimeCall, + _info: &DispatchInfoOf<::RuntimeCall>, + _len: usize, + _self_implicit: Self::Implicit, + _inherited_implication: &impl Implication, + source: TransactionSource, + ) -> ValidateResult::RuntimeCall> { + // Ensure the transaction is signed, else we just skip the extension. + let Some(_who) = origin.as_system_origin_signer() else { + return Ok((Default::default(), (), origin)); + }; + + // Ensure the transaction is a shielded transaction, else we just skip the extension. + let Some(Call::submit_encrypted { ciphertext }) = IsSubType::>::is_sub_type(call) + else { + return Ok((Default::default(), (), origin)); + }; + + // Reject malformed ciphertext regardless of source. + let Some(ShieldedTransaction { key_hash, .. }) = ShieldedTransaction::parse(ciphertext) + else { + return Err(CustomTransactionError::FailedShieldedTxParsing.into()); + }; + + // Only enforce the key_hash check during block building/import. + // The fork-aware tx pool validates against multiple views (recent block states), + // and stale views may not contain the key the tx was encrypted with, + // causing spurious rejections. Pool validation only checks structure above. + if source == TransactionSource::InBlock { + let matches_any = [CurrentKey::::get(), NextKey::::get()] + .iter() + .any(|k| k.as_ref().is_some_and(|k| twox_128(&k[..]) == key_hash)); + + if !matches_any { + return Err(CustomTransactionError::InvalidShieldedTxPubKeyHash.into()); + } + } + + // Shielded txs get a short longevity so they are evicted from the pool + // if not included within a few blocks. Keys rotate every block, so a tx + // encrypted against a key that has rotated out of the 2-key window + // (CurrentKey + NextKey) will never be included — without this it would + // stay in the pool indefinitely since pool revalidation skips the key check. + let validity = ValidTransaction { + longevity: 3, + ..Default::default() + }; + + Ok((validity, (), origin)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::mock::*; + use frame_support::dispatch::GetDispatchInfo; + use frame_support::pallet_prelude::{BoundedVec, ConstU32}; + use sp_runtime::traits::TxBaseImplication; + use sp_runtime::transaction_validity::{TransactionValidityError, ValidTransaction}; + + /// Build wire-format ciphertext with a given key_hash. + /// Layout: key_hash(16) || kem_ct_len(2 LE) || kem_ct(N) || nonce(24) || aead_ct(rest) + fn build_ciphertext(key_hash: [u8; 16]) -> BoundedVec> { + let kem_ct = [0xAA; 4]; + let nonce = [0xBB; 24]; + let aead_ct = [0xDD; 16]; + + let mut buf = Vec::new(); + buf.extend_from_slice(&key_hash); + buf.extend_from_slice(&(kem_ct.len() as u16).to_le_bytes()); + buf.extend_from_slice(&kem_ct); + buf.extend_from_slice(&nonce); + buf.extend_from_slice(&aead_ct); + + BoundedVec::truncate_from(buf) + } + + fn make_submit_call(key_hash: [u8; 16]) -> RuntimeCall { + RuntimeCall::MevShield(crate::Call::submit_encrypted { + ciphertext: build_ciphertext(key_hash), + }) + } + + fn set_current_key(pk: &[u8]) { + CurrentKey::::put(BoundedVec::>::truncate_from(pk.to_vec())); + } + + fn set_next_key(pk: &[u8]) { + NextKey::::put(BoundedVec::>::truncate_from(pk.to_vec())); + } + + fn validate_ext( + who: Option, + call: &RuntimeCall, + source: TransactionSource, + ) -> Result { + let ext = CheckShieldedTxValidity::::new(); + let info = call.get_dispatch_info(); + let origin = match who { + Some(id) => RuntimeOrigin::signed(id), + None => RuntimeOrigin::none(), + }; + ext.validate(origin, call, &info, 0, (), &TxBaseImplication(call), source) + .map(|(validity, _, _)| validity) + } + + const PK_A: [u8; 32] = [0x11; 32]; + const PK_B: [u8; 32] = [0x22; 32]; + + #[test] + fn non_shield_call_passes_through() { + new_test_ext().execute_with(|| { + let call = RuntimeCall::System(frame_system::Call::remark { remark: vec![] }); + let validity = validate_ext(Some(1), &call, TransactionSource::InBlock).unwrap(); + // Non-shield calls get default (max) longevity. + assert_eq!(validity.longevity, u64::MAX); + }); + } + + #[test] + fn unsigned_origin_passes_through() { + new_test_ext().execute_with(|| { + let call = make_submit_call([0xFF; 16]); + let validity = validate_ext(None, &call, TransactionSource::InBlock).unwrap(); + assert_eq!(validity.longevity, u64::MAX); + }); + } + + #[test] + fn malformed_ciphertext_rejected_inblock() { + new_test_ext().execute_with(|| { + let call = RuntimeCall::MevShield(crate::Call::submit_encrypted { + ciphertext: BoundedVec::truncate_from(vec![0u8; 5]), + }); + assert_eq!( + validate_ext(Some(1), &call, TransactionSource::InBlock), + Err(CustomTransactionError::FailedShieldedTxParsing.into()) + ); + }); + } + + #[test] + fn malformed_ciphertext_rejected_from_pool() { + new_test_ext().execute_with(|| { + let call = RuntimeCall::MevShield(crate::Call::submit_encrypted { + ciphertext: BoundedVec::truncate_from(vec![0u8; 5]), + }); + assert_eq!( + validate_ext(Some(1), &call, TransactionSource::External), + Err(CustomTransactionError::FailedShieldedTxParsing.into()) + ); + }); + } + + #[test] + fn inblock_matches_current_key() { + new_test_ext().execute_with(|| { + set_current_key(&PK_A); + let call = make_submit_call(twox_128(&PK_A)); + let validity = validate_ext(Some(1), &call, TransactionSource::InBlock).unwrap(); + assert_eq!(validity.longevity, 3); + }); + } + + #[test] + fn inblock_matches_next_key() { + new_test_ext().execute_with(|| { + set_next_key(&PK_B); + let call = make_submit_call(twox_128(&PK_B)); + let validity = validate_ext(Some(1), &call, TransactionSource::InBlock).unwrap(); + assert_eq!(validity.longevity, 3); + }); + } + + #[test] + fn inblock_no_match_rejected() { + new_test_ext().execute_with(|| { + set_current_key(&PK_A); + set_next_key(&PK_B); + let call = make_submit_call([0xFF; 16]); + assert_eq!( + validate_ext(Some(1), &call, TransactionSource::InBlock), + Err(CustomTransactionError::InvalidShieldedTxPubKeyHash.into()) + ); + }); + } + + #[test] + fn inblock_no_keys_set_rejected() { + new_test_ext().execute_with(|| { + let call = make_submit_call(twox_128(&PK_A)); + assert_eq!( + validate_ext(Some(1), &call, TransactionSource::InBlock), + Err(CustomTransactionError::InvalidShieldedTxPubKeyHash.into()) + ); + }); + } + + #[test] + fn pool_local_skips_key_check() { + new_test_ext().execute_with(|| { + let call = make_submit_call([0xFF; 16]); + let validity = validate_ext(Some(1), &call, TransactionSource::Local).unwrap(); + // Pool sources skip key check but still get short longevity. + assert_eq!(validity.longevity, 3); + }); + } + + #[test] + fn pool_external_skips_key_check() { + new_test_ext().execute_with(|| { + let call = make_submit_call([0xFF; 16]); + let validity = validate_ext(Some(1), &call, TransactionSource::External).unwrap(); + assert_eq!(validity.longevity, 3); + }); + } +} diff --git a/pallets/shield/src/lib.rs b/pallets/shield/src/lib.rs index e0fc250058..2becd6d6f4 100644 --- a/pallets/shield/src/lib.rs +++ b/pallets/shield/src/lib.rs @@ -1,7 +1,19 @@ // pallets/mev-shield/src/lib.rs #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +use frame_support::{pallet_prelude::*, traits::IsSubType}; +use frame_system::{ensure_none, ensure_signed, pallet_prelude::*}; +use sp_runtime::traits::{Applyable, Block as BlockT, Checkable, Hash}; +use stp_shield::{ + INHERENT_IDENTIFIER, InherentType, LOG_TARGET, ShieldPublicKey, ShieldedTransaction, +}; + +use alloc::vec; + pub use pallet::*; + #[cfg(feature = "runtime-benchmarks")] mod benchmarking; @@ -11,263 +23,137 @@ pub mod mock; #[cfg(test)] mod tests; -#[frame_support::pallet] -pub mod pallet { - use super::*; - use codec::Encode; - use frame_support::{ - dispatch::{DispatchInfo, GetDispatchInfo, PostDispatchInfo}, - pallet_prelude::*, - traits::ConstU32, - traits::IsSubType, - weights::Weight, - }; - use frame_system::pallet_prelude::*; - use sp_consensus_aura::sr25519::AuthorityId as AuraAuthorityId; - use sp_core::ByteArray; - use sp_runtime::{ - AccountId32, DispatchErrorWithPostInfo, RuntimeDebug, Saturating, - traits::{ - BadOrigin, DispatchInfoOf, DispatchOriginOf, Dispatchable, Hash, Implication, - TransactionExtension, - }, - transaction_validity::{InvalidTransaction, TransactionSource, ValidTransaction}, - }; - use sp_std::{marker::PhantomData, prelude::*}; - use subtensor_macros::freeze_struct; - - /// Origin helper: ensure the signer is an Aura authority (no session/authorship). - pub struct EnsureAuraAuthority(PhantomData); - - pub trait AuthorityOriginExt { - type AccountId; - - fn ensure_validator(origin: Origin) -> Result; - } - - impl AuthorityOriginExt> for EnsureAuraAuthority - where - T: frame_system::Config - + pallet_aura::Config, - { - type AccountId = AccountId32; +mod extension; +mod migrations; +pub use extension::CheckShieldedTxValidity; - fn ensure_validator(origin: OriginFor) -> Result { - let who: AccountId32 = frame_system::ensure_signed(origin)?; +type MigrationKeyMaxLen = ConstU32<128>; - let aura_id = - ::from_slice(who.as_ref()).map_err(|_| BadOrigin)?; +type ExtrinsicOf = ::Extrinsic; +type CheckedOf = >::Checked; +type ApplyableCallOf = ::Call; - let is_validator = pallet_aura::Authorities::::get() - .into_iter() - .any(|id| id == aura_id); +const MLKEM768_PK_LEN: usize = 1184; +const MAX_EXTRINSIC_DEPTH: u32 = 8; - if is_validator { - Ok(who) - } else { - Err(BadOrigin) - } - } - } - - // ----------------- Types ----------------- - - /// AEAD‑independent commitment over the revealed payload. - #[freeze_struct("66e393c88124f360")] - #[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] - pub struct Submission { - pub author: AccountId, - pub commitment: Hash, - pub ciphertext: BoundedVec>, - pub submitted_in: BlockNumber, - } - - // ----------------- Config ----------------- +#[frame_support::pallet] +pub mod pallet { + use super::*; #[pallet::config] - pub trait Config: - frame_system::Config>> + pallet_aura::Config - { - type RuntimeCall: Parameter - + sp_runtime::traits::Dispatchable< - RuntimeOrigin = Self::RuntimeOrigin, - PostInfo = PostDispatchInfo, - > + GetDispatchInfo; + pub trait Config: frame_system::Config { + /// The identifier type for an authority. + type AuthorityId: Member + Parameter + MaybeSerializeDeserialize + MaxEncodedLen; - type AuthorityOrigin: AuthorityOriginExt; + /// A way to find the current and next block author. + type FindAuthors: FindAuthors; } #[pallet::pallet] pub struct Pallet(_); - // ----------------- Storage ----------------- - - /// Current ML‑KEM‑768 public key bytes (encoded form). + // Current block author ML‑KEM‑768 public key bytes. + // + // Note: Do not use this to encrypt transactions as this + // is only used to validate transactions in the extension. + // Use `NextKey` instead. #[pallet::storage] - pub type CurrentKey = StorageValue<_, BoundedVec>, OptionQuery>; + pub type CurrentKey = StorageValue<_, ShieldPublicKey, OptionQuery>; - /// Next ML‑KEM‑768 public key bytes, announced by the block author. + // Next block author ML‑KEM‑768 public key bytes. + // + // This is the key that should be used to encrypt transactions. #[pallet::storage] - pub type NextKey = StorageValue<_, BoundedVec>, OptionQuery>; + pub type NextKey = StorageValue<_, ShieldPublicKey, OptionQuery>; - /// Buffered encrypted submissions, indexed by wrapper id. + /// Latest announced ML‑KEM‑768 public key per block author. + /// This is the key the author will use for decapsulation in their next slot. #[pallet::storage] - pub type Submissions = StorageMap< - _, - Blake2_128Concat, - T::Hash, - Submission, T::Hash>, - OptionQuery, - >; - - /// Hash(CurrentKey) per block, used to bind `key_hash` to the epoch at submit time. - #[pallet::storage] - pub type KeyHashByBlock = - StorageMap<_, Blake2_128Concat, BlockNumberFor, T::Hash, OptionQuery>; - - /// How many recent blocks of key-epoch hashes we retain. - const KEY_EPOCH_HISTORY: u32 = 100; + pub type AuthorKeys = + StorageMap<_, Twox64Concat, T::AuthorityId, ShieldPublicKey, OptionQuery>; - // ----------------- Events & Errors ----------------- + /// Stores whether some migration has been run. + #[pallet::storage] + pub type HasMigrationRun = + StorageMap<_, Identity, BoundedVec, bool, ValueQuery>; #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event { /// Encrypted wrapper accepted. EncryptedSubmitted { id: T::Hash, who: T::AccountId }, - /// Decrypted call executed. - DecryptedExecuted { id: T::Hash, signer: T::AccountId }, - /// Decrypted execution rejected. - DecryptedRejected { - id: T::Hash, - reason: DispatchErrorWithPostInfo, - }, - /// Decryption failed - validator could not decrypt the submission. - DecryptionFailed { - id: T::Hash, - reason: BoundedVec>, - }, } #[pallet::error] pub enum Error { - /// A submission with the same id already exists in `Submissions`. - SubmissionAlreadyExists, - /// The referenced submission id does not exist in `Submissions`. - MissingSubmission, - /// The recomputed commitment does not match the stored commitment. - CommitmentMismatch, - /// The provided signature over the payload is invalid. - SignatureInvalid, /// The announced ML‑KEM public key length is invalid. BadPublicKeyLen, - /// The MEV‑Shield key epoch for this submission has expired and is no longer accepted. - KeyExpired, - /// The provided `key_hash` does not match the expected epoch key hash. - KeyHashMismatch, + /// Unreachable. + Unreachable, } - // ----------------- Hooks ----------------- - #[pallet::hooks] impl Hooks> for Pallet { - fn on_initialize(n: BlockNumberFor) -> Weight { - let db_weight = T::DbWeight::get(); - let mut reads: u64 = 0; - let mut writes: u64 = 0; - - // 1) Roll NextKey -> CurrentKey if a next key is present. - reads = reads.saturating_add(1); - writes = writes.saturating_add(1); - let mut current_opt: Option>> = - if let Some(next) = NextKey::::take() { - CurrentKey::::put(&next); - writes = writes.saturating_add(1); - Some(next) - } else { - None - }; - - // 2) If we didn't roll, read the existing CurrentKey exactly once. - if current_opt.is_none() { - reads = reads.saturating_add(1); - current_opt = CurrentKey::::get(); - } + fn on_runtime_upgrade() -> frame_support::weights::Weight { + let mut weight = frame_support::weights::Weight::from_parts(0, 0); - // 3) Maintain KeyHashByBlock entry for this block: - match current_opt { - Some(current) => { - let epoch_hash: T::Hash = T::Hashing::hash(current.as_ref()); - KeyHashByBlock::::insert(n, epoch_hash); - writes = writes.saturating_add(1); - } - None => { - KeyHashByBlock::::remove(n); - writes = writes.saturating_add(1); - } - } - - // 4) Prune old epoch hashes with a sliding window of size KEY_EPOCH_HISTORY. - let depth: BlockNumberFor = KEY_EPOCH_HISTORY.into(); - if n >= depth { - let prune_bn = n.saturating_sub(depth); - KeyHashByBlock::::remove(prune_bn); - writes = writes.saturating_add(1); - } - - // 5) TTL-based pruning of stale submissions. - let ttl: BlockNumberFor = KEY_EPOCH_HISTORY.into(); - let threshold: BlockNumberFor = n.saturating_sub(ttl); - - let mut to_remove: Vec = Vec::new(); - - for (id, sub) in Submissions::::iter() { - reads = reads.saturating_add(1); - if sub.submitted_in < threshold { - to_remove.push(id); - } - } - - for id in to_remove { - Submissions::::remove(id); - writes = writes.saturating_add(1); - } + weight = weight.saturating_add( + migrations::migrate_clear_v1_storage::migrate_clear_v1_storage::(), + ); - db_weight.reads_writes(reads, writes) + weight } } - // ----------------- Calls ----------------- - #[pallet::call] impl Pallet { /// Announce the ML‑KEM public key that will become `CurrentKey` in - /// the following block. + /// the next block the current author will produce. + /// + /// Note: The public key can be `None` if the author failed to include the key in the + /// inherent data (which should never happen except node failure). In that case, we + /// store the next key as `None` to reflect that this author will not be able + /// handle encrypted transactions in his next block. #[pallet::call_index(0)] - #[pallet::weight(Weight::from_parts(20_999_999_999, 0) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)))] - #[allow(clippy::useless_conversion)] + #[pallet::weight(Weight::from_parts(23_190_000, 0) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)))] pub fn announce_next_key( origin: OriginFor, - public_key: BoundedVec>, - ) -> DispatchResultWithPostInfo { - // Only a current Aura validator may call this (signed account ∈ Aura authorities) - T::AuthorityOrigin::ensure_validator(origin)?; - - const MAX_KYBER768_PK_LENGTH: usize = 1184; - ensure!( - public_key.len() == MAX_KYBER768_PK_LENGTH, - Error::::BadPublicKeyLen - ); + public_key: Option, + ) -> DispatchResult { + ensure_none(origin)?; + + let author = T::FindAuthors::find_current_author() + // This should never happen as we are in an inherent. + .ok_or(Error::::Unreachable)?; + + // Shift the key chain: Current ← NextKey. + // NextKey was set in the previous block to be the current author's key, + // so this naturally tracks the last 2 keys users may have encrypted with. + CurrentKey::::set(NextKey::::get()); + + if let Some(public_key) = &public_key { + ensure!( + public_key.len() == MLKEM768_PK_LEN, + Error::::BadPublicKeyLen + ); + AuthorKeys::::insert(&author, public_key.clone()); + } else { + // If the author did not announce a key, remove his old key from storage, + // he will not be able to accept shielded transactions in his next block. + AuthorKeys::::remove(&author); + } - NextKey::::put(public_key); + // Expose the next block author's key so users can encrypt for them. + NextKey::::kill(); + if let Some(next_author) = T::FindAuthors::find_next_author() + && let Some(key) = AuthorKeys::::get(&next_author) + { + NextKey::::put(key); + } - // Refund the fee on success by setting pays_fee = Pays::No - Ok(PostDispatchInfo { - actual_weight: None, - pays_fee: Pays::No, - }) + Ok(()) } /// Users submit an encrypted wrapper. @@ -277,194 +163,133 @@ pub mod pallet { /// 1. Read `NextKey` (ML‑KEM public key bytes) from storage. /// 2. Sign your extrinsic so that it can be executed when added to the pool, /// i.e. you may need to increment the nonce if you submit using the same account. - /// 3. `commitment = Hashing::hash(signed_extrinsic)`. - /// 4. Encrypt: + /// 3. Encrypt: /// /// plaintext = signed_extrinsic + /// key_hash = xxhash128(NextKey) + /// kem_len = Length of kem_ct in bytes (u16) + /// kem_ct = Ciphertext from ML‑KEM‑768 + /// nonce = Random 24 bytes used for XChaCha20‑Poly1305 + /// aead_ct = Ciphertext from XChaCha20‑Poly1305 /// /// with ML‑KEM‑768 + XChaCha20‑Poly1305, producing /// - /// ciphertext = [u16 kem_len] || kem_ct || nonce24 || aead_ct + /// ciphertext = key_hash || kem_len || kem_ct || nonce || aead_ct /// #[pallet::call_index(1)] - #[pallet::weight(( - Weight::from_parts(13_980_000, 0) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)), - DispatchClass::Normal, - Pays::Yes, - ))] + #[pallet::weight(Weight::from_parts(207_500_000, 0) + .saturating_add(T::DbWeight::get().reads(0_u64)) + .saturating_add(T::DbWeight::get().writes(0_u64)))] pub fn submit_encrypted( origin: OriginFor, - commitment: T::Hash, ciphertext: BoundedVec>, ) -> DispatchResult { let who = ensure_signed(origin)?; + let id: T::Hash = T::Hashing::hash_of(&(who.clone(), &ciphertext)); - let id: T::Hash = T::Hashing::hash_of(&(who.clone(), commitment, &ciphertext)); - let sub = Submission::, T::Hash> { - author: who.clone(), - commitment, - ciphertext, - submitted_in: >::block_number(), - }; - ensure!( - !Submissions::::contains_key(id), - Error::::SubmissionAlreadyExists - ); - Submissions::::insert(id, sub); Self::deposit_event(Event::EncryptedSubmitted { id, who }); Ok(()) } - - /// Marks a submission as failed to decrypt and removes it from storage. - /// - /// Called by the block author when decryption fails at any stage (e.g., ML-KEM decapsulate - /// failed, AEAD decrypt failed, invalid ciphertext format, etc.). This allows clients to be - /// notified of decryption failures through on-chain events. - /// - /// # Arguments - /// - /// * `id` - The wrapper id (hash of (author, commitment, ciphertext)) - /// * `reason` - Human-readable reason for the decryption failure (e.g., "ML-KEM decapsulate failed") - #[pallet::call_index(3)] - #[pallet::weight(( - Weight::from_parts(13_260_000, 0) - .saturating_add(T::DbWeight::get().reads(1_u64)) - .saturating_add(T::DbWeight::get().writes(1_u64)), - DispatchClass::Normal, - Pays::No - ))] - pub fn mark_decryption_failed( - origin: OriginFor, - id: T::Hash, - reason: BoundedVec>, - ) -> DispatchResult { - // Unsigned: only the author node may inject this via ValidateUnsigned. - ensure_none(origin)?; - - // Load and consume the submission. - let Some(_sub) = Submissions::::take(id) else { - return Err(Error::::MissingSubmission.into()); - }; - - // Emit event to notify clients - Self::deposit_event(Event::DecryptionFailed { id, reason }); - - Ok(()) - } } - #[pallet::validate_unsigned] - impl ValidateUnsigned for Pallet { + #[pallet::inherent] + impl ProvideInherent for Pallet { type Call = Call; - - fn validate_unsigned(source: TransactionSource, call: &Self::Call) -> TransactionValidity { - match call { - Call::mark_decryption_failed { id, .. } => { - match source { - TransactionSource::Local | TransactionSource::InBlock => { - ValidTransaction::with_tag_prefix("mev-shield-failed") - .priority(1u64) - .longevity(64) // long because propagate(false) - .and_provides(id) // dedupe by wrapper id - .propagate(false) // CRITICAL: no gossip, stays on author node - .build() - } - _ => InvalidTransaction::Call.into(), - } - } - _ => InvalidTransaction::Call.into(), - } - } - } - - #[freeze_struct("51f74eb54f5ab1fe")] - #[derive(Default, Encode, Decode, DecodeWithMemTracking, Clone, Eq, PartialEq, TypeInfo)] - pub struct MevShieldDecryptionFilter(pub PhantomData); - - impl sp_std::fmt::Debug for MevShieldDecryptionFilter { - fn fmt(&self, f: &mut sp_std::fmt::Formatter) -> sp_std::fmt::Result { - write!(f, "MevShieldDecryptionFilter") - } - } - - impl MevShieldDecryptionFilter { - pub fn new() -> Self { - Self(PhantomData) + type Error = sp_inherents::MakeFatalError<()>; + + const INHERENT_IDENTIFIER: InherentIdentifier = INHERENT_IDENTIFIER; + + fn create_inherent(data: &InherentData) -> Option { + let public_key = data + .get_data::(&INHERENT_IDENTIFIER) + .inspect_err( + |e| log::debug!(target: LOG_TARGET, "Failed to get shielded public key inherent data: {:?}", e), + ) + .ok()??; + Some(Call::announce_next_key { public_key }) } - #[inline] - fn mev_failed_priority() -> TransactionPriority { - 1u64 + fn is_inherent(call: &Self::Call) -> bool { + matches!(call, Call::announce_next_key { .. }) } } +} - impl TransactionExtension> - for MevShieldDecryptionFilter +impl Pallet { + pub fn try_decode_shielded_tx( + uxt: ExtrinsicOf, + ) -> Option where - ::RuntimeCall: - Dispatchable, - ::RuntimeCall: IsSubType>, + Block::Extrinsic: Checkable, + CheckedOf: Applyable, + ApplyableCallOf>: IsSubType>, { - const IDENTIFIER: &'static str = "MevShieldDecryptionFilter"; - - type Implicit = (); - type Val = (); - type Pre = (); + // Prevent stack overflows by limiting the depth of the extrinsic. + let encoded = uxt.encode(); + let uxt = ::decode_all_with_depth_limit( + MAX_EXTRINSIC_DEPTH, + &mut &encoded[..], + ) + .inspect_err( + |e| log::debug!(target: LOG_TARGET, "Failed to decode shielded extrinsic: {:?}", e), + ) + .ok()?; + + // Verify that the signature is correct. + let xt = ExtrinsicOf::::check(uxt, &Context::default()) + .inspect_err( + |e| log::debug!(target: LOG_TARGET, "Failed to check shielded extrinsic: {:?}", e), + ) + .ok()?; + let call = xt.call(); + + let Some(Call::submit_encrypted { ciphertext }) = IsSubType::>::is_sub_type(call) + else { + return None; + }; + + ShieldedTransaction::parse(ciphertext) + } - fn weight(&self, _call: &RuntimeCallFor) -> Weight { - // Only does light pattern matching; treat as free. - Weight::zero() + pub fn try_unshield_tx( + shielded_tx: ShieldedTransaction, + ) -> Option<::Extrinsic> { + let mut shared_secret = [0u8; 32]; + stp_io::crypto::mlkem768_decapsulate(&shielded_tx.kem_ct, &mut shared_secret).inspect_err( + |e| log::debug!(target: LOG_TARGET, "Failed to decapsulate shielded transaction: {:?}", e), + ).ok()?; + + let plaintext = stp_io::crypto::aead_decrypt( + &shared_secret, + &shielded_tx.nonce, + &shielded_tx.aead_ct, + &[], + ) + .inspect_err( + |e| log::debug!(target: LOG_TARGET, "Failed to decrypt shielded transaction: {:?}", e), + ) + .ok()?; + + if plaintext.is_empty() { + return None; } - fn validate( - &self, - origin: DispatchOriginOf>, - call: &RuntimeCallFor, - _info: &DispatchInfoOf>, - _len: usize, - _self_implicit: Self::Implicit, - _inherited_implication: &impl Implication, - source: TransactionSource, - ) -> ValidateResult> { - match call.is_sub_type() { - Some(Call::mark_decryption_failed { id, .. }) => { - match source { - TransactionSource::Local | TransactionSource::InBlock => { - let validity_res = - ValidTransaction::with_tag_prefix("mev-shield-failed") - .priority(Self::mev_failed_priority()) - .longevity(64) - .and_provides(id) - .propagate(false) - .build(); - - match validity_res { - Ok(validity) => Ok((validity, (), origin)), - Err(e) => Err(e), - } - } - - // Anything coming from the outside world (including *signed* - // transactions) is rejected at the pool boundary. - _ => Err(InvalidTransaction::Call.into()), - } - } - - _ => Ok((Default::default(), (), origin)), - } - } + ExtrinsicOf::::decode(&mut &plaintext[..]).inspect_err( + |e| log::debug!(target: LOG_TARGET, "Failed to decode shielded transaction: {:?}", e), + ).ok() + } +} - fn prepare( - self, - _val: Self::Val, - _origin: &DispatchOriginOf>, - _call: &RuntimeCallFor, - _info: &DispatchInfoOf>, - _len: usize, - ) -> Result { - Ok(()) - } +pub trait FindAuthors { + fn find_current_author() -> Option; + fn find_next_author() -> Option; +} + +impl FindAuthors for () { + fn find_current_author() -> Option { + None + } + fn find_next_author() -> Option { + None } } diff --git a/pallets/shield/src/migrations/migrate_clear_v1_storage.rs b/pallets/shield/src/migrations/migrate_clear_v1_storage.rs new file mode 100644 index 0000000000..e3c55d8713 --- /dev/null +++ b/pallets/shield/src/migrations/migrate_clear_v1_storage.rs @@ -0,0 +1,49 @@ +use super::*; +use frame_support::storage::unhashed; +use scale_info::prelude::string::String; +use sp_io::hashing::twox_128; + +/// Clears removed v1 storage items (`Submissions`, `KeyHashByBlock`) and resets `CurrentKey`. +pub fn migrate_clear_v1_storage() -> Weight { + let migration_name = b"migrate_clear_v1_storage".to_vec(); + let bounded_name = BoundedVec::truncate_from(migration_name.clone()); + let mut weight = T::DbWeight::get().reads(1); + + if HasMigrationRun::::get(&bounded_name) { + log::info!( + "Migration '{:?}' has already run. Skipping.", + String::from_utf8_lossy(&migration_name) + ); + return weight; + } + + log::info!( + "Running migration '{}'", + String::from_utf8_lossy(&migration_name) + ); + + let pallet_prefix = twox_128("MevShield".as_bytes()); + + // Clear removed storage maps. + for name in ["Submissions", "KeyHashByBlock"] { + let prefix = [pallet_prefix.as_slice(), &twox_128(name.as_bytes())].concat(); + let result = unhashed::clear_prefix(&prefix, Some(u32::MAX), None); + weight = weight.saturating_add(T::DbWeight::get().writes(result.backend as u64)); + + log::info!("Removed {} entries from {name:?}.", result.backend,); + } + + // Reset current key. + CurrentKey::::kill(); + weight = weight.saturating_add(T::DbWeight::get().writes(1)); + + HasMigrationRun::::insert(&bounded_name, true); + weight = weight.saturating_add(T::DbWeight::get().writes(1)); + + log::info!( + "Migration '{}' completed successfully.", + String::from_utf8_lossy(&migration_name) + ); + + weight +} diff --git a/pallets/shield/src/migrations/mod.rs b/pallets/shield/src/migrations/mod.rs new file mode 100644 index 0000000000..1069de5297 --- /dev/null +++ b/pallets/shield/src/migrations/mod.rs @@ -0,0 +1,4 @@ +use crate::*; +use frame_support::{traits::Get, weights::Weight}; + +pub mod migrate_clear_v1_storage; diff --git a/pallets/shield/src/mock.rs b/pallets/shield/src/mock.rs index 0732670406..0188d081e4 100644 --- a/pallets/shield/src/mock.rs +++ b/pallets/shield/src/mock.rs @@ -1,145 +1,94 @@ -use crate as pallet_mev_shield; +use crate as pallet_shield; +use crate::MLKEM768_PK_LEN; -use frame_support::{construct_runtime, derive_impl, parameter_types, traits::Everything}; -use frame_system as system; +use frame_support::{BoundedVec, construct_runtime, derive_impl}; +use sp_runtime::{BuildStorage, generic, testing::TestSignature}; +use std::cell::RefCell; +use stp_shield::ShieldPublicKey; -use sp_consensus_aura::sr25519::AuthorityId as AuraId; -use sp_core::{ConstU32, H256}; -use sp_runtime::traits::BadOrigin; -use sp_runtime::{ - AccountId32, BuildStorage, - traits::{BlakeTwo256, IdentityLookup}, -}; +pub type Block = frame_system::mocking::MockBlock; -// ----------------------------------------------------------------------------- -// Mock runtime -// ----------------------------------------------------------------------------- - -pub type UncheckedExtrinsic = system::mocking::MockUncheckedExtrinsic; -pub type Block = system::mocking::MockBlock; +pub type DecodableExtrinsic = generic::UncheckedExtrinsic; +pub type DecodableBlock = + generic::Block, DecodableExtrinsic>; construct_runtime!( pub enum Test { System: frame_system = 0, - Timestamp: pallet_timestamp = 1, - Aura: pallet_aura = 2, - MevShield: pallet_mev_shield = 3, + MevShield: pallet_shield = 1, + Utility: pallet_subtensor_utility = 2, } ); -// A concrete nonce type used in tests. -pub type TestNonce = u64; - #[derive_impl(frame_system::config_preludes::TestDefaultConfig)] -impl system::Config for Test { - // Basic system config - type BaseCallFilter = Everything; - type BlockWeights = (); - type BlockLength = (); - type DbWeight = (); - - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - type RuntimeEvent = RuntimeEvent; - - type Nonce = TestNonce; - type Hash = H256; - type Hashing = BlakeTwo256; - - type AccountId = AccountId32; - type Lookup = IdentityLookup; +impl frame_system::Config for Test { type Block = Block; - - type BlockHashCount = (); - type Version = (); - type PalletInfo = PalletInfo; - - type AccountData = (); - type OnNewAccount = (); - type OnKilledAccount = (); - type SystemWeightInfo = (); - type SS58Prefix = (); - type OnSetCode = (); - - // Max number of consumer refs per account. - type MaxConsumers = ConstU32<16>; } -parameter_types! { - pub const MinimumPeriod: u64 = 1; -} - -impl pallet_timestamp::Config for Test { - type Moment = u64; - type OnTimestampSet = (); - type MinimumPeriod = MinimumPeriod; +impl pallet_subtensor_utility::Config for Test { + type RuntimeCall = RuntimeCall; + type PalletsOrigin = OriginCaller; type WeightInfo = (); } -// Aura mock configuration -parameter_types! { - pub const MaxAuthorities: u32 = 32; - pub const AllowMultipleBlocksPerSlot: bool = false; - pub const SlotDuration: u64 = 6000; -} - -impl pallet_aura::Config for Test { - type AuthorityId = AuraId; - // For tests we don't need dynamic disabling; just use unit type. - type DisabledValidators = (); - type MaxAuthorities = MaxAuthorities; - type AllowMultipleBlocksPerSlot = AllowMultipleBlocksPerSlot; - type SlotDuration = SlotDuration; +thread_local! { + pub static CURRENT_AUTHOR: RefCell> = const { RefCell::new(None) }; + pub static NEXT_AUTHOR: RefCell> = const { RefCell::new(None) }; } -// ----------------------------------------------------------------------------- -// Authority origin for tests – root-only -// ----------------------------------------------------------------------------- - -/// For tests, treat Root as the “validator set” and return a dummy AccountId. -pub struct TestAuthorityOrigin; - -impl pallet_mev_shield::AuthorityOriginExt for TestAuthorityOrigin { - type AccountId = AccountId32; - - fn ensure_validator(origin: RuntimeOrigin) -> Result { - // Must be a signed origin. - let who: AccountId32 = frame_system::ensure_signed(origin).map_err(|_| BadOrigin)?; +pub struct MockFindAuthors; - // Interpret the AccountId bytes as an AuraId, just like the real pallet. - let aura_id = - ::from_slice(who.as_ref()).map_err(|_| BadOrigin)?; - - // Check membership in the Aura validator set. - let is_validator = pallet_aura::Authorities::::get() - .into_iter() - .any(|id| id == aura_id); - - if is_validator { - Ok(who) - } else { - Err(BadOrigin) - } +impl pallet_shield::FindAuthors for MockFindAuthors { + fn find_current_author() -> Option { + CURRENT_AUTHOR.with(|a| *a.borrow()) + } + fn find_next_author() -> Option { + NEXT_AUTHOR.with(|a| *a.borrow()) } } -// ----------------------------------------------------------------------------- -// MevShield Config -// ----------------------------------------------------------------------------- - -impl pallet_mev_shield::Config for Test { - type RuntimeCall = RuntimeCall; - type AuthorityOrigin = TestAuthorityOrigin; +impl pallet_shield::Config for Test { + type AuthorityId = u64; + type FindAuthors = MockFindAuthors; } -// ----------------------------------------------------------------------------- -// new_test_ext -// ----------------------------------------------------------------------------- - pub fn new_test_ext() -> sp_io::TestExternalities { - // Use the construct_runtime!-generated genesis config. RuntimeGenesisConfig::default() .build_storage() - .expect("RuntimeGenesisConfig builds valid default genesis storage") + .expect("valid genesis") .into() } + +pub fn valid_pk() -> ShieldPublicKey { + BoundedVec::truncate_from(vec![0x42; MLKEM768_PK_LEN]) +} + +pub fn valid_pk_b() -> ShieldPublicKey { + BoundedVec::truncate_from(vec![0x99; MLKEM768_PK_LEN]) +} + +pub fn set_authors(current: Option, next: Option) { + CURRENT_AUTHOR.with(|a| *a.borrow_mut() = current); + NEXT_AUTHOR.with(|a| *a.borrow_mut() = next); +} + +pub fn nest_call(call: RuntimeCall, depth: usize) -> RuntimeCall { + (0..depth).fold(call, |inner, _| { + RuntimeCall::Utility(pallet_subtensor_utility::Call::batch { calls: vec![inner] }) + }) +} + +pub fn build_wire_ciphertext( + key_hash: &[u8; 16], + kem_ct: &[u8], + nonce: &[u8; 24], + aead_ct: &[u8], +) -> Vec { + let mut buf = Vec::new(); + buf.extend_from_slice(key_hash); + buf.extend_from_slice(&(kem_ct.len() as u16).to_le_bytes()); + buf.extend_from_slice(kem_ct); + buf.extend_from_slice(nonce); + buf.extend_from_slice(aead_ct); + buf +} diff --git a/pallets/shield/src/tests.rs b/pallets/shield/src/tests.rs index 18eda7eacc..f18d4acd1f 100644 --- a/pallets/shield/src/tests.rs +++ b/pallets/shield/src/tests.rs @@ -1,443 +1,414 @@ -use crate as pallet_mev_shield; use crate::mock::*; - -use frame_support::{ - BoundedVec, assert_noop, assert_ok, - traits::{ConstU32 as FrameConstU32, Hooks}, -}; -use frame_system::pallet_prelude::BlockNumberFor; -use pallet_mev_shield::{ - Call as MevShieldCall, CurrentKey, Event as MevShieldEvent, KeyHashByBlock, NextKey, - Submissions, +use crate::{AuthorKeys, CurrentKey, Error, HasMigrationRun, NextKey}; + +use codec::Encode; +use frame_support::{BoundedVec, assert_noop, assert_ok}; +use sp_runtime::BuildStorage; +use sp_runtime::testing::TestSignature; +use sp_runtime::traits::{Block as BlockT, Hash}; +use stp_shield::{ShieldKeystore, ShieldKeystoreExt, ShieldPublicKey, ShieldedTransaction}; + +use chacha20poly1305::{ + KeyInit, XChaCha20Poly1305, XNonce, + aead::{Aead, Payload}, }; -use sp_core::{Pair, sr25519}; -use sp_runtime::{ - AccountId32, - traits::{Hash, SaturatedConversion}, +use ml_kem::{ + EncodedSizeUser, MlKem768Params, + kem::{Encapsulate, EncapsulationKey}, }; +use rand_chacha::{ChaChaRng, rand_core::SeedableRng}; +use stc_shield::MemoryShieldKeystore; +use std::sync::Arc; -// Type aliases for convenience in tests. -type TestHash = ::Hash; -type TestBlockNumber = BlockNumberFor; - -// ----------------------------------------------------------------------------- -// Helpers -// ----------------------------------------------------------------------------- - -/// Deterministic sr25519 pair for tests (acts as "Alice"). -fn test_sr25519_pair() -> sr25519::Pair { - sr25519::Pair::from_seed(&[1u8; 32]) +#[test] +fn announce_rejects_signed_origin() { + new_test_ext().execute_with(|| { + set_authors(Some(1), None); + assert_noop!( + MevShield::announce_next_key(RuntimeOrigin::signed(1), Some(valid_pk())), + sp_runtime::DispatchError::BadOrigin + ); + }); } -// ----------------------------------------------------------------------------- -// Tests -// ----------------------------------------------------------------------------- - #[test] -fn authority_can_announce_next_key_and_on_initialize_rolls_it_and_records_epoch_hash() { +fn announce_shifts_next_into_current() { new_test_ext().execute_with(|| { - const KYBER_PK_LEN: usize = 1184; - let pk_bytes = vec![7u8; KYBER_PK_LEN]; - let bounded_pk: BoundedVec> = - BoundedVec::truncate_from(pk_bytes.clone()); - - // Seed Aura authorities with a single validator and derive the matching account. - let validator_pair = test_sr25519_pair(); - let validator_account: AccountId32 = validator_pair.public().into(); - let validator_aura_id: ::AuthorityId = - validator_pair.public().into(); - - // Authorities storage expects a BoundedVec. - let authorities: BoundedVec< - ::AuthorityId, - ::MaxAuthorities, - > = BoundedVec::truncate_from(vec![validator_aura_id.clone()]); - pallet_aura::Authorities::::put(authorities); - - assert!(CurrentKey::::get().is_none()); - assert!(NextKey::::get().is_none()); + set_authors(Some(1), Some(2)); + + let old_next = valid_pk_b(); + NextKey::::put(old_next.clone()); - // Signed by an Aura validator -> passes TestAuthorityOrigin::ensure_validator. assert_ok!(MevShield::announce_next_key( - RuntimeOrigin::signed(validator_account.clone()), - bounded_pk.clone(), + RuntimeOrigin::none(), + Some(valid_pk()), )); - // NextKey storage updated - let next = NextKey::::get().expect("NextKey should be set"); - assert_eq!(next, pk_bytes); - - // Simulate beginning of block #2. - let block_two: TestBlockNumber = 2u64.saturated_into(); - MevShield::on_initialize(block_two); + assert_eq!(CurrentKey::::get(), Some(old_next)); + }); +} - // CurrentKey should now equal the previously announced NextKey. - let curr = CurrentKey::::get().expect("CurrentKey should be set"); - assert_eq!(curr, pk_bytes); +#[test] +fn announce_stores_key_in_author_keys() { + new_test_ext().execute_with(|| { + set_authors(Some(1), None); + let pk = valid_pk(); - // And NextKey cleared. - assert!(NextKey::::get().is_none()); + assert_ok!(MevShield::announce_next_key( + RuntimeOrigin::none(), + Some(pk.clone()), + )); - // Key hash for this block should be recorded and equal hash(CurrentKey_bytes). - let expected_hash: TestHash = ::Hashing::hash(curr.as_ref()); - let recorded = - KeyHashByBlock::::get(block_two).expect("epoch key hash must be recorded"); - assert_eq!(recorded, expected_hash); + assert_eq!(AuthorKeys::::get(1u64), Some(pk)); }); } #[test] -fn announce_next_key_rejects_non_validator_origins() { +fn announce_sets_next_key_from_next_author() { new_test_ext().execute_with(|| { - const KYBER_PK_LEN: usize = 1184; - - // Validator account: bytes match the Aura authority we put into storage. - let validator_pair = test_sr25519_pair(); - let validator_account: AccountId32 = validator_pair.public().into(); - let validator_aura_id: ::AuthorityId = - validator_pair.public().into(); - - // Non‑validator is some other key (not in Aura::Authorities). - let non_validator_pair = sr25519::Pair::from_seed(&[2u8; 32]); - let non_validator: AccountId32 = non_validator_pair.public().into(); - - // Only the validator is in the Aura validator set. - let authorities: BoundedVec< - ::AuthorityId, - ::MaxAuthorities, - > = BoundedVec::truncate_from(vec![validator_aura_id.clone()]); - pallet_aura::Authorities::::put(authorities); - - let pk_bytes = vec![9u8; KYBER_PK_LEN]; - let bounded_pk: BoundedVec> = - BoundedVec::truncate_from(pk_bytes.clone()); - - // 1) Signed non‑validator origin must fail with BadOrigin. - assert_noop!( - MevShield::announce_next_key( - RuntimeOrigin::signed(non_validator.clone()), - bounded_pk.clone(), - ), - sp_runtime::DispatchError::BadOrigin - ); + set_authors(Some(1), Some(2)); - // 2) Unsigned origin must also fail with BadOrigin. - assert_noop!( - MevShield::announce_next_key(RuntimeOrigin::none(), bounded_pk.clone(),), - sp_runtime::DispatchError::BadOrigin - ); + let pk_b = valid_pk_b(); + AuthorKeys::::insert(2u64, pk_b.clone()); - // 3) Signed validator origin succeeds (sanity check). assert_ok!(MevShield::announce_next_key( - RuntimeOrigin::signed(validator_account.clone()), - bounded_pk.clone(), + RuntimeOrigin::none(), + Some(valid_pk()), )); - let next = NextKey::::get().expect("NextKey must be set by validator"); - assert_eq!(next, pk_bytes); + assert_eq!(NextKey::::get(), Some(pk_b)); }); } #[test] -fn submit_encrypted_stores_submission_and_emits_event() { +fn announce_next_key_none_when_next_author_has_no_key() { new_test_ext().execute_with(|| { - let pair = test_sr25519_pair(); - let who: AccountId32 = pair.public().into(); - - System::set_block_number(10); - - let commitment = - ::Hashing::hash(b"test-mevshield-commitment"); - let ciphertext_bytes = vec![1u8, 2, 3, 4]; - let ciphertext: BoundedVec> = - BoundedVec::truncate_from(ciphertext_bytes.clone()); - - assert_ok!(MevShield::submit_encrypted( - RuntimeOrigin::signed(who.clone()), - commitment, - ciphertext.clone(), - )); + set_authors(Some(1), Some(2)); - let id = ::Hashing::hash_of(&( - who.clone(), - commitment, - &ciphertext, + assert_ok!(MevShield::announce_next_key( + RuntimeOrigin::none(), + Some(valid_pk()), )); - let stored = Submissions::::get(id).expect("submission stored"); - assert_eq!(stored.author, who); - assert_eq!(stored.commitment, commitment); - assert_eq!(stored.ciphertext.to_vec(), ciphertext_bytes); - assert_eq!(stored.submitted_in, 10); - - let events = System::events(); - let last = events.last().expect("at least one event").event.clone(); - - assert!( - matches!( - last, - RuntimeEvent::MevShield( - MevShieldEvent::::EncryptedSubmitted { id: ev_id, who: ev_who } - ) - if ev_id == id && ev_who == who - ), - "expected EncryptedSubmitted event with correct id & who", - ); + assert!(NextKey::::get().is_none()); }); } #[test] -fn key_hash_by_block_prunes_old_entries() { +fn announce_next_key_none_when_no_next_author() { new_test_ext().execute_with(|| { - // This must match the constant configured in the pallet. - const KEEP: u64 = 100; - const TOTAL: u64 = KEEP + 5; + set_authors(Some(1), None); - // For each block n, set a CurrentKey and call on_initialize(n), - // which will record KeyHashByBlock[n] and prune old entries. - for n in 1..=TOTAL { - let key_bytes = vec![n as u8; 32]; - let bounded: BoundedVec> = - BoundedVec::truncate_from(key_bytes.clone()); + assert_ok!(MevShield::announce_next_key( + RuntimeOrigin::none(), + Some(valid_pk()), + )); - CurrentKey::::put(bounded.clone()); + assert!(NextKey::::get().is_none()); + }); +} - let bn: TestBlockNumber = n.saturated_into(); - MevShield::on_initialize(bn); - } +#[test] +fn announce_rejects_bad_pk_length() { + new_test_ext().execute_with(|| { + set_authors(Some(1), None); + let bad_pk: ShieldPublicKey = BoundedVec::truncate_from(vec![0x01; 100]); - // The oldest block that should still be kept after TOTAL blocks. - let oldest_kept: u64 = if TOTAL > KEEP { TOTAL - KEEP + 1 } else { 1 }; + assert_noop!( + MevShield::announce_next_key(RuntimeOrigin::none(), Some(bad_pk)), + Error::::BadPublicKeyLen + ); + }); +} - // Blocks strictly before oldest_kept must be pruned. - for old in 0..oldest_kept { - let bn: TestBlockNumber = old.saturated_into(); - assert!( - KeyHashByBlock::::get(bn).is_none(), - "block {bn:?} should have been pruned" - ); - } +#[test] +fn announce_none_pk_removes_author_key() { + new_test_ext().execute_with(|| { + set_authors(Some(1), None); + AuthorKeys::::insert(1u64, valid_pk()); - // Blocks from oldest_kept..=TOTAL must still have entries. - for recent in oldest_kept..=TOTAL { - let bn: TestBlockNumber = recent.saturated_into(); - assert!( - KeyHashByBlock::::get(bn).is_some(), - "block {bn:?} should be retained" - ); - } + assert_ok!(MevShield::announce_next_key(RuntimeOrigin::none(), None)); - // Additionally, assert we never exceed the configured cap. - let mut count: u64 = 0; - for bn in 0..=TOTAL { - let bn_t: TestBlockNumber = bn.saturated_into(); - if KeyHashByBlock::::get(bn_t).is_some() { - count += 1; - } - } - let expected = KEEP.min(TOTAL); - assert_eq!( - count, expected, - "expected at most {expected} entries in KeyHashByBlock after pruning, got {count}" - ); + assert!(AuthorKeys::::get(1u64).is_none()); }); } #[test] -fn submissions_pruned_after_ttl_window() { +fn announce_fails_when_no_current_author() { new_test_ext().execute_with(|| { - // This must match KEY_EPOCH_HISTORY in the pallet. - const KEEP: u64 = 100; - const TOTAL: u64 = KEEP + 5; - - let pair = test_sr25519_pair(); - let who: AccountId32 = pair.public().into(); - - // Helper: create a submission at a specific block with a tagged commitment. - let make_submission = |block: u64, tag: &[u8]| -> TestHash { - System::set_block_number(block); - let commitment: TestHash = ::Hashing::hash(tag); - let ciphertext_bytes = vec![block as u8; 4]; - let ciphertext: BoundedVec> = - BoundedVec::truncate_from(ciphertext_bytes); - - assert_ok!(MevShield::submit_encrypted( - RuntimeOrigin::signed(who.clone()), - commitment, - ciphertext.clone(), - )); - - ::Hashing::hash_of(&( - who.clone(), - commitment, - &ciphertext, - )) - }; - - // With n = TOTAL and depth = KEEP, prune_before = n - KEEP = 5. - let stale_block1: u64 = 1; // < 5, should be pruned - let stale_block2: u64 = 4; // < 5, should be pruned - let keep_block1: u64 = 5; // == prune_before, should be kept - let keep_block2: u64 = TOTAL; // latest, should be kept - - let id_stale1 = make_submission(stale_block1, b"stale-1"); - let id_stale2 = make_submission(stale_block2, b"stale-2"); - let id_keep1 = make_submission(keep_block1, b"keep-1"); - let id_keep2 = make_submission(keep_block2, b"keep-2"); - - // Sanity: all are present before pruning. - assert!(Submissions::::get(id_stale1).is_some()); - assert!(Submissions::::get(id_stale2).is_some()); - assert!(Submissions::::get(id_keep1).is_some()); - assert!(Submissions::::get(id_keep2).is_some()); - - // Run on_initialize at block TOTAL, triggering TTL pruning over Submissions. - let n_final: TestBlockNumber = TOTAL.saturated_into(); - MevShield::on_initialize(n_final); - - // Submissions with submitted_in < prune_before (5) should be gone. - assert!(Submissions::::get(id_stale1).is_none()); - assert!(Submissions::::get(id_stale2).is_none()); - - // Submissions at or after prune_before should remain. - assert!(Submissions::::get(id_keep1).is_some()); - assert!(Submissions::::get(id_keep2).is_some()); + set_authors(None, None); + + assert_noop!( + MevShield::announce_next_key(RuntimeOrigin::none(), Some(valid_pk())), + Error::::Unreachable + ); }); } #[test] -fn mark_decryption_failed_removes_submission_and_emits_event() { +fn submit_encrypted_emits_event() { new_test_ext().execute_with(|| { - System::set_block_number(42); - let pair = test_sr25519_pair(); - let who: AccountId32 = pair.public().into(); + System::set_block_number(1); - let commitment: TestHash = - ::Hashing::hash(b"failed-decryption-commitment"); - let ciphertext_bytes = vec![5u8; 8]; - let ciphertext: BoundedVec> = - BoundedVec::truncate_from(ciphertext_bytes.clone()); + let ciphertext = BoundedVec::truncate_from(vec![0xAA; 64]); + let who: u64 = 1; assert_ok!(MevShield::submit_encrypted( - RuntimeOrigin::signed(who.clone()), - commitment, + RuntimeOrigin::signed(who), ciphertext.clone(), )); - let id: TestHash = ::Hashing::hash_of(&( - who.clone(), - commitment, - &ciphertext, - )); - - // Sanity: submission exists. - assert!(Submissions::::get(id).is_some()); + let expected_id = ::Hashing::hash_of(&(who, &ciphertext)); - // Reason we will pass into mark_decryption_failed. - let reason_bytes = b"AEAD decrypt failed".to_vec(); - let reason: BoundedVec> = - BoundedVec::truncate_from(reason_bytes.clone()); + System::assert_last_event( + crate::Event::::EncryptedSubmitted { + id: expected_id, + who, + } + .into(), + ); + }); +} - // Call mark_decryption_failed as unsigned (RuntimeOrigin::none()). - assert_ok!(MevShield::mark_decryption_failed( - RuntimeOrigin::none(), - id, - reason.clone(), - )); +#[test] +fn submit_encrypted_rejects_unsigned() { + new_test_ext().execute_with(|| { + let ciphertext = BoundedVec::truncate_from(vec![0xAA; 64]); - // Submission should be removed. - assert!(Submissions::::get(id).is_none()); - - // Last event should be DecryptionFailed with the correct id and reason. - let events = System::events(); - let last = events - .last() - .expect("an event should be emitted") - .event - .clone(); - - assert!( - matches!( - last, - RuntimeEvent::MevShield( - MevShieldEvent::::DecryptionFailed { id: ev_id, reason: ev_reason } - ) - if ev_id == id && ev_reason.to_vec() == reason_bytes - ), - "expected DecryptionFailed event with correct id & reason" + assert_noop!( + MevShield::submit_encrypted(RuntimeOrigin::none(), ciphertext), + sp_runtime::DispatchError::BadOrigin ); + }); +} + +#[test] +fn try_decode_shielded_tx_parses_bare_submit_encrypted() { + new_test_ext().execute_with(|| { + let key_hash = [0xAB; 16]; + let kem_ct = vec![0xCC; 32]; + let nonce = [0xDD; 24]; + let aead_ct = vec![0xEE; 64]; + + let ciphertext = build_wire_ciphertext(&key_hash, &kem_ct, &nonce, &aead_ct); + let call = RuntimeCall::MevShield(crate::Call::submit_encrypted { + ciphertext: BoundedVec::truncate_from(ciphertext), + }); + let uxt = DecodableExtrinsic::new_bare(call); + + let result = crate::Pallet::::try_decode_shielded_tx::< + DecodableBlock, + frame_system::ChainContext, + >(uxt); + assert!(result.is_some()); + + let shielded = result.unwrap(); + assert_eq!(shielded.key_hash, key_hash); + assert_eq!(shielded.kem_ct, kem_ct); + assert_eq!(shielded.nonce, nonce); + assert_eq!(shielded.aead_ct, aead_ct); + }); +} + +#[test] +fn try_decode_shielded_tx_returns_none_for_non_shield_call() { + new_test_ext().execute_with(|| { + let call = RuntimeCall::System(frame_system::Call::remark { remark: vec![] }); + let uxt = DecodableExtrinsic::new_bare(call); + + let result = crate::Pallet::::try_decode_shielded_tx::< + DecodableBlock, + frame_system::ChainContext, + >(uxt); + assert!(result.is_none()); + }); +} - // A second call with the same id should now fail with MissingSubmission. - let res = MevShield::mark_decryption_failed(RuntimeOrigin::none(), id, reason); - assert_noop!(res, pallet_mev_shield::Error::::MissingSubmission); +#[test] +fn try_decode_shielded_tx_returns_none_for_bad_signature() { + new_test_ext().execute_with(|| { + let ciphertext = build_wire_ciphertext(&[0xAB; 16], &[0xCC; 32], &[0xDD; 24], &[0xEE; 64]); + let call = RuntimeCall::MevShield(crate::Call::submit_encrypted { + ciphertext: BoundedVec::truncate_from(ciphertext), + }); + let bad_sig = TestSignature(1, vec![0xFF; 32]); + let uxt = DecodableExtrinsic::new_signed(call, 1u64, bad_sig, ()); + + let result = crate::Pallet::::try_decode_shielded_tx::< + DecodableBlock, + frame_system::ChainContext, + >(uxt); + assert!(result.is_none()); }); } #[test] -fn announce_next_key_charges_then_refunds_fee() { +fn try_decode_shielded_tx_returns_none_for_malformed_ciphertext() { new_test_ext().execute_with(|| { - const KYBER_PK_LEN: usize = 1184; - - // --------------------------------------------------------------------- - // 1. Seed Aura authorities with a single validator and derive account. - // --------------------------------------------------------------------- - let validator_pair = test_sr25519_pair(); - let validator_account: AccountId32 = validator_pair.public().into(); - let validator_aura_id: ::AuthorityId = - validator_pair.public().into(); - - let authorities: BoundedVec< - ::AuthorityId, - ::MaxAuthorities, - > = BoundedVec::truncate_from(vec![validator_aura_id]); - pallet_aura::Authorities::::put(authorities); - - // --------------------------------------------------------------------- - // 2. Build a valid Kyber public key and the corresponding RuntimeCall. - // --------------------------------------------------------------------- - let pk_bytes = vec![42u8; KYBER_PK_LEN]; - let bounded_pk: BoundedVec> = - BoundedVec::truncate_from(pk_bytes.clone()); - - let runtime_call = RuntimeCall::MevShield(MevShieldCall::::announce_next_key { - public_key: bounded_pk.clone(), + let call = RuntimeCall::MevShield(crate::Call::submit_encrypted { + ciphertext: BoundedVec::truncate_from(vec![0u8; 5]), }); + let uxt = DecodableExtrinsic::new_bare(call); - // --------------------------------------------------------------------- - // 3. Pre-dispatch: DispatchInfo must say Pays::Yes. - // --------------------------------------------------------------------- - let pre_info = ::get_dispatch_info( - &runtime_call, - ); + let result = crate::Pallet::::try_decode_shielded_tx::< + DecodableBlock, + frame_system::ChainContext, + >(uxt); + assert!(result.is_none()); + }); +} - assert_eq!( - pre_info.pays_fee, - frame_support::dispatch::Pays::Yes, - "announce_next_key must be declared as fee-paying at pre-dispatch" - ); +#[test] +fn try_decode_shielded_tx_returns_none_when_depth_exceeded() { + new_test_ext().execute_with(|| { + let ciphertext = build_wire_ciphertext(&[0xAB; 16], &[0xCC; 32], &[0xDD; 24], &[0xEE; 64]); + let inner = RuntimeCall::MevShield(crate::Call::submit_encrypted { + ciphertext: BoundedVec::truncate_from(ciphertext), + }); + let call = nest_call(inner, 8); + let uxt = DecodableExtrinsic::new_bare(call); + + let result = crate::Pallet::::try_decode_shielded_tx::< + DecodableBlock, + frame_system::ChainContext, + >(uxt); + assert!(result.is_none()); + }); +} - // --------------------------------------------------------------------- - // 4. Dispatch via the pallet function. - // --------------------------------------------------------------------- - let post = MevShield::announce_next_key( - RuntimeOrigin::signed(validator_account.clone()), - bounded_pk.clone(), +#[test] +fn try_unshield_tx_decrypts_extrinsic() { + let mut rng = ChaChaRng::from_seed([42u8; 32]); + let keystore = Arc::new(MemoryShieldKeystore::new()); + + // Client side: read the announced public key and encapsulate. + let pk_bytes = keystore.next_public_key().unwrap(); + let enc_key = + EncapsulationKey::::from_bytes(pk_bytes.as_slice().try_into().unwrap()); + let (kem_ct, shared_secret) = enc_key.encapsulate(&mut rng).unwrap(); + + // Build the inner extrinsic that we'll encrypt. + let inner_call = RuntimeCall::System(frame_system::Call::remark { + remark: vec![1, 2, 3], + }); + let inner_uxt = ::Extrinsic::new_bare(inner_call); + let plaintext = inner_uxt.encode(); + + // AEAD encrypt the extrinsic bytes. + let nonce = [42u8; 24]; + let cipher = XChaCha20Poly1305::new(shared_secret.as_slice().into()); + let aead_ct = cipher + .encrypt( + XNonce::from_slice(&nonce), + Payload { + msg: &plaintext, + aad: &[], + }, ) - .expect("announce_next_key should succeed for an Aura validator"); + .unwrap(); + + // Roll keystore so next -> current (author side). + keystore.roll_for_next_slot().unwrap(); + + let shielded_tx = ShieldedTransaction { + key_hash: [0u8; 16], + kem_ct: kem_ct.as_slice().to_vec(), + nonce, + aead_ct, + }; + + // Build externalities with ShieldKeystoreExt registered. + let storage = RuntimeGenesisConfig::default() + .build_storage() + .expect("valid genesis"); + let mut ext = sp_io::TestExternalities::new(storage); + ext.register_extension(ShieldKeystoreExt::from( + keystore as Arc, + )); + + ext.execute_with(|| { + let result = crate::Pallet::::try_unshield_tx::(shielded_tx); + assert!(result.is_some()); + + let decoded = result.unwrap(); + assert_eq!(decoded.encode(), inner_uxt.encode()); + }); +} - // Post-dispatch info should switch pays_fee from Yes -> No (refund). - assert_eq!( - post.pays_fee, - frame_support::dispatch::Pays::No, - "announce_next_key must refund the previously chargeable fee" - ); +// --------------------------------------------------------------------------- +// Migration tests +// --------------------------------------------------------------------------- + +mod migration_tests { + use super::*; + use crate::migrations::migrate_clear_v1_storage::migrate_clear_v1_storage; + use sp_io::hashing::twox_128; + + #[test] + fn migrate_clear_v1_storage_works() { + new_test_ext().execute_with(|| { + // Seed legacy storage that should be cleared. + seed_legacy_map("Submissions", 5); + seed_legacy_map("KeyHashByBlock", 3); + CurrentKey::::put(valid_pk()); + + // Current storage that must survive. + NextKey::::put(valid_pk()); + AuthorKeys::::insert(1u64, valid_pk_b()); + + // Sanity: legacy values exist. + assert_eq!(count_keys("Submissions"), 5); + assert_eq!(count_keys("KeyHashByBlock"), 3); + assert!(CurrentKey::::get().is_some()); + + migrate_clear_v1_storage::(); + + // Legacy storage cleared. + assert_eq!(count_keys("Submissions"), 0); + assert_eq!(count_keys("KeyHashByBlock"), 0); + assert!(CurrentKey::::get().is_none()); + + // Current storage untouched. + assert_eq!(NextKey::::get(), Some(valid_pk())); + assert_eq!(AuthorKeys::::get(1u64), Some(valid_pk_b())); + + // Migration was recorded. + let mig_key = BoundedVec::truncate_from(b"migrate_clear_v1_storage".to_vec()); + assert!(HasMigrationRun::::get(&mig_key)); + + // Idempotent: re-run doesn't touch new data. + CurrentKey::::put(valid_pk_b()); + migrate_clear_v1_storage::(); + assert_eq!(CurrentKey::::get(), Some(valid_pk_b())); + }); + } - // And we don't override the actual weight (None => use pre-dispatch weight). - assert!( - post.actual_weight.is_none(), - "announce_next_key should not override actual_weight in PostDispatchInfo" - ); - let next = NextKey::::get().expect("NextKey should be set by announce_next_key"); - assert_eq!(next, pk_bytes); - }); + fn seed_legacy_map(storage_name: &str, count: u32) { + let mut prefix = Vec::new(); + prefix.extend_from_slice(&twox_128(b"MevShield")); + prefix.extend_from_slice(&twox_128(storage_name.as_bytes())); + + for i in 0..count { + let mut key = prefix.clone(); + key.extend_from_slice(&i.to_le_bytes()); + sp_io::storage::set(&key, &[1u8; 32]); + } + } + + fn count_keys(storage_name: &str) -> u32 { + let mut prefix = Vec::new(); + prefix.extend_from_slice(&twox_128(b"MevShield")); + prefix.extend_from_slice(&twox_128(storage_name.as_bytes())); + + let mut count = 0u32; + let mut next_key = sp_io::storage::next_key(&prefix); + while let Some(key) = next_key { + if !key.starts_with(&prefix) { + break; + } + count += 1; + next_key = sp_io::storage::next_key(&key); + } + count + } } diff --git a/pallets/subtensor/Cargo.toml b/pallets/subtensor/Cargo.toml index a6fadec1f4..62f203d51a 100644 --- a/pallets/subtensor/Cargo.toml +++ b/pallets/subtensor/Cargo.toml @@ -69,7 +69,7 @@ pallet-subtensor-swap.workspace = true sp-version.workspace = true # Substrate sp-tracing.workspace = true -rand.workspace = true +rand = { workspace = true, features = ["thread_rng"] } sp-core.workspace = true sp-std.workspace = true pallet-preimage.workspace = true @@ -141,7 +141,8 @@ std = [ "scale-info/std", "serde/std", "serde_json/std", - "sha2/std" + "sha2/std", + "rand/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/pallets/subtensor/src/extensions/check_coldkey_swap.rs b/pallets/subtensor/src/extensions/check_coldkey_swap.rs index db603f9614..dd71182c3f 100644 --- a/pallets/subtensor/src/extensions/check_coldkey_swap.rs +++ b/pallets/subtensor/src/extensions/check_coldkey_swap.rs @@ -1,4 +1,4 @@ -use crate::{Call, ColdkeySwapAnnouncements, ColdkeySwapDisputes, Config, CustomTransactionError}; +use crate::{Call, ColdkeySwapAnnouncements, ColdkeySwapDisputes, Config}; use codec::{Decode, DecodeWithMemTracking, Encode}; use frame_support::dispatch::{DispatchInfo, PostDispatchInfo}; use frame_support::traits::IsSubType; @@ -14,6 +14,7 @@ use sp_runtime::{ }; use sp_std::marker::PhantomData; use subtensor_macros::freeze_struct; +use subtensor_runtime_common::CustomTransactionError; type CallOf = ::RuntimeCall; type OriginOf = ::RuntimeOrigin; @@ -113,13 +114,10 @@ mod tests { use super::*; use crate::{BalancesCall, DefaultMinStake, tests::mock::*}; use frame_support::testing_prelude::*; - use frame_support::{dispatch::GetDispatchInfo, traits::OriginTrait}; + use frame_support::{BoundedVec, dispatch::GetDispatchInfo, traits::OriginTrait}; use frame_system::Call as SystemCall; use sp_core::U256; - use sp_runtime::{ - BoundedVec, - traits::{AsTransactionAuthorizedOrigin, Hash, TxBaseImplication}, - }; + use sp_runtime::traits::{AsTransactionAuthorizedOrigin, Hash, TxBaseImplication}; use subtensor_runtime_common::{Currency, NetUid}; type HashingOf = ::Hashing; @@ -305,7 +303,6 @@ mod tests { RuntimeCall::SubtensorModule(SubtensorCall::swap_coldkey_announced { new_coldkey }), RuntimeCall::SubtensorModule(SubtensorCall::dispute_coldkey_swap {}), RuntimeCall::Shield(pallet_shield::Call::submit_encrypted { - commitment: ::Hashing::hash_of(&new_coldkey), ciphertext: BoundedVec::truncate_from(vec![1, 2, 3, 4]), }), ]; diff --git a/pallets/subtensor/src/extensions/subtensor.rs b/pallets/subtensor/src/extensions/subtensor.rs index a24a54f3fd..409f1c1056 100644 --- a/pallets/subtensor/src/extensions/subtensor.rs +++ b/pallets/subtensor/src/extensions/subtensor.rs @@ -1,7 +1,4 @@ -use crate::{ - BalancesCall, Call, CheckColdkeySwap, Config, CustomTransactionError, Error, Pallet, - TransactionType, -}; +use crate::{BalancesCall, Call, CheckColdkeySwap, Config, Error, Pallet, TransactionType}; use codec::{Decode, DecodeWithMemTracking, Encode}; use frame_support::dispatch::{DispatchInfo, PostDispatchInfo}; use frame_support::traits::IsSubType; @@ -18,7 +15,7 @@ use sp_runtime::{ use sp_std::marker::PhantomData; use sp_std::vec::Vec; use subtensor_macros::freeze_struct; -use subtensor_runtime_common::{NetUid, NetUidStorageIndex}; +use subtensor_runtime_common::{CustomTransactionError, NetUid, NetUidStorageIndex}; const ADD_STAKE_BURN_PRIORITY_BOOST: u64 = 100; diff --git a/pallets/subtensor/src/lib.rs b/pallets/subtensor/src/lib.rs index c137b92371..5c1f3678d6 100644 --- a/pallets/subtensor/src/lib.rs +++ b/pallets/subtensor/src/lib.rs @@ -10,7 +10,6 @@ use frame_system::{self as system, ensure_signed}; pub use pallet::*; use codec::{Decode, Encode}; -use frame_support::sp_runtime::transaction_validity::InvalidTransaction; use frame_support::{ dispatch::{self, DispatchResult, DispatchResultWithPostInfo}, ensure, @@ -22,7 +21,7 @@ use pallet_balances::Call as BalancesCall; // use pallet_scheduler as Scheduler; use scale_info::TypeInfo; use sp_core::Get; -use sp_runtime::{DispatchError, transaction_validity::TransactionValidityError}; +use sp_runtime::DispatchError; use sp_std::marker::PhantomData; use subtensor_runtime_common::{AlphaCurrency, Currency, CurrencyReserve, NetUid, TaoCurrency}; @@ -2473,71 +2472,6 @@ pub mod pallet { } } -#[derive(Debug, PartialEq)] -pub enum CustomTransactionError { - ColdkeySwapAnnounced, - StakeAmountTooLow, - BalanceTooLow, - SubnetNotExists, - HotkeyAccountDoesntExist, - NotEnoughStakeToWithdraw, - RateLimitExceeded, - InsufficientLiquidity, - SlippageTooHigh, - TransferDisallowed, - HotKeyNotRegisteredInNetwork, - InvalidIpAddress, - ServingRateLimitExceeded, - InvalidPort, - BadRequest, - ZeroMaxAmount, - InvalidRevealRound, - CommitNotFound, - CommitBlockNotInRevealRange, - InputLengthsUnequal, - UidNotFound, - EvmKeyAssociateRateLimitExceeded, - ColdkeySwapDisputed, - InvalidRealAccount, -} - -impl From for u8 { - fn from(variant: CustomTransactionError) -> u8 { - match variant { - CustomTransactionError::ColdkeySwapAnnounced => 0, - CustomTransactionError::StakeAmountTooLow => 1, - CustomTransactionError::BalanceTooLow => 2, - CustomTransactionError::SubnetNotExists => 3, - CustomTransactionError::HotkeyAccountDoesntExist => 4, - CustomTransactionError::NotEnoughStakeToWithdraw => 5, - CustomTransactionError::RateLimitExceeded => 6, - CustomTransactionError::InsufficientLiquidity => 7, - CustomTransactionError::SlippageTooHigh => 8, - CustomTransactionError::TransferDisallowed => 9, - CustomTransactionError::HotKeyNotRegisteredInNetwork => 10, - CustomTransactionError::InvalidIpAddress => 11, - CustomTransactionError::ServingRateLimitExceeded => 12, - CustomTransactionError::InvalidPort => 13, - CustomTransactionError::BadRequest => 255, - CustomTransactionError::ZeroMaxAmount => 14, - CustomTransactionError::InvalidRevealRound => 15, - CustomTransactionError::CommitNotFound => 16, - CustomTransactionError::CommitBlockNotInRevealRange => 17, - CustomTransactionError::InputLengthsUnequal => 18, - CustomTransactionError::UidNotFound => 19, - CustomTransactionError::EvmKeyAssociateRateLimitExceeded => 20, - CustomTransactionError::ColdkeySwapDisputed => 21, - CustomTransactionError::InvalidRealAccount => 22, - } - } -} - -impl From for TransactionValidityError { - fn from(variant: CustomTransactionError) -> Self { - TransactionValidityError::Invalid(InvalidTransaction::Custom(variant.into())) - } -} - use sp_std::vec; // TODO: unravel this rats nest, for some reason rustc thinks this is unused even though it's diff --git a/pallets/subtensor/src/macros/dispatches.rs b/pallets/subtensor/src/macros/dispatches.rs index 6330e07d1c..902dd5f43a 100644 --- a/pallets/subtensor/src/macros/dispatches.rs +++ b/pallets/subtensor/src/macros/dispatches.rs @@ -1070,8 +1070,8 @@ mod dispatches { /// Only callable by root as it doesn't require an announcement and can be used to swap any coldkey. #[pallet::call_index(71)] #[pallet::weight(Weight::from_parts(161_700_000, 0) - .saturating_add(T::DbWeight::get().reads(16_u64)) - .saturating_add(T::DbWeight::get().writes(11_u64)))] + .saturating_add(T::DbWeight::get().reads(17_u64)) + .saturating_add(T::DbWeight::get().writes(10_u64)))] pub fn swap_coldkey( origin: OriginFor, old_coldkey: T::AccountId, diff --git a/pallets/subtensor/src/tests/consensus.rs b/pallets/subtensor/src/tests/consensus.rs index 454f41e2cf..dfa4e11f0e 100644 --- a/pallets/subtensor/src/tests/consensus.rs +++ b/pallets/subtensor/src/tests/consensus.rs @@ -9,7 +9,7 @@ use super::mock::*; use crate::*; use frame_support::assert_ok; -use rand::{Rng, SeedableRng, distributions::Uniform, rngs::StdRng, seq::SliceRandom, thread_rng}; +use rand::{RngExt, SeedableRng, distr::Uniform, rngs::StdRng, seq::SliceRandom}; use sp_core::U256; use std::time::Instant; use substrate_fixed::transcendental::{PI, cos, ln, sqrt}; @@ -111,7 +111,7 @@ fn distribute_nodes( } else if interleave == 2 { // random interleaving let mut permuted_uids: Vec = (0..network_n as u16).collect(); - permuted_uids.shuffle(&mut thread_rng()); + permuted_uids.shuffle(&mut rand::rng()); validators = permuted_uids[0..validators_n].into(); servers = permuted_uids[validators_n..network_n].into(); } @@ -207,7 +207,7 @@ fn init_run_epochs( // === Set weights let mut rng = StdRng::seed_from_u64(random_seed); // constant seed so weights over multiple runs are equal - let range = Uniform::new(0, u16::MAX); + let range = Uniform::new(0, u16::MAX).unwrap(); let mut weights: Vec = vec![u16::MAX / n; servers.len()]; for uid in validators { if random_weights { @@ -306,7 +306,7 @@ fn split_graph( let stddev: I32F32 = I32F32::from_num(0.3); let total_stake: I64F64 = I64F64::from_num(21_000_000_000_000_000_u64); let mut rng = StdRng::seed_from_u64(0); // constant seed so weights over multiple runs are equal - let dist = Uniform::new(0, u16::MAX); + let dist = Uniform::new(0, u16::MAX).unwrap(); let mut stake: Vec = vec![0; network_n]; let mut stake_fixed: Vec = vec![zero; network_n]; diff --git a/pallets/subtensor/src/tests/epoch.rs b/pallets/subtensor/src/tests/epoch.rs index 32f754f78d..c6312cc3ff 100644 --- a/pallets/subtensor/src/tests/epoch.rs +++ b/pallets/subtensor/src/tests/epoch.rs @@ -9,7 +9,7 @@ use std::time::Instant; use approx::assert_abs_diff_eq; use frame_support::{assert_err, assert_ok}; -use rand::{Rng, SeedableRng, distributions::Uniform, rngs::StdRng, seq::SliceRandom, thread_rng}; +use rand::{RngExt, SeedableRng, distr::Uniform, rngs::StdRng, seq::SliceRandom}; use sp_core::{Get, U256}; use substrate_fixed::types::I32F32; use subtensor_runtime_common::{AlphaCurrency, NetUidStorageIndex, TaoCurrency}; @@ -104,7 +104,7 @@ fn distribute_nodes( } else if interleave == 2 { // random interleaving let mut permuted_uids: Vec = (0..network_n as u16).collect(); - permuted_uids.shuffle(&mut thread_rng()); + permuted_uids.shuffle(&mut rand::rng()); validators = permuted_uids[0..validators_n].into(); servers = permuted_uids[validators_n..network_n].into(); } @@ -200,7 +200,7 @@ fn init_run_epochs( // === Set weights let mut rng = StdRng::seed_from_u64(random_seed); // constant seed so weights over multiple runs are equal - let range = Uniform::new(0, u16::MAX); + let range = Uniform::new(0, u16::MAX).unwrap(); let mut weights: Vec = vec![u16::MAX / n; servers.len()]; for uid in validators { if random_weights { diff --git a/pallets/subtensor/src/tests/evm.rs b/pallets/subtensor/src/tests/evm.rs index 6d668d738d..ae0acde27a 100644 --- a/pallets/subtensor/src/tests/evm.rs +++ b/pallets/subtensor/src/tests/evm.rs @@ -9,6 +9,7 @@ use super::mock::*; use crate::*; use frame_support::testing_prelude::*; use sp_core::{H160, Pair, U256, blake2_256, ecdsa, keccak_256}; +use std::convert::AsRef; fn public_to_evm_key(pubkey: &ecdsa::Public) -> H160 { use libsecp256k1::PublicKey; @@ -103,7 +104,11 @@ fn test_associate_evm_key_different_block_number_success() { let hashed_block_number = keccak_256(block_number.encode().as_ref()); let hotkey_bytes = hotkey.encode(); - let message = [hotkey_bytes.as_ref(), hashed_block_number.as_ref()].concat(); + let message = [ + hotkey_bytes.as_ref(), + <[u8; 32] as AsRef<[u8]>>::as_ref(&hashed_block_number), + ] + .concat(); let signature = sign_evm_message(&pair, message); assert_ok!(SubtensorModule::associate_evm_key( @@ -145,7 +150,11 @@ fn test_associate_evm_key_coldkey_does_not_own_hotkey() { let hashed_block_number = keccak_256(block_number.encode().as_ref()); let hotkey_bytes = hotkey.encode(); - let message = [hotkey_bytes.as_ref(), hashed_block_number.as_ref()].concat(); + let message = [ + hotkey_bytes.as_ref(), + <[u8; 32] as AsRef<[u8]>>::as_ref(&hashed_block_number), + ] + .concat(); let signature = sign_evm_message(&pair, message); assert_err!( @@ -182,7 +191,11 @@ fn test_associate_evm_key_hotkey_not_registered_in_subnet() { let hashed_block_number = keccak_256(block_number.encode().as_ref()); let hotkey_bytes = hotkey.encode(); - let message = [hotkey_bytes.as_ref(), hashed_block_number.as_ref()].concat(); + let message = [ + hotkey_bytes.as_ref(), + <[u8; 32] as AsRef<[u8]>>::as_ref(&hashed_block_number), + ] + .concat(); let signature = sign_evm_message(&pair, message); assert_err!( @@ -222,7 +235,11 @@ fn test_associate_evm_key_using_wrong_hash_function() { let hashed_block_number = keccak_256(block_number.encode().as_ref()); let hotkey_bytes = hotkey.encode(); - let message = [hotkey_bytes.as_ref(), hashed_block_number.as_ref()].concat(); + let message = [ + hotkey_bytes.as_ref(), + <[u8; 32] as AsRef<[u8]>>::as_ref(&hashed_block_number), + ] + .concat(); let hashed_message = blake2_256(message.as_ref()); let signature = pair.sign_prehashed(&hashed_message); @@ -262,7 +279,11 @@ fn test_associate_evm_key_rate_limit_exceeded() { let hashed_block_number = keccak_256(block_number.encode().as_ref()); let hotkey_bytes = hotkey.encode(); - let message = [hotkey_bytes.as_ref(), hashed_block_number.as_ref()].concat(); + let message = [ + hotkey_bytes.as_ref(), + <[u8; 32] as AsRef<[u8]>>::as_ref(&hashed_block_number), + ] + .concat(); let signature = sign_evm_message(&pair, message); // First association should succeed @@ -278,7 +299,11 @@ fn test_associate_evm_key_rate_limit_exceeded() { let block_number = frame_system::Pallet::::block_number(); let hashed_block_number = keccak_256(block_number.encode().as_ref()); let hotkey_bytes = hotkey.encode(); - let message = [hotkey_bytes.as_ref(), hashed_block_number.as_ref()].concat(); + let message = [ + hotkey_bytes.as_ref(), + <[u8; 32] as AsRef<[u8]>>::as_ref(&hashed_block_number), + ] + .concat(); let signature = sign_evm_message(&pair, message); // Second association should fail due to rate limit @@ -297,7 +322,11 @@ fn test_associate_evm_key_rate_limit_exceeded() { let block_number = frame_system::Pallet::::block_number(); let hashed_block_number = keccak_256(block_number.encode().as_ref()); let hotkey_bytes = hotkey.encode(); - let message = [hotkey_bytes.as_ref(), hashed_block_number.as_ref()].concat(); + let message = [ + hotkey_bytes.as_ref(), + <[u8; 32] as AsRef<[u8]>>::as_ref(&hashed_block_number), + ] + .concat(); let signature = sign_evm_message(&pair, message); assert_ok!(SubtensorModule::associate_evm_key( @@ -329,7 +358,11 @@ fn test_associate_evm_key_uid_not_found() { let hashed_block_number = keccak_256(block_number.encode().as_ref()); let hotkey_bytes = hotkey.encode(); - let message = [hotkey_bytes.as_ref(), hashed_block_number.as_ref()].concat(); + let message = [ + hotkey_bytes.as_ref(), + <[u8; 32] as AsRef<[u8]>>::as_ref(&hashed_block_number), + ] + .concat(); let signature = sign_evm_message(&pair, message); assert_noop!( diff --git a/pallets/subtensor/src/tests/math.rs b/pallets/subtensor/src/tests/math.rs index 6c6636ca68..6591d975b0 100644 --- a/pallets/subtensor/src/tests/math.rs +++ b/pallets/subtensor/src/tests/math.rs @@ -6,7 +6,7 @@ use substrate_fixed::types::{I32F32, I64F64}; use crate::epoch::math::*; -use rand::{Rng, seq::SliceRandom, thread_rng}; +use rand::{RngExt, seq::SliceRandom}; use substrate_fixed::{ transcendental::exp, types::{I96F32, I110F18}, @@ -1437,7 +1437,7 @@ fn test_math_col_clip_sparse() { #[test] fn test_math_weighted_median() { - let mut rng = thread_rng(); + let mut rng = rand::rng(); let zero: I32F32 = fixed(0.); let one: I32F32 = fixed(1.); for _ in 0..100 { @@ -1631,11 +1631,11 @@ fn test_math_weighted_median() { let mut last_score: I32F32 = zero; for i in 0..n { if allow_equal { - match rng.gen_range(0..2) { + match rng.random_range(0..2) { 1 => stake.push(one), _ => stake.push(zero), } - if rng.gen_range(0..2) == 1 { + if rng.random_range(0..2) == 1 { last_score += one } score.push(last_score); @@ -1681,7 +1681,7 @@ fn test_math_weighted_median() { assert!(medians.contains(&result)); for _ in 0..10 { let mut permuted_uids: Vec = (0..n).collect(); - permuted_uids.shuffle(&mut thread_rng()); + permuted_uids.shuffle(&mut rng); stake = permuted_uids.iter().map(|&i| stake[i]).collect(); score = permuted_uids.iter().map(|&i| score[i]).collect(); let result: I32F32 = diff --git a/pallets/subtensor/src/tests/mock.rs b/pallets/subtensor/src/tests/mock.rs index 94ae2d240d..1b7b1740df 100644 --- a/pallets/subtensor/src/tests/mock.rs +++ b/pallets/subtensor/src/tests/mock.rs @@ -25,7 +25,7 @@ use sp_core::{ConstU64, Get, H256, U256, offchain::KeyTypeId}; use sp_runtime::Perbill; use sp_runtime::{ BuildStorage, Percent, - traits::{BadOrigin, BlakeTwo256, IdentityLookup}, + traits::{BlakeTwo256, IdentityLookup}, }; use sp_std::{cell::RefCell, cmp::Ordering, sync::OnceLock}; use sp_tracing::tracing_subscriber; @@ -582,19 +582,9 @@ impl pallet_aura::Config for Test { type SlotDuration = SlotDuration; } -pub struct TestAuthorityOrigin; - -impl pallet_shield::AuthorityOriginExt for TestAuthorityOrigin { - type AccountId = U256; - - fn ensure_validator(_origin: RuntimeOrigin) -> Result { - Ok(U256::from(0)) - } -} - impl pallet_shield::Config for Test { - type RuntimeCall = RuntimeCall; - type AuthorityOrigin = TestAuthorityOrigin; + type AuthorityId = u64; + type FindAuthors = (); } static TEST_LOGS_INIT: OnceLock<()> = OnceLock::new(); diff --git a/pallets/subtensor/src/tests/registration.rs b/pallets/subtensor/src/tests/registration.rs index 635b996cea..b98dce1d45 100644 --- a/pallets/subtensor/src/tests/registration.rs +++ b/pallets/subtensor/src/tests/registration.rs @@ -9,12 +9,14 @@ use frame_support::{assert_err, assert_noop, assert_ok}; use frame_system::{Config, RawOrigin}; use sp_core::U256; use sp_runtime::traits::{DispatchInfoOf, TransactionExtension, TxBaseImplication}; -use subtensor_runtime_common::{AlphaCurrency, Currency as CurrencyT, NetUid, NetUidStorageIndex}; +use subtensor_runtime_common::{ + AlphaCurrency, Currency as CurrencyT, CustomTransactionError, NetUid, NetUidStorageIndex, +}; use super::mock; use super::mock::*; use crate::extensions::SubtensorTransactionExtension; -use crate::{AxonInfoOf, CustomTransactionError, Error}; +use crate::{AxonInfoOf, Error}; /******************************************** subscribing::subscribe() tests diff --git a/pallets/subtensor/src/tests/serving.rs b/pallets/subtensor/src/tests/serving.rs index 552af372e3..2979d4438c 100644 --- a/pallets/subtensor/src/tests/serving.rs +++ b/pallets/subtensor/src/tests/serving.rs @@ -12,6 +12,7 @@ use frame_support::{ use frame_system::{Config, RawOrigin}; use sp_core::U256; use sp_runtime::traits::{DispatchInfoOf, TransactionExtension, TxBaseImplication}; +use subtensor_runtime_common::CustomTransactionError; mod test { use std::net::{Ipv4Addr, Ipv6Addr}; diff --git a/pallets/subtensor/src/tests/weights.rs b/pallets/subtensor/src/tests/weights.rs index 2c64b23d32..388c5229a1 100644 --- a/pallets/subtensor/src/tests/weights.rs +++ b/pallets/subtensor/src/tests/weights.rs @@ -21,7 +21,7 @@ use sp_runtime::{ }; use sp_std::collections::vec_deque::VecDeque; use substrate_fixed::types::I32F32; -use subtensor_runtime_common::{NetUidStorageIndex, TaoCurrency}; +use subtensor_runtime_common::{CustomTransactionError, NetUidStorageIndex, TaoCurrency}; use subtensor_swap_interface::SwapHandler; use tle::{ curves::drand::TinyBLS381, diff --git a/pallets/subtensor/src/utils/evm.rs b/pallets/subtensor/src/utils/evm.rs index 88f856b25e..3363a9ade5 100644 --- a/pallets/subtensor/src/utils/evm.rs +++ b/pallets/subtensor/src/utils/evm.rs @@ -64,7 +64,11 @@ impl Pallet { Self::ensure_evm_key_associate_rate_limit(netuid, uid)?; let block_hash = keccak_256(block_number.encode().as_ref()); - let message = [hotkey.encode().as_ref(), block_hash.as_ref()].concat(); + let message = [ + hotkey.encode().as_ref(), + <[u8; 32] as AsRef<[u8]>>::as_ref(&block_hash), + ] + .concat(); let public = signature .recover_prehashed(&Self::hash_message_eip191(message)) .ok_or(Error::::InvalidIdentity)?; diff --git a/primitives/io/Cargo.toml b/primitives/io/Cargo.toml new file mode 100644 index 0000000000..d82921105c --- /dev/null +++ b/primitives/io/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "stp-io" +description = "Subtensor runtime primitives for I/O" +version = "0.1.0" +edition.workspace = true + + +[dependencies] +codec.workspace = true +sp-runtime-interface.workspace = true +sp-externalities.workspace = true +stp-shield.workspace = true + +[lints] +workspace = true + +[features] +default = ["std"] +std = [ + "codec/std", + "sp-runtime-interface/std", + "sp-externalities/std", + "stp-shield/std", +] diff --git a/primitives/io/README.md b/primitives/io/README.md new file mode 100644 index 0000000000..84f28e3742 --- /dev/null +++ b/primitives/io/README.md @@ -0,0 +1,32 @@ +# stp-io + +`stp` = **Subtensor Primitive**. + +Host functions that allow the Subtensor runtime (Wasm) to call into the node's native code for operations that cannot run inside the sandbox. + +## Host functions + +### `crypto::mlkem768_decapsulate` + +Decapsulates an ML-KEM-768 ciphertext using the key material held in the node's `ShieldKeystore`. Writes the 32-byte shared secret into the caller-provided buffer. + +### `crypto::aead_decrypt` + +Decrypts an XChaCha20-Poly1305 ciphertext given a 32-byte key, 24-byte nonce, message, and optional AAD. Returns the plaintext bytes. + +## How it fits in + +The runtime cannot perform cryptographic operations directly because the secret keys live on the node side. `stp-io` bridges this gap: + +``` +Runtime (Wasm) Host (native) +───────────── ───────────── +pallet-shield ShieldKeystore + │ │ + ├─ mlkem768_decapsulate ─► ML-KEM decaps + └─ aead_decrypt ─────────► XChaCha20 decrypt +``` + +The host functions are registered via `SubtensorHostFunctions` and accessed through the `ShieldKeystoreExt` externalities extension from [`stp-shield`](https://github.com/opentensor/polkadot-sdk). + +`no_std`-compatible. diff --git a/primitives/io/src/lib.rs b/primitives/io/src/lib.rs new file mode 100644 index 0000000000..5cbdc8e7cc --- /dev/null +++ b/primitives/io/src/lib.rs @@ -0,0 +1,78 @@ +//! Subtensor Primitives for IO +//! +//! This crate contains interfaces for the runtime to communicate with the outside world, ergo `io`. +//! In other context, such interfaces are referred to as "**host functions**". +#![cfg_attr(not(feature = "std"), no_std)] + +extern crate alloc; + +use codec::{Decode, Encode}; +use sp_runtime_interface::{ + pass_by::{ + AllocateAndReturnByCodec, PassFatPointerAndRead, PassPointerAndRead, PassPointerAndWrite, + }, + runtime_interface, +}; +use stp_shield::ShieldKeystoreExt; + +use alloc::{ + string::{String, ToString}, + vec::Vec, +}; + +#[cfg(not(substrate_runtime))] +use sp_externalities::ExternalitiesExt; + +#[derive(Debug, Encode, Decode)] +pub enum Error { + Crypto(String), +} + +impl core::fmt::Display for Error { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + match self { + Error::Crypto(e) => write!(f, "Crypto error: {}", e), + } + } +} + +/// Interfaces for working with crypto withing the runtime. +#[runtime_interface] +pub trait Crypto { + /// Decapsulate a ciphertext using the ML-KEM-768 algorithm. + #[allow(clippy::expect_used)] + fn mlkem768_decapsulate( + &mut self, + ciphertext: PassFatPointerAndRead<&[u8]>, + buffer: PassPointerAndWrite<&mut [u8; 32], 32>, + ) -> AllocateAndReturnByCodec> { + let result = &self + .extension::() + .expect("No `shield keystore` associated for the current context!") + .mlkem768_decapsulate(ciphertext) + .map_err(|e| Error::Crypto(e.to_string()))?; + buffer.copy_from_slice(result); + Ok(()) + } + + /// Decrypt a ciphertext using the XChaCha20-Poly1305 AEAD scheme. + #[allow(clippy::expect_used)] + fn aead_decrypt( + &mut self, + key: PassPointerAndRead<&[u8; 32], 32>, + nonce: PassPointerAndRead<&[u8; 24], 24>, + msg: PassFatPointerAndRead<&[u8]>, + aad: PassFatPointerAndRead<&[u8]>, + ) -> AllocateAndReturnByCodec, Error>> { + self.extension::() + .expect("No `shield keystore` associated for the current context!") + .aead_decrypt(*key, *nonce, msg, aad) + .map_err(|e| Error::Crypto(e.to_string())) + } +} + +/// The host functions Subtensor provides for the Wasm runtime environment. +/// +/// All these host functions will be callable from inside the Wasm environment. +#[cfg(not(substrate_runtime))] +pub type SubtensorHostFunctions = (crypto::HostFunctions,); diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 95564977cf..83dc30a121 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -59,6 +59,8 @@ sp-version.workspace = true sp-authority-discovery.workspace = true subtensor-runtime-common.workspace = true subtensor-precompiles.workspace = true +sp-debug-derive = { workspace = true, features = [] } +stp-io.workspace = true # Temporary sudo pallet-sudo.workspace = true @@ -139,7 +141,6 @@ fp-account.workspace = true #drand pallet-drand.workspace = true -getrandom.workspace = true tle.workspace = true hex.workspace = true rand_chacha.workspace = true @@ -152,6 +153,7 @@ pallet-crowdloan.workspace = true # Mev Shield pallet-shield.workspace = true +stp-shield.workspace = true ethereum.workspace = true @@ -258,7 +260,6 @@ std = [ "pallet-hotfix-sufficients/std", "fp-account/std", "pallet-drand/std", - "getrandom/std", "tle/std", "ark-serialize/std", "hex/std", @@ -278,6 +279,9 @@ std = [ "subtensor-chain-extensions/std", "ethereum/std", "pallet-shield/std", + "stp-shield/std", + "stp-io/std", + "sp-debug-derive/std", ] runtime-benchmarks = [ "frame-benchmarking/runtime-benchmarks", diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 460a84e049..7bccff650c 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -72,6 +72,7 @@ use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; +use stp_shield::ShieldedTransaction; use substrate_fixed::types::U64F64; use subtensor_precompiles::Precompiles; use subtensor_runtime_common::{AlphaCurrency, AuthorshipInfo, TaoCurrency, time::*, *}; @@ -126,9 +127,28 @@ impl frame_system::offchain::SigningTypes for Runtime { type Signature = Signature; } +pub struct FindAuraAuthors; +impl pallet_shield::FindAuthors for FindAuraAuthors { + fn find_current_author() -> Option { + let slot = Aura::current_slot_from_digests()?; + let authorities = pallet_aura::Authorities::::get().into_inner(); + let author_index = *slot % authorities.len() as u64; + + authorities.get(author_index as usize).cloned() + } + + fn find_next_author() -> Option { + let next_slot = Aura::current_slot_from_digests()?.checked_add(1)?; + let authorities = pallet_aura::Authorities::::get().into_inner(); + let next_author_index = next_slot % authorities.len() as u64; + + authorities.get(next_author_index as usize).cloned() + } +} + impl pallet_shield::Config for Runtime { - type RuntimeCall = RuntimeCall; - type AuthorityOrigin = pallet_shield::EnsureAuraAuthority; + type AuthorityId = AuraId; + type FindAuthors = FindAuraAuthors; } parameter_types! { @@ -168,20 +188,23 @@ impl frame_system::offchain::CreateSignedTransaction use sp_runtime::traits::StaticLookup; let address = ::Lookup::unlookup(account.clone()); - let extra: TransactionExtensions = ( - frame_system::CheckNonZeroSender::::new(), - frame_system::CheckSpecVersion::::new(), - frame_system::CheckTxVersion::::new(), - frame_system::CheckGenesis::::new(), - frame_system::CheckEra::::from(Era::Immortal), - check_nonce::CheckNonce::::from(nonce).into(), - frame_system::CheckWeight::::new(), - ChargeTransactionPaymentWrapper::new( - pallet_transaction_payment::ChargeTransactionPayment::::from(0), + let extra: TxExtension = ( + ( + frame_system::CheckNonZeroSender::::new(), + frame_system::CheckSpecVersion::::new(), + frame_system::CheckTxVersion::::new(), + frame_system::CheckGenesis::::new(), + frame_system::CheckEra::::from(Era::Immortal), + check_nonce::CheckNonce::::from(nonce).into(), + frame_system::CheckWeight::::new(), + ), + ( + ChargeTransactionPaymentWrapper::new(0), + SudoTransactionExtension::::new(), + pallet_shield::CheckShieldedTxValidity::::new(), + pallet_subtensor::SubtensorTransactionExtension::::new(), + pallet_drand::drand_priority::DrandPriority::::new(), ), - SudoTransactionExtension::::new(), - pallet_subtensor::SubtensorTransactionExtension::::new(), - pallet_drand::drand_priority::DrandPriority::::new(), frame_metadata_hash_extension::CheckMetadataHash::::new(true), ); @@ -243,7 +266,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // `spec_version`, and `authoring_version` are the same between Wasm and native. // This value is set to 100 to notify Polkadot-JS App (https://polkadot.js.org/apps) to use // the compatible custom types. - spec_version: 380, + spec_version: 381, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, @@ -1594,7 +1617,7 @@ pub type Header = generic::Header; // Block type as expected by this runtime. pub type Block = generic::Block; // The extensions to the basic transaction logic. -pub type TransactionExtensions = ( +pub type SystemTxExtension = ( frame_system::CheckNonZeroSender, frame_system::CheckSpecVersion, frame_system::CheckTxVersion, @@ -1602,10 +1625,17 @@ pub type TransactionExtensions = ( frame_system::CheckEra, check_nonce::CheckNonce, frame_system::CheckWeight, +); +pub type CustomTxExtension = ( ChargeTransactionPaymentWrapper, SudoTransactionExtension, + pallet_shield::CheckShieldedTxValidity, pallet_subtensor::SubtensorTransactionExtension, pallet_drand::drand_priority::DrandPriority, +); +pub type TxExtension = ( + SystemTxExtension, + CustomTxExtension, frame_metadata_hash_extension::CheckMetadataHash, ); @@ -1619,19 +1649,22 @@ type Migrations = ( // Unchecked extrinsic type as expected by this runtime. pub type UncheckedExtrinsic = - fp_self_contained::UncheckedExtrinsic; + fp_self_contained::UncheckedExtrinsic; /// Extrinsic type that has already been checked. pub type CheckedExtrinsic = - fp_self_contained::CheckedExtrinsic; + fp_self_contained::CheckedExtrinsic; // The payload being signed in transactions. -pub type SignedPayload = generic::SignedPayload; +pub type SignedPayload = generic::SignedPayload; + +// Chain context for the executive. +pub type ChainContext = frame_system::ChainContext; // Executive: handles dispatch to the various modules. pub type Executive = frame_executive::Executive< Runtime, Block, - frame_system::ChainContext, + ChainContext, Runtime, AllPalletsWithSystem, Migrations, @@ -2561,6 +2594,16 @@ impl_runtime_apis! { ) } } + + impl stp_shield::ShieldApi for Runtime { + fn try_decode_shielded_tx(uxt: ::Extrinsic) -> Option { + MevShield::try_decode_shielded_tx::(uxt) + } + + fn try_unshield_tx(shielded_tx: ShieldedTransaction) -> Option<::Extrinsic> { + MevShield::try_unshield_tx::(shielded_tx) + } + } } #[test] diff --git a/runtime/src/transaction_payment_wrapper.rs b/runtime/src/transaction_payment_wrapper.rs index 96d7f3609b..c59e3dbba1 100644 --- a/runtime/src/transaction_payment_wrapper.rs +++ b/runtime/src/transaction_payment_wrapper.rs @@ -3,6 +3,7 @@ use codec::{Decode, DecodeWithMemTracking, Encode}; use frame_election_provider_support::private::sp_arithmetic::traits::SaturatedConversion; use frame_support::dispatch::{DispatchClass, DispatchInfo, PostDispatchInfo}; use frame_support::pallet_prelude::TypeInfo; +use pallet_transaction_payment::OnChargeTransaction; use pallet_transaction_payment::{ChargeTransactionPayment, Config, Pre, Val}; use sp_runtime::DispatchResult; use sp_runtime::traits::{ @@ -15,11 +16,13 @@ use sp_runtime::transaction_validity::{ use sp_std::vec::Vec; use subtensor_macros::freeze_struct; -#[freeze_struct("5f10cb9db06873c0")] +type BalanceOf = <::OnChargeTransaction as OnChargeTransaction>::Balance; + +#[freeze_struct("f003cde1f9da4a90")] #[derive(Encode, Decode, DecodeWithMemTracking, Clone, Eq, PartialEq, TypeInfo)] #[scale_info(skip_type_params(T))] pub struct ChargeTransactionPaymentWrapper { - charge_transaction_payment: ChargeTransactionPayment, + inner: ChargeTransactionPayment, } impl core::fmt::Debug for ChargeTransactionPaymentWrapper { @@ -33,11 +36,14 @@ impl core::fmt::Debug for ChargeTransactionPaymentWrapper { } } -impl ChargeTransactionPaymentWrapper { - pub fn new(charge_transaction_payment: ChargeTransactionPayment) -> Self { - Self { - charge_transaction_payment, - } +impl ChargeTransactionPaymentWrapper +where + T::RuntimeCall: Dispatchable, + BalanceOf: Send + Sync, +{ + pub fn new(fee: BalanceOf) -> Self { + let inner = ChargeTransactionPayment::::from(fee); + Self { inner } } } @@ -51,7 +57,7 @@ where type Pre = Pre; fn weight(&self, call: &T::RuntimeCall) -> Weight { - self.charge_transaction_payment.weight(call) + self.inner.weight(call) } fn validate( @@ -64,7 +70,7 @@ where inherited_implication: &impl Implication, source: TransactionSource, ) -> ValidateResult { - let inner_validate = self.charge_transaction_payment.validate( + let inner_validate = self.inner.validate( origin, call, info, @@ -101,8 +107,7 @@ where info: &DispatchInfoOf, len: usize, ) -> Result { - self.charge_transaction_payment - .prepare(val, origin, call, info, len) + self.inner.prepare(val, origin, call, info, len) } fn metadata() -> Vec { ChargeTransactionPayment::::metadata() diff --git a/scripts/fix_rust.sh b/scripts/fix_rust.sh index 08e983a432..811eb86bca 100755 --- a/scripts/fix_rust.sh +++ b/scripts/fix_rust.sh @@ -12,15 +12,15 @@ commit_if_changes() { } # Step 1: Run cargo check and commit changes to Cargo.lock if any -cargo check --workspace +SKIP_WASM_BUILD=1 cargo check --workspace commit_if_changes "commit Cargo.lock" # Step 2: Run cargo clippy with fixes and commit changes if any. -cargo clippy --fix --workspace --all-features --all-targets +SKIP_WASM_BUILD=1 cargo clippy --fix --workspace --all-features --all-targets commit_if_changes "cargo clippy" # Step 3: Run cargo fix and commit changes if any. -cargo fix --workspace --all-features --all-targets +SKIP_WASM_BUILD=1 cargo fix --workspace --all-features --all-targets commit_if_changes "cargo fix" # Step 4: Run cargo fmt and commit changes if any.