From 6087dc00024df758578834341cd2b521bbe04fec Mon Sep 17 00:00:00 2001 From: Tadeo Hepperle <62739623+tadeohepperle@users.noreply.github.com> Date: Fri, 12 May 2023 11:27:24 +0200 Subject: [PATCH] speed up ui tests. (#944) * speed up ui tests by reducing number of pallets * add small and tiny versions of polkadot metadata * change drop implementation fix test * rust yml add nextest and merge tests * 2 * 3 * 4 * 5 * 6 * add script for generating files * Upgrade to `syn 2.0` (#875) * WIP updating to syn 2.0.0 * WIP darling compat * Update darling and syn workspace deps * NestedMeta::parse_meta_list * Rename attribute keyword type property to path * Fmt * Update more type to path * Unused darling * Cargo.lock * Add missing syn features * Metadata V15: Generate Runtime APIs (#918) * Update frame-metadata to v15.1.0 Signed-off-by: Alexandru Vasile * Enable V15 unstable metadata in frame-metadata Signed-off-by: Alexandru Vasile * metadata: Move validation hashing to dedicated file Signed-off-by: Alexandru Vasile * Use sp-metadata-ir from substrate to work with metadata Signed-off-by: Alexandru Vasile * Revert using sp-metadata-ir in favor of conversion to v15 Signed-off-by: Alexandru Vasile * metadata: Convert v14 to v15 Signed-off-by: Alexandru Vasile * metadata: Use v15 for validation Signed-off-by: Alexandru Vasile * codegen: Use v15 for codegen Signed-off-by: Alexandru Vasile * metadata/bench: Use v15 Signed-off-by: Alexandru Vasile * Adjust to v15 metadata Signed-off-by: Alexandru Vasile * Adjust testing Signed-off-by: Alexandru Vasile * Improve documentation Signed-off-by: Alexandru Vasile * force CI Signed-off-by: Alexandru Vasile * rpc: Fetch metadata at version Signed-off-by: Alexandru Vasile * artifacts: Update polkadot.scale from commit 6dc9e84dde2 Signed-off-by: Alexandru Vasile * codegen: Fetch V15 using the new API Signed-off-by: Alexandru Vasile * codegen: Add runtime API interface Signed-off-by: Alexandru Vasile * metadata: Hash runtime API metadata for validation Signed-off-by: Alexandru Vasile * metadata: Extract runtime API metadata wrapper from subxt::Metadata Signed-off-by: Alexandru Vasile * subxt: Adjust hashing cache to reflect root+item keys Signed-off-by: Alexandru Vasile * rpc: Add raw state_call API method Signed-off-by: Alexandru Vasile * runtime_api: Add payload with static and dynamic variants Signed-off-by: Alexandru Vasile * subxt: Allow payloads to call into the runtime Signed-off-by: Alexandru Vasile * examples: Add example to make a runtime API call both static and dynamic Signed-off-by: Alexandru Vasile * Update polkadot.rs Signed-off-by: Alexandru Vasile * codegen: Simplify client fetching Signed-off-by: Alexandru Vasile * Address feedback and fallback to old API if needed Signed-off-by: Alexandru Vasile * runtime_api: Make mutability conditional on input params Signed-off-by: Alexandru Vasile * Regenerate polkadot.rs Signed-off-by: Alexandru Vasile * metadata: Retain only pallets without runtime API info Signed-off-by: Alexandru Vasile * codegen: Retry via `Metadata_metadata` without conversion Signed-off-by: Alexandru Vasile * payload: Remove `Decode` and change validation fn Signed-off-by: Alexandru Vasile * metadata: Retain runtime API types Signed-off-by: Alexandru Vasile * codegen: Runtime APIs documentation based on flag Signed-off-by: Alexandru Vasile * Update examples/examples/custom_metadata_url.rs Co-authored-by: James Wilson * Update artifacts from polkadot-a6cfdb16e9 Signed-off-by: Alexandru Vasile * Update polkadot.rs with polkadot-a6cfdb16e9 Signed-off-by: Alexandru Vasile * codegen: Generate input structures for runtime API Signed-off-by: Alexandru Vasile * runtime_api: Remove the static paylaod and use single impl Signed-off-by: Alexandru Vasile * examples: Fetch account nonce Signed-off-by: Alexandru Vasile * testing: Adjust build script to fetch latest metadata Signed-off-by: Alexandru Vasile * testing: Check account nonce from runtime API Signed-off-by: Alexandru Vasile * Update cargo.lock Signed-off-by: Alexandru Vasile * codegen: Fix doc generation for runtime types Signed-off-by: Alexandru Vasile * codegen: Rename `inputs` runtime calls module to `types` Signed-off-by: Alexandru Vasile * codegen: Generate Calls structs inside the types module Signed-off-by: Alexandru Vasile * testing: Check Alice account nonce before submitting the tx Signed-off-by: Alexandru Vasile * cli: Add metadata version option flag supporting v14 and unstable Signed-off-by: Alexandru Vasile * cli: Specify version to fetch Signed-off-by: Alexandru Vasile * subxt: Fallback to fetching latest stable metadata Signed-off-by: Alexandru Vasile * subxt: Add unstable-metadata feature to fetch the latest Signed-off-by: Alexandru Vasile * RuntimeVersion with Latest and Version(u32) Signed-off-by: Alexandru Vasile * Update polkadot.rs Signed-off-by: Alexandru Vasile * codegen: Adjust fetch_metadata to inspect version list Signed-off-by: Alexandru Vasile * testing: Adjust metadata to metadata_legacy Signed-off-by: Alexandru Vasile * events: Adjust docs to use metadata_legacy Signed-off-by: Alexandru Vasile * have a pass over fetch_metadata * cargo fmt * Option when fetch metadata via latest API * clippy * fmt * cli: Use the MetadataVersion from codegen Signed-off-by: Alexandru Vasile * cli: Specify latest as default for MetadataVersion Signed-off-by: Alexandru Vasile * cli: Remove version from metadata and use the one from file_or_url Signed-off-by: Alexandru Vasile * Fix clippy Signed-off-by: Alexandru Vasile * codegen: Decode metadata independently for different RPC calls Signed-off-by: Alexandru Vasile --------- Signed-off-by: Alexandru Vasile Co-authored-by: James Wilson * add small and tiny versions of polkadot metadata * add script for generating files * new metadata * Runtime APIs; don't ask for validation hash anywhere except new_static (#947) * remove validation hash where not wanted * .into() * fix example * cargo fmt * Subxt Guide (#890) * WIP Starting to write book; extrinsics first pass done * cargo fmt * Ongoing work; events, constants, wip blocks * at_latest() and wip blocks * remove need to import parity-scale-codec crate with Subxt for macro to work * More docs; expanding on setup guide and finish pass of main sections * Tidy and remove example section for now * format book lines to 100chars * Fix example code * cargo fmt * cargo fmt * fix example * Fix typos * fix broken doc links, pub mods * Update Subxt macro docs * can't link to Subxt here * move macro docs to Subxt to make linking better and fix example code * note on macro about docs * cargo fmt * document the no_default_derives macro feature * Address feedback and remove redundant text * address review comments; minor tweaks * WIP add Runtime calls to book * Improve Runtime API docs * expose thing we forgot to expose and doc link fixes * use new metadata files in book * use mtadata full in docs * regenerate polkadot.rs * use small metadata in a couple of places * Update scripts/artifacts.sh Co-authored-by: Niklas Adolfsson --------- Signed-off-by: Alexandru Vasile Co-authored-by: Andrew Jones Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Co-authored-by: James Wilson Co-authored-by: Niklas Adolfsson --- .github/workflows/rust.yml | 436 ++++----- ...ata.scale => polkadot_metadata_full.scale} | Bin 404080 -> 406034 bytes artifacts/polkadot_metadata_small.scale | Bin 0 -> 141585 bytes artifacts/polkadot_metadata_tiny.scale | Bin 0 -> 33895 bytes codegen/src/lib.rs | 2 +- examples/examples/blocks_subscribing.rs | 2 +- examples/examples/constants_static.rs | 2 +- examples/examples/events.rs | 2 +- examples/examples/runtime_apis_dynamic.rs | 2 +- examples/examples/runtime_apis_raw.rs | 2 +- examples/examples/runtime_apis_static.rs | 2 +- examples/examples/setup_client_offline.rs | 2 +- examples/examples/storage_fetch.rs | 2 +- examples/examples/storage_iterating.rs | 3 +- examples/examples/tx_basic.rs | 2 +- examples/examples/tx_status_stream.rs | 2 +- examples/examples/tx_with_params.rs | 2 +- metadata/benches/bench.rs | 2 +- metadata/src/retain.rs | 2 +- scripts/artifacts.sh | 21 + subxt/src/book/setup/codegen.rs | 2 +- subxt/src/book/usage/constants.rs | 2 +- subxt/src/book/usage/runtime_apis.rs | 2 +- subxt/src/book/usage/storage.rs | 4 +- subxt/src/book/usage/transactions.rs | 2 +- subxt/src/lib.rs | 18 +- subxt/src/rpc/mod.rs | 2 +- subxt/src/rpc/rpc.rs | 2 +- subxt/src/storage/storage_type.rs | 4 +- testing/integration-tests/src/codegen/mod.rs | 2 +- .../integration-tests/src/codegen/polkadot.rs | 866 +++++++++++++----- .../ui-tests/src/correct/generic_params.rs | 16 +- .../src/correct/rust_items_preserved.rs | 2 +- .../incorrect/substitute_path_not_absolute.rs | 2 +- .../src/incorrect/url_and_path_provided.rs | 2 +- .../incorrect/url_and_path_provided.stderr | 2 +- testing/ui-tests/src/lib.rs | 3 +- .../src/utils/pallet_metadata_test_runner.rs | 35 +- 38 files changed, 891 insertions(+), 565 deletions(-) rename artifacts/{polkadot_metadata.scale => polkadot_metadata_full.scale} (72%) create mode 100644 artifacts/polkadot_metadata_small.scale create mode 100644 artifacts/polkadot_metadata_tiny.scale create mode 100755 scripts/artifacts.sh diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index ca717ccf61..803f2e72fd 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -1,306 +1,216 @@ name: Rust on: - push: - # Run jobs when commits are pushed to - # master or release-like branches: - branches: - - master - pull_request: - # Run jobs for any external PR that wants - # to merge to master, too: - branches: - - master + push: + # Run jobs when commits are pushed to + # master or release-like branches: + branches: + - master + pull_request: + # Run jobs for any external PR that wants + # to merge to master, too: + branches: + - master concurrency: - group: ${{ github.ref }}-${{ github.workflow }} - cancel-in-progress: true + group: ${{ github.ref }}-${{ github.workflow }} + cancel-in-progress: true env: - CARGO_TERM_COLOR: always - # TODO: Currently pointing at latest substrate; is there a suitable binary we can pin to here? - SUBSTRATE_URL: https://releases.parity.io/substrate/x86_64-debian:stretch/latest/substrate/substrate + CARGO_TERM_COLOR: always + # TODO: Currently pointing at latest substrate; is there a suitable binary we can pin to here? + SUBSTRATE_URL: https://releases.parity.io/substrate/x86_64-debian:stretch/latest/substrate/substrate jobs: - build: - name: Cargo check - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v3 + build: + name: Cargo check + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v3 - - name: Download Substrate - run: | - curl $SUBSTRATE_URL --output substrate --location - chmod +x substrate - ./substrate --version - mkdir -p ~/.local/bin - mv substrate ~/.local/bin + - name: Download Substrate + run: | + curl $SUBSTRATE_URL --output substrate --location + chmod +x substrate + ./substrate --version + mkdir -p ~/.local/bin + mv substrate ~/.local/bin - - name: Install Rust stable toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true + - name: Install Rust stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true - - name: Rust Cache - uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 + - name: Rust Cache + uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 - - name: Install cargo-hack - uses: baptiste0928/cargo-install@v2 - with: - crate: cargo-hack - version: 0.5 + - name: Install cargo-hack + uses: baptiste0928/cargo-install@v2 + with: + crate: cargo-hack + version: 0.5 - - name: Cargo check - run: cargo hack --exclude-all-features --each-feature check --all-targets --workspace + - name: Cargo check + run: cargo hack --exclude-all-features --each-feature check --all-targets --workspace - fmt: - name: Cargo fmt - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v3 + fmt: + name: Cargo fmt + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v3 - - name: Install Rust nightly toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true - components: rustfmt + - name: Install Rust nightly toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + components: rustfmt - - name: Rust Cache - uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 + - name: Rust Cache + uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 - - name: Cargo fmt - uses: actions-rs/cargo@v1.0.3 - with: - command: fmt - args: --all -- --check + - name: Cargo fmt + uses: actions-rs/cargo@v1.0.3 + with: + command: fmt + args: --all -- --check - docs: - name: Check documentation - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v3 + docs: + name: Check documentation and run doc tests + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v3 - - name: Download Substrate - run: | - curl $SUBSTRATE_URL --output substrate --location - chmod +x substrate - ./substrate --version - mkdir -p ~/.local/bin - mv substrate ~/.local/bin + - name: Download Substrate + run: | + curl $SUBSTRATE_URL --output substrate --location + chmod +x substrate + ./substrate --version + mkdir -p ~/.local/bin + mv substrate ~/.local/bin - - name: Install Rust stable toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true + - name: Install Rust stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true - - name: Rust Cache - uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 + - name: Rust Cache + uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 - - name: Check internal documentation links - run: RUSTDOCFLAGS="--deny rustdoc::broken_intra_doc_links" cargo doc -vv --workspace --no-deps --document-private-items + - name: Check internal documentation links + run: RUSTDOCFLAGS="--deny rustdoc::broken_intra_doc_links" cargo doc -vv --workspace --no-deps --document-private-items - - name: Run cargo test on documentation - uses: actions-rs/cargo@v1.0.3 - with: - command: test - args: --doc + - name: Run cargo test on documentation + uses: actions-rs/cargo@v1.0.3 + with: + command: test + args: --doc - test-docs: - name: "Test: docs" - runs-on: ubuntu-latest-8-cores - steps: - - name: Checkout sources - uses: actions/checkout@v3 + nonwasm_tests: + name: "Test non-wasm" + runs-on: ubuntu-latest-16-cores + steps: + - name: Checkout sources + uses: actions/checkout@v3 - - name: Download Substrate - run: | - curl $SUBSTRATE_URL --output substrate --location - chmod +x substrate - ./substrate --version - mkdir -p ~/.local/bin - mv substrate ~/.local/bin + - name: Download Substrate + run: | + curl $SUBSTRATE_URL --output substrate --location + chmod +x substrate + ./substrate --version + mkdir -p ~/.local/bin + mv substrate ~/.local/bin - - name: Install Rust stable toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true + - name: Install Rust stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true - - name: Rust Cache - uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 + - name: Rust Cache + uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 - - name: Run tests - uses: actions-rs/cargo@v1.0.3 - with: - command: test - args: --doc + - name: Install cargo-nextest + run: cargo install cargo-nextest - test-integration: - name: "Test: integration tests" - runs-on: ubuntu-latest-16-cores - steps: - - name: Checkout sources - uses: actions/checkout@v3 + - name: Run tests + uses: actions-rs/cargo@v1.0.3 + with: + command: nextest + args: run --workspace - - name: Download Substrate - run: | - curl $SUBSTRATE_URL --output substrate --location - chmod +x substrate - ./substrate --version - mkdir -p ~/.local/bin - mv substrate ~/.local/bin + clippy: + name: Cargo clippy + runs-on: ubuntu-latest + steps: + - name: Checkout sources + uses: actions/checkout@v3 - - name: Install Rust stable toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true + - name: Download Substrate + run: | + curl $SUBSTRATE_URL --output substrate --location + chmod +x substrate + ./substrate --version + mkdir -p ~/.local/bin + mv substrate ~/.local/bin - - name: Rust Cache - uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 + - name: Install Rust stable toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + components: clippy + override: true - - name: Run tests - uses: actions-rs/cargo@v1.0.3 - with: - command: test - args: --all-targets --package integration-tests + - name: Rust Cache + uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 - test-ui: - name: "Test: UI tests" - runs-on: ubuntu-latest-16-cores - steps: - - name: Checkout sources - uses: actions/checkout@v3 + - name: Run clippy + uses: actions-rs/cargo@v1 + with: + command: clippy + args: --all-targets -- -D warnings - - name: Download Substrate - run: | - curl $SUBSTRATE_URL --output substrate --location - chmod +x substrate - ./substrate --version - mkdir -p ~/.local/bin - mv substrate ~/.local/bin + wasm_tests: + name: Test wasm + runs-on: ubuntu-latest - - name: Install Rust stable toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true + steps: + - uses: actions/checkout@v3.1.0 - - name: Rust Cache - uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 + - name: Install wasm-pack + run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - - name: Run tests - uses: actions-rs/cargo@v1.0.3 - with: - command: test - args: --all-targets --package ui-tests + - name: Install firefox + uses: browser-actions/setup-firefox@latest - tests-other: - name: "Test: other (mainly unit) tests" - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v3 + - name: Install chrome + uses: browser-actions/setup-chrome@latest - - name: Download Substrate - run: | - curl $SUBSTRATE_URL --output substrate --location - chmod +x substrate - ./substrate --version - mkdir -p ~/.local/bin - mv substrate ~/.local/bin + - name: Rust Cache + uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 - - name: Install Rust stable toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - override: true + - name: Download Substrate + run: | + curl $SUBSTRATE_URL --output substrate --location + chmod +x substrate + ./substrate --version + mkdir -p ~/.local/bin + mv substrate ~/.local/bin - - name: Rust Cache - uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 - - - name: Cargo test - uses: actions-rs/cargo@v1.0.3 - with: - command: test - args: --all-targets --workspace --exclude ui-tests --exclude integration-tests - - clippy: - name: Cargo clippy - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v3 - - - name: Download Substrate - run: | - curl $SUBSTRATE_URL --output substrate --location - chmod +x substrate - ./substrate --version - mkdir -p ~/.local/bin - mv substrate ~/.local/bin - - - name: Install Rust stable toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - components: clippy - override: true - - - name: Rust Cache - uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 - - - name: Run clippy - uses: actions-rs/cargo@v1 - with: - command: clippy - args: --all-targets -- -D warnings - - wasm_tests: - name: Test wasm - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3.1.0 - - - name: Install wasm-pack - run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh - - - name: Install firefox - uses: browser-actions/setup-firefox@latest - - - name: Install chrome - uses: browser-actions/setup-chrome@latest - - - name: Rust Cache - uses: Swatinem/rust-cache@6fd3edff6979b79f87531400ad694fb7f2c84b1f # v2.2.1 - - - name: Download Substrate - run: | - curl $SUBSTRATE_URL --output substrate --location - chmod +x substrate - ./substrate --version - mkdir -p ~/.local/bin - mv substrate ~/.local/bin - - - name: Run WASM tests - run: | - substrate --dev --tmp > /dev/null 2>&1 & - wasm-pack test --headless --firefox - wasm-pack test --headless --chrome - pkill substrate - working-directory: testing/wasm-tests + - name: Run WASM tests + run: | + substrate --dev --tmp > /dev/null 2>&1 & + wasm-pack test --headless --firefox + wasm-pack test --headless --chrome + pkill substrate + working-directory: testing/wasm-tests diff --git a/artifacts/polkadot_metadata.scale b/artifacts/polkadot_metadata_full.scale similarity index 72% rename from artifacts/polkadot_metadata.scale rename to artifacts/polkadot_metadata_full.scale index d42d495410ded81cd5cc8866f1ef68f43357662f..d85b0defd7a432aad368e9d433b363ebf1a3842e 100644 GIT binary patch delta 17184 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 diff --git a/artifacts/polkadot_metadata_small.scale b/artifacts/polkadot_metadata_small.scale new file mode 100644 index 0000000000000000000000000000000000000000..fba6da3a21005daff0eff1e1080bd6f59c9d4b30 GIT binary patch literal 141585 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 jGaNSxrKlMW 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 S1ASP0MITsHhm-q#K>TkRBoplb literal 0 HcmV?d00001 diff --git a/codegen/src/lib.rs b/codegen/src/lib.rs index fde77ceb9c..39d0f826b5 100644 --- a/codegen/src/lib.rs +++ b/codegen/src/lib.rs @@ -23,7 +23,7 @@ //! use frame_metadata::RuntimeMetadataPrefixed; //! use subxt_codegen::{CratePath, DerivesRegistry, TypeSubstitutes}; //! -//! let encoded = fs::read("../artifacts/polkadot_metadata.scale").unwrap(); +//! let encoded = fs::read("../artifacts/polkadot_metadata_full.scale").unwrap(); //! //! // Runtime metadata obtained from a node. //! let metadata = ::decode(&mut &*encoded).unwrap(); diff --git a/examples/examples/blocks_subscribing.rs b/examples/examples/blocks_subscribing.rs index 7a7942c667..136af804c1 100644 --- a/examples/examples/blocks_subscribing.rs +++ b/examples/examples/blocks_subscribing.rs @@ -1,7 +1,7 @@ use futures::StreamExt; use subxt::{OnlineClient, PolkadotConfig}; -#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] pub mod polkadot {} #[tokio::main] diff --git a/examples/examples/constants_static.rs b/examples/examples/constants_static.rs index 1dd9409c0e..ebbf6ed0e9 100644 --- a/examples/examples/constants_static.rs +++ b/examples/examples/constants_static.rs @@ -1,6 +1,6 @@ use subxt::{OnlineClient, PolkadotConfig}; -#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] pub mod polkadot {} #[tokio::main] diff --git a/examples/examples/events.rs b/examples/examples/events.rs index 4c35398349..01499c1acb 100644 --- a/examples/examples/events.rs +++ b/examples/examples/events.rs @@ -1,6 +1,6 @@ use subxt::{OnlineClient, PolkadotConfig}; -#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] pub mod polkadot {} #[tokio::main] diff --git a/examples/examples/runtime_apis_dynamic.rs b/examples/examples/runtime_apis_dynamic.rs index c861c53357..bc2690bcf0 100644 --- a/examples/examples/runtime_apis_dynamic.rs +++ b/examples/examples/runtime_apis_dynamic.rs @@ -2,7 +2,7 @@ use sp_keyring::AccountKeyring; use subxt::dynamic::Value; use subxt::{config::PolkadotConfig, OnlineClient}; -#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] pub mod polkadot {} #[tokio::main] diff --git a/examples/examples/runtime_apis_raw.rs b/examples/examples/runtime_apis_raw.rs index fc61ff4b3b..c1ee7cf8d5 100644 --- a/examples/examples/runtime_apis_raw.rs +++ b/examples/examples/runtime_apis_raw.rs @@ -2,7 +2,7 @@ use subxt::ext::codec::Compact; use subxt::ext::frame_metadata::RuntimeMetadataPrefixed; use subxt::{OnlineClient, PolkadotConfig}; -#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] pub mod polkadot {} #[tokio::main] diff --git a/examples/examples/runtime_apis_static.rs b/examples/examples/runtime_apis_static.rs index 5e0d256bde..53732ce817 100644 --- a/examples/examples/runtime_apis_static.rs +++ b/examples/examples/runtime_apis_static.rs @@ -1,7 +1,7 @@ use sp_keyring::AccountKeyring; use subxt::{config::PolkadotConfig, OnlineClient}; -#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] pub mod polkadot {} #[tokio::main] diff --git a/examples/examples/setup_client_offline.rs b/examples/examples/setup_client_offline.rs index ba5d9b31ab..f6fbb77ba8 100644 --- a/examples/examples/setup_client_offline.rs +++ b/examples/examples/setup_client_offline.rs @@ -25,7 +25,7 @@ async fn main() -> Result<(), Box> { // 3. Metadata (I'll load it from the downloaded metadata, but you can use // `subxt metadata > file.scale` to download it): let metadata = { - let bytes = std::fs::read("./artifacts/polkadot_metadata.scale").unwrap(); + let bytes = std::fs::read("./artifacts/polkadot_metadata_small.scale").unwrap(); let metadata = RuntimeMetadataPrefixed::decode(&mut &*bytes).unwrap(); Metadata::try_from(metadata).unwrap() }; diff --git a/examples/examples/storage_fetch.rs b/examples/examples/storage_fetch.rs index 1a5b034be5..5674d51ff7 100644 --- a/examples/examples/storage_fetch.rs +++ b/examples/examples/storage_fetch.rs @@ -2,7 +2,7 @@ use sp_keyring::AccountKeyring; use subxt::{OnlineClient, PolkadotConfig}; // Generate an interface that we can use from the node's metadata. -#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] pub mod polkadot {} #[tokio::main] diff --git a/examples/examples/storage_iterating.rs b/examples/examples/storage_iterating.rs index 4a6a0159a6..7b7864cf7c 100644 --- a/examples/examples/storage_iterating.rs +++ b/examples/examples/storage_iterating.rs @@ -1,7 +1,6 @@ use subxt::{OnlineClient, PolkadotConfig}; -// Generate an interface that we can use from the node's metadata. -#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale")] pub mod polkadot {} #[tokio::main] diff --git a/examples/examples/tx_basic.rs b/examples/examples/tx_basic.rs index 787f1f9ef2..2f31e2476e 100644 --- a/examples/examples/tx_basic.rs +++ b/examples/examples/tx_basic.rs @@ -2,7 +2,7 @@ use sp_keyring::AccountKeyring; use subxt::{tx::PairSigner, OnlineClient, PolkadotConfig}; // Generate an interface that we can use from the node's metadata. -#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] pub mod polkadot {} #[tokio::main] diff --git a/examples/examples/tx_status_stream.rs b/examples/examples/tx_status_stream.rs index a390f9e3d4..47d0b9196c 100644 --- a/examples/examples/tx_status_stream.rs +++ b/examples/examples/tx_status_stream.rs @@ -6,7 +6,7 @@ use subxt::{ }; // Generate an interface that we can use from the node's metadata. -#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] pub mod polkadot {} #[tokio::main] diff --git a/examples/examples/tx_with_params.rs b/examples/examples/tx_with_params.rs index c94140d421..c64dcc2029 100644 --- a/examples/examples/tx_with_params.rs +++ b/examples/examples/tx_with_params.rs @@ -2,7 +2,7 @@ use sp_keyring::AccountKeyring; use subxt::config::polkadot::{Era, PlainTip, PolkadotExtrinsicParamsBuilder as Params}; use subxt::{tx::PairSigner, OnlineClient, PolkadotConfig}; -#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] pub mod polkadot {} #[tokio::main] diff --git a/metadata/benches/bench.rs b/metadata/benches/bench.rs index d264fbe5f3..12dd1fa6a8 100644 --- a/metadata/benches/bench.rs +++ b/metadata/benches/bench.rs @@ -13,7 +13,7 @@ use subxt_metadata::{ }; fn load_metadata() -> RuntimeMetadataV15 { - let bytes = fs::read(Path::new("../artifacts/polkadot_metadata.scale")) + let bytes = fs::read(Path::new("../artifacts/polkadot_metadata_full.scale")) .expect("Cannot read metadata blob"); let meta: RuntimeMetadataPrefixed = Decode::decode(&mut &*bytes).expect("Cannot decode scale metadata"); diff --git a/metadata/src/retain.rs b/metadata/src/retain.rs index c17d71c140..d1769f282e 100644 --- a/metadata/src/retain.rs +++ b/metadata/src/retain.rs @@ -256,7 +256,7 @@ mod tests { use std::{fs, path::Path}; fn load_metadata() -> RuntimeMetadataV15 { - let bytes = fs::read(Path::new("../artifacts/polkadot_metadata.scale")) + let bytes = fs::read(Path::new("../artifacts/polkadot_metadata_full.scale")) .expect("Cannot read metadata blob"); let meta: RuntimeMetadataPrefixed = Decode::decode(&mut &*bytes).expect("Cannot decode scale metadata"); diff --git a/scripts/artifacts.sh b/scripts/artifacts.sh new file mode 100755 index 0000000000..f561228a2a --- /dev/null +++ b/scripts/artifacts.sh @@ -0,0 +1,21 @@ +# # Generates the 3 metadata files in `/artifacts` and the polkadot.rs file for integration tests +# +# This script is to be run from the root of the repository: `scripts/artifacts.sh` +# +# It expects a local polkadot node to be running a JSON-RPC HTTP server at 127.0.0.1:9933 +# A local polkadot node can be run via: +# ``` +# git clone https://github.com/paritytech/polkadot.git +# cd polkadot +# cargo build --release +# ./target/release/polkadot --dev --tmp +# ``` + +# get the full metadata +cargo run --bin subxt metadata --version unstable > artifacts/polkadot_metadata_full.scale +# use it to generate polkadot.rs +cargo run --bin subxt codegen --file artifacts/polkadot_metadata_full.scale | rustfmt > testing/integration-tests/src/codegen/polkadot.rs +# generate a metadata file that only contains the pallets Balances, Staking, System and Multisig +cargo run --bin subxt metadata --file artifacts/polkadot_metadata_full.scale --pallets "Balances,Staking,System,Multisig" > artifacts/polkadot_metadata_small.scale +# generate a metadata file that only contains no pallets +cargo run --bin subxt metadata --file artifacts/polkadot_metadata_full.scale --pallets "" > artifacts/polkadot_metadata_tiny.scale diff --git a/subxt/src/book/setup/codegen.rs b/subxt/src/book/setup/codegen.rs index 5cf0d8032d..602f108e22 100644 --- a/subxt/src/book/setup/codegen.rs +++ b/subxt/src/book/setup/codegen.rs @@ -14,7 +14,7 @@ //! Using this macro looks something like: //! //! ```rust,no_run -//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_tiny.scale")] //! pub mod polkadot {} //! ``` //! diff --git a/subxt/src/book/usage/constants.rs b/subxt/src/book/usage/constants.rs index b11193b7f2..6e889fafdc 100644 --- a/subxt/src/book/usage/constants.rs +++ b/subxt/src/book/usage/constants.rs @@ -18,7 +18,7 @@ //! ```rust,no_run //! use sp_keyring::AccountKeyring; //! -//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale")] //! pub mod polkadot {} //! //! let constant_query = polkadot::constants().system().block_length(); diff --git a/subxt/src/book/usage/runtime_apis.rs b/subxt/src/book/usage/runtime_apis.rs index e42ddb09a7..37ec878f42 100644 --- a/subxt/src/book/usage/runtime_apis.rs +++ b/subxt/src/book/usage/runtime_apis.rs @@ -24,7 +24,7 @@ //! ```rust,no_run //! use sp_keyring::AccountKeyring; //! -//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] //! pub mod polkadot {} //! //! let runtime_call = polkadot::apis().metadata().metadata_versions(); diff --git a/subxt/src/book/usage/storage.rs b/subxt/src/book/usage/storage.rs index 2c32e0d8fd..23b0dbc1e7 100644 --- a/subxt/src/book/usage/storage.rs +++ b/subxt/src/book/usage/storage.rs @@ -18,7 +18,7 @@ //! ```rust,no_run //! use sp_keyring::AccountKeyring; //! -//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] //! pub mod polkadot {} //! //! let account = AccountKeyring::Alice.to_account_id().into(); @@ -45,7 +45,7 @@ //! ```rust,no_run //! use sp_keyring::AccountKeyring; //! -//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] //! pub mod polkadot {} //! //! // A static query capable of iterating over accounts: diff --git a/subxt/src/book/usage/transactions.rs b/subxt/src/book/usage/transactions.rs index f5eddea603..49779228ab 100644 --- a/subxt/src/book/usage/transactions.rs +++ b/subxt/src/book/usage/transactions.rs @@ -26,7 +26,7 @@ //! We can use the statically generated interface to build transaction payloads: //! //! ```rust,no_run -//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")] //! pub mod polkadot {} //! //! let remark = "Hello there".as_bytes().to_vec(); diff --git a/subxt/src/lib.rs b/subxt/src/lib.rs index d23633e141..ee7e257c6f 100644 --- a/subxt/src/lib.rs +++ b/subxt/src/lib.rs @@ -109,7 +109,7 @@ pub mod ext { /// /// ```rust,no_run /// #[subxt::subxt( -/// runtime_metadata_path = "../artifacts/polkadot_metadata.scale", +/// runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale", /// )] /// mod polkadot {} /// ``` @@ -130,7 +130,7 @@ pub mod ext { /// # pub mod path { pub mod to { pub use subxt; } } /// # fn main() {} /// #[subxt::subxt( -/// runtime_metadata_path = "../artifacts/polkadot_metadata.scale", +/// runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale", /// crate = "crate::path::to::subxt" /// )] /// mod polkadot {} @@ -146,7 +146,7 @@ pub mod ext { /// /// ```rust /// #[subxt::subxt( -/// runtime_metadata_path = "../artifacts/polkadot_metadata.scale", +/// runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale", /// substitute_type(path = "sp_arithmetic::per_things::Perbill", with = "crate::Foo") /// )] /// mod polkadot {} @@ -184,7 +184,7 @@ pub mod ext { /// /// ```rust,no_run /// #[subxt::subxt( -/// runtime_metadata_path = "../artifacts/polkadot_metadata.scale", +/// runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale", /// substitute_type( /// path = "sp_runtime::multiaddress::MultiAddress", /// with = "::subxt::utils::Static<::sp_runtime::MultiAddress>" @@ -204,7 +204,7 @@ pub mod ext { /// /// ```rust,no_run /// #[subxt::subxt( -/// runtime_metadata_path = "../artifacts/polkadot_metadata.scale", +/// runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale", /// derive_for_all_types = "Eq, PartialEq" /// )] /// mod polkadot {} @@ -220,7 +220,7 @@ pub mod ext { /// /// ```rust,no_run /// #[subxt::subxt( -/// runtime_metadata_path = "../artifacts/polkadot_metadata.scale", +/// runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale", /// derive_for_all_types = "Eq, PartialEq", /// derive_for_type(path = "frame_support::PalletId", derive = "Ord, PartialOrd"), /// derive_for_type(path = "sp_runtime::ModuleError", derive = "Hash"), @@ -248,7 +248,7 @@ pub mod ext { /// /// ```rust,no_run /// #[subxt::subxt( -/// runtime_metadata_path = "../artifacts/polkadot_metadata.scale", +/// runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale", /// generate_docs /// )] /// mod polkadot {} @@ -261,7 +261,7 @@ pub mod ext { /// /// ```rust,no_run /// #[subxt::subxt( -/// runtime_metadata_path = "../artifacts/polkadot_metadata.scale", +/// runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale", /// runtime_types_only /// )] /// mod polkadot {} @@ -273,7 +273,7 @@ pub mod ext { /// /// ```rust,no_run /// #[subxt::subxt( -/// runtime_metadata_path = "../artifacts/polkadot_metadata.scale", +/// runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale", /// runtime_types_only, /// no_default_derives, /// derive_for_all_types="codec::Encode, codec::Decode" diff --git a/subxt/src/rpc/mod.rs b/subxt/src/rpc/mod.rs index 98c76e7998..2254db313c 100644 --- a/subxt/src/rpc/mod.rs +++ b/subxt/src/rpc/mod.rs @@ -25,7 +25,7 @@ //! # async fn main() { //! use subxt::{ PolkadotConfig, OnlineClient, storage::StorageKey }; //! -//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale")] //! pub mod polkadot {} //! //! let api = OnlineClient::::new().await.unwrap(); diff --git a/subxt/src/rpc/rpc.rs b/subxt/src/rpc/rpc.rs index f4914eea69..13b8ad202c 100644 --- a/subxt/src/rpc/rpc.rs +++ b/subxt/src/rpc/rpc.rs @@ -16,7 +16,7 @@ //! # async fn main() { //! use subxt::{ PolkadotConfig, OnlineClient, storage::StorageKey }; //! -//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] +//! #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale")] //! pub mod polkadot {} //! //! let api = OnlineClient::::new().await.unwrap(); diff --git a/subxt/src/storage/storage_type.rs b/subxt/src/storage/storage_type.rs index 84c554af6c..51d2e978b5 100644 --- a/subxt/src/storage/storage_type.rs +++ b/subxt/src/storage/storage_type.rs @@ -62,7 +62,7 @@ where /// ```no_run /// use subxt::{ PolkadotConfig, OnlineClient }; /// - /// #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] + /// #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale")] /// pub mod polkadot {} /// /// # #[tokio::main] @@ -172,7 +172,7 @@ where /// ```no_run /// use subxt::{ PolkadotConfig, OnlineClient }; /// - /// #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] + /// #[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_full.scale")] /// pub mod polkadot {} /// /// # #[tokio::main] diff --git a/testing/integration-tests/src/codegen/mod.rs b/testing/integration-tests/src/codegen/mod.rs index 91b043b98d..786c0df00f 100644 --- a/testing/integration-tests/src/codegen/mod.rs +++ b/testing/integration-tests/src/codegen/mod.rs @@ -8,7 +8,7 @@ /// Generate by running this at the root of the repository: /// /// ``` -/// cargo run --bin subxt -- codegen --file artifacts/polkadot_metadata.scale | rustfmt > testing/integration-tests/src/codegen/polkadot.rs +/// cargo run --bin subxt -- codegen --file artifacts/polkadot_metadata_full.scale | rustfmt > testing/integration-tests/src/codegen/polkadot.rs /// ``` #[rustfmt::skip] #[allow(clippy::all)] diff --git a/testing/integration-tests/src/codegen/polkadot.rs b/testing/integration-tests/src/codegen/polkadot.rs index 2a4335ec3b..37746296a1 100644 --- a/testing/integration-tests/src/codegen/polkadot.rs +++ b/testing/integration-tests/src/codegen/polkadot.rs @@ -5,7 +5,7 @@ pub mod api { mod root_mod { pub use super::*; } - pub static PALLETS: [&str; 56usize] = [ + pub static PALLETS: [&str; 57usize] = [ "System", "Scheduler", "Preimage", @@ -57,6 +57,7 @@ pub mod api { "Hrmp", "ParaSessionInfo", "ParasDisputes", + "ParasSlashing", "Registrar", "Slots", "Auctions", @@ -590,14 +591,14 @@ pub mod api { Paras(paras::Call), #[codec(index = 57)] Initializer(initializer::Call), - #[codec(index = 58)] - Dmp(dmp::Call), #[codec(index = 59)] Ump(ump::Call), #[codec(index = 60)] Hrmp(hrmp::Call), #[codec(index = 62)] ParasDisputes(paras_disputes::Call), + #[codec(index = 63)] + ParasSlashing(paras_slashing::Call), #[codec(index = 70)] Registrar(registrar::Call), #[codec(index = 71)] @@ -910,13 +911,6 @@ pub mod api { metadata, )?)); } - if pallet_name == "Dmp" { - return Ok(Call::Dmp(dmp::Call::decode_with_metadata( - &mut &*pallet_bytes, - pallet_ty, - metadata, - )?)); - } if pallet_name == "Ump" { return Ok(Call::Ump(ump::Call::decode_with_metadata( &mut &*pallet_bytes, @@ -940,6 +934,15 @@ pub mod api { )?, )); } + if pallet_name == "ParasSlashing" { + return Ok(Call::ParasSlashing( + paras_slashing::Call::decode_with_metadata( + &mut &*pallet_bytes, + pallet_ty, + metadata, + )?, + )); + } if pallet_name == "Registrar" { return Ok(Call::Registrar(registrar::Call::decode_with_metadata( &mut &*pallet_bytes, @@ -1071,6 +1074,8 @@ pub mod api { Hrmp(hrmp::Error), #[codec(index = 62)] ParasDisputes(paras_disputes::Error), + #[codec(index = 63)] + ParasSlashing(paras_slashing::Error), #[codec(index = 70)] Registrar(registrar::Error), #[codec(index = 71)] @@ -1091,208 +1096,213 @@ pub mod api { use subxt::metadata::DecodeWithMetadata; let cursor = &mut &pallet_bytes[..]; if pallet_name == "System" { - let variant_error = system::Error::decode_with_metadata(cursor, 488u32, metadata)?; + let variant_error = system::Error::decode_with_metadata(cursor, 491u32, metadata)?; return Ok(Error::System(variant_error)); } if pallet_name == "Scheduler" { let variant_error = - scheduler::Error::decode_with_metadata(cursor, 493u32, metadata)?; + scheduler::Error::decode_with_metadata(cursor, 496u32, metadata)?; return Ok(Error::Scheduler(variant_error)); } if pallet_name == "Preimage" { let variant_error = - preimage::Error::decode_with_metadata(cursor, 498u32, metadata)?; + preimage::Error::decode_with_metadata(cursor, 501u32, metadata)?; return Ok(Error::Preimage(variant_error)); } if pallet_name == "Babe" { - let variant_error = babe::Error::decode_with_metadata(cursor, 514u32, metadata)?; + let variant_error = babe::Error::decode_with_metadata(cursor, 517u32, metadata)?; return Ok(Error::Babe(variant_error)); } if pallet_name == "Indices" { - let variant_error = indices::Error::decode_with_metadata(cursor, 516u32, metadata)?; + let variant_error = indices::Error::decode_with_metadata(cursor, 519u32, metadata)?; return Ok(Error::Indices(variant_error)); } if pallet_name == "Balances" { let variant_error = - balances::Error::decode_with_metadata(cursor, 527u32, metadata)?; + balances::Error::decode_with_metadata(cursor, 530u32, metadata)?; return Ok(Error::Balances(variant_error)); } if pallet_name == "Staking" { - let variant_error = staking::Error::decode_with_metadata(cursor, 551u32, metadata)?; + let variant_error = staking::Error::decode_with_metadata(cursor, 554u32, metadata)?; return Ok(Error::Staking(variant_error)); } if pallet_name == "Session" { - let variant_error = session::Error::decode_with_metadata(cursor, 558u32, metadata)?; + let variant_error = session::Error::decode_with_metadata(cursor, 561u32, metadata)?; return Ok(Error::Session(variant_error)); } if pallet_name == "Grandpa" { - let variant_error = grandpa::Error::decode_with_metadata(cursor, 562u32, metadata)?; + let variant_error = grandpa::Error::decode_with_metadata(cursor, 565u32, metadata)?; return Ok(Error::Grandpa(variant_error)); } if pallet_name == "ImOnline" { let variant_error = - im_online::Error::decode_with_metadata(cursor, 570u32, metadata)?; + im_online::Error::decode_with_metadata(cursor, 573u32, metadata)?; return Ok(Error::ImOnline(variant_error)); } if pallet_name == "Democracy" { let variant_error = - democracy::Error::decode_with_metadata(cursor, 587u32, metadata)?; + democracy::Error::decode_with_metadata(cursor, 590u32, metadata)?; return Ok(Error::Democracy(variant_error)); } if pallet_name == "Council" { - let variant_error = council::Error::decode_with_metadata(cursor, 590u32, metadata)?; + let variant_error = council::Error::decode_with_metadata(cursor, 593u32, metadata)?; return Ok(Error::Council(variant_error)); } if pallet_name == "TechnicalCommittee" { let variant_error = - technical_committee::Error::decode_with_metadata(cursor, 592u32, metadata)?; + technical_committee::Error::decode_with_metadata(cursor, 595u32, metadata)?; return Ok(Error::TechnicalCommittee(variant_error)); } if pallet_name == "PhragmenElection" { let variant_error = - phragmen_election::Error::decode_with_metadata(cursor, 596u32, metadata)?; + phragmen_election::Error::decode_with_metadata(cursor, 599u32, metadata)?; return Ok(Error::PhragmenElection(variant_error)); } if pallet_name == "TechnicalMembership" { let variant_error = - technical_membership::Error::decode_with_metadata(cursor, 598u32, metadata)?; + technical_membership::Error::decode_with_metadata(cursor, 601u32, metadata)?; return Ok(Error::TechnicalMembership(variant_error)); } if pallet_name == "Treasury" { let variant_error = - treasury::Error::decode_with_metadata(cursor, 604u32, metadata)?; + treasury::Error::decode_with_metadata(cursor, 607u32, metadata)?; return Ok(Error::Treasury(variant_error)); } if pallet_name == "ConvictionVoting" { let variant_error = - conviction_voting::Error::decode_with_metadata(cursor, 617u32, metadata)?; + conviction_voting::Error::decode_with_metadata(cursor, 620u32, metadata)?; return Ok(Error::ConvictionVoting(variant_error)); } if pallet_name == "Referenda" { let variant_error = - referenda::Error::decode_with_metadata(cursor, 635u32, metadata)?; + referenda::Error::decode_with_metadata(cursor, 638u32, metadata)?; return Ok(Error::Referenda(variant_error)); } if pallet_name == "Whitelist" { let variant_error = - whitelist::Error::decode_with_metadata(cursor, 636u32, metadata)?; + whitelist::Error::decode_with_metadata(cursor, 639u32, metadata)?; return Ok(Error::Whitelist(variant_error)); } if pallet_name == "Claims" { - let variant_error = claims::Error::decode_with_metadata(cursor, 637u32, metadata)?; + let variant_error = claims::Error::decode_with_metadata(cursor, 640u32, metadata)?; return Ok(Error::Claims(variant_error)); } if pallet_name == "Vesting" { - let variant_error = vesting::Error::decode_with_metadata(cursor, 641u32, metadata)?; + let variant_error = vesting::Error::decode_with_metadata(cursor, 644u32, metadata)?; return Ok(Error::Vesting(variant_error)); } if pallet_name == "Utility" { - let variant_error = utility::Error::decode_with_metadata(cursor, 642u32, metadata)?; + let variant_error = utility::Error::decode_with_metadata(cursor, 645u32, metadata)?; return Ok(Error::Utility(variant_error)); } if pallet_name == "Identity" { let variant_error = - identity::Error::decode_with_metadata(cursor, 653u32, metadata)?; + identity::Error::decode_with_metadata(cursor, 656u32, metadata)?; return Ok(Error::Identity(variant_error)); } if pallet_name == "Proxy" { - let variant_error = proxy::Error::decode_with_metadata(cursor, 662u32, metadata)?; + let variant_error = proxy::Error::decode_with_metadata(cursor, 665u32, metadata)?; return Ok(Error::Proxy(variant_error)); } if pallet_name == "Multisig" { let variant_error = - multisig::Error::decode_with_metadata(cursor, 666u32, metadata)?; + multisig::Error::decode_with_metadata(cursor, 669u32, metadata)?; return Ok(Error::Multisig(variant_error)); } if pallet_name == "Bounties" { let variant_error = - bounties::Error::decode_with_metadata(cursor, 670u32, metadata)?; + bounties::Error::decode_with_metadata(cursor, 673u32, metadata)?; return Ok(Error::Bounties(variant_error)); } if pallet_name == "ChildBounties" { let variant_error = - child_bounties::Error::decode_with_metadata(cursor, 673u32, metadata)?; + child_bounties::Error::decode_with_metadata(cursor, 676u32, metadata)?; return Ok(Error::ChildBounties(variant_error)); } if pallet_name == "Tips" { - let variant_error = tips::Error::decode_with_metadata(cursor, 675u32, metadata)?; + let variant_error = tips::Error::decode_with_metadata(cursor, 678u32, metadata)?; return Ok(Error::Tips(variant_error)); } if pallet_name == "ElectionProviderMultiPhase" { let variant_error = election_provider_multi_phase::Error::decode_with_metadata( - cursor, 685u32, metadata, + cursor, 688u32, metadata, )?; return Ok(Error::ElectionProviderMultiPhase(variant_error)); } if pallet_name == "VoterList" { let variant_error = - voter_list::Error::decode_with_metadata(cursor, 689u32, metadata)?; + voter_list::Error::decode_with_metadata(cursor, 692u32, metadata)?; return Ok(Error::VoterList(variant_error)); } if pallet_name == "NominationPools" { let variant_error = - nomination_pools::Error::decode_with_metadata(cursor, 707u32, metadata)?; + nomination_pools::Error::decode_with_metadata(cursor, 710u32, metadata)?; return Ok(Error::NominationPools(variant_error)); } if pallet_name == "FastUnstake" { let variant_error = - fast_unstake::Error::decode_with_metadata(cursor, 712u32, metadata)?; + fast_unstake::Error::decode_with_metadata(cursor, 715u32, metadata)?; return Ok(Error::FastUnstake(variant_error)); } if pallet_name == "Configuration" { let variant_error = - configuration::Error::decode_with_metadata(cursor, 716u32, metadata)?; + configuration::Error::decode_with_metadata(cursor, 719u32, metadata)?; return Ok(Error::Configuration(variant_error)); } if pallet_name == "ParaInclusion" { let variant_error = - para_inclusion::Error::decode_with_metadata(cursor, 721u32, metadata)?; + para_inclusion::Error::decode_with_metadata(cursor, 724u32, metadata)?; return Ok(Error::ParaInclusion(variant_error)); } if pallet_name == "ParaInherent" { let variant_error = - para_inherent::Error::decode_with_metadata(cursor, 727u32, metadata)?; + para_inherent::Error::decode_with_metadata(cursor, 730u32, metadata)?; return Ok(Error::ParaInherent(variant_error)); } if pallet_name == "Paras" { - let variant_error = paras::Error::decode_with_metadata(cursor, 754u32, metadata)?; + let variant_error = paras::Error::decode_with_metadata(cursor, 757u32, metadata)?; return Ok(Error::Paras(variant_error)); } if pallet_name == "Ump" { - let variant_error = ump::Error::decode_with_metadata(cursor, 760u32, metadata)?; + let variant_error = ump::Error::decode_with_metadata(cursor, 763u32, metadata)?; return Ok(Error::Ump(variant_error)); } if pallet_name == "Hrmp" { - let variant_error = hrmp::Error::decode_with_metadata(cursor, 768u32, metadata)?; + let variant_error = hrmp::Error::decode_with_metadata(cursor, 771u32, metadata)?; return Ok(Error::Hrmp(variant_error)); } if pallet_name == "ParasDisputes" { let variant_error = - paras_disputes::Error::decode_with_metadata(cursor, 777u32, metadata)?; + paras_disputes::Error::decode_with_metadata(cursor, 780u32, metadata)?; return Ok(Error::ParasDisputes(variant_error)); } + if pallet_name == "ParasSlashing" { + let variant_error = + paras_slashing::Error::decode_with_metadata(cursor, 785u32, metadata)?; + return Ok(Error::ParasSlashing(variant_error)); + } if pallet_name == "Registrar" { let variant_error = - registrar::Error::decode_with_metadata(cursor, 779u32, metadata)?; + registrar::Error::decode_with_metadata(cursor, 787u32, metadata)?; return Ok(Error::Registrar(variant_error)); } if pallet_name == "Slots" { - let variant_error = slots::Error::decode_with_metadata(cursor, 781u32, metadata)?; + let variant_error = slots::Error::decode_with_metadata(cursor, 789u32, metadata)?; return Ok(Error::Slots(variant_error)); } if pallet_name == "Auctions" { let variant_error = - auctions::Error::decode_with_metadata(cursor, 786u32, metadata)?; + auctions::Error::decode_with_metadata(cursor, 794u32, metadata)?; return Ok(Error::Auctions(variant_error)); } if pallet_name == "Crowdloan" { let variant_error = - crowdloan::Error::decode_with_metadata(cursor, 789u32, metadata)?; + crowdloan::Error::decode_with_metadata(cursor, 797u32, metadata)?; return Ok(Error::Crowdloan(variant_error)); } if pallet_name == "XcmPallet" { let variant_error = - xcm_pallet::Error::decode_with_metadata(cursor, 808u32, metadata)?; + xcm_pallet::Error::decode_with_metadata(cursor, 816u32, metadata)?; return Ok(Error::XcmPallet(variant_error)); } Err(::subxt::ext::scale_decode::Error::custom(format!( @@ -3802,10 +3812,10 @@ pub mod api { "TransactionPaymentCallApi_query_call_info", types::QueryCallInfo { call, len }, [ - 151u8, 40u8, 199u8, 73u8, 193u8, 248u8, 30u8, 24u8, 71u8, 196u8, 235u8, - 10u8, 211u8, 120u8, 228u8, 29u8, 101u8, 175u8, 200u8, 196u8, 70u8, - 44u8, 112u8, 209u8, 175u8, 246u8, 148u8, 118u8, 84u8, 127u8, 185u8, - 163u8, + 218u8, 54u8, 230u8, 230u8, 47u8, 1u8, 213u8, 144u8, 43u8, 21u8, 63u8, + 245u8, 81u8, 157u8, 189u8, 79u8, 108u8, 173u8, 142u8, 208u8, 47u8, + 90u8, 208u8, 125u8, 214u8, 233u8, 78u8, 29u8, 213u8, 198u8, 237u8, + 54u8, ], ) } @@ -3824,9 +3834,10 @@ pub mod api { "TransactionPaymentCallApi_query_call_fee_details", types::QueryCallFeeDetails { call, len }, [ - 56u8, 220u8, 173u8, 0u8, 48u8, 27u8, 228u8, 70u8, 139u8, 236u8, 142u8, - 142u8, 192u8, 147u8, 216u8, 185u8, 152u8, 219u8, 185u8, 189u8, 166u8, - 110u8, 224u8, 32u8, 94u8, 53u8, 248u8, 216u8, 90u8, 152u8, 63u8, 148u8, + 117u8, 194u8, 140u8, 175u8, 222u8, 226u8, 47u8, 206u8, 231u8, 61u8, + 90u8, 113u8, 66u8, 118u8, 129u8, 235u8, 145u8, 217u8, 255u8, 169u8, + 207u8, 24u8, 64u8, 140u8, 39u8, 42u8, 34u8, 179u8, 219u8, 33u8, 107u8, + 1u8, ], ) } @@ -4178,6 +4189,9 @@ pub mod api { pub fn paras_disputes(&self) -> paras_disputes::storage::StorageApi { paras_disputes::storage::StorageApi } + pub fn paras_slashing(&self) -> paras_slashing::storage::StorageApi { + paras_slashing::storage::StorageApi + } pub fn registrar(&self) -> registrar::storage::StorageApi { registrar::storage::StorageApi } @@ -4315,9 +4329,6 @@ pub mod api { pub fn initializer(&self) -> initializer::calls::TransactionApi { initializer::calls::TransactionApi } - pub fn dmp(&self) -> dmp::calls::TransactionApi { - dmp::calls::TransactionApi - } pub fn ump(&self) -> ump::calls::TransactionApi { ump::calls::TransactionApi } @@ -4327,6 +4338,9 @@ pub mod api { pub fn paras_disputes(&self) -> paras_disputes::calls::TransactionApi { paras_disputes::calls::TransactionApi } + pub fn paras_slashing(&self) -> paras_slashing::calls::TransactionApi { + paras_slashing::calls::TransactionApi + } pub fn registrar(&self) -> registrar::calls::TransactionApi { registrar::calls::TransactionApi } @@ -4350,9 +4364,9 @@ pub mod api { let runtime_metadata_hash = client.metadata().metadata_hash(&PALLETS); if runtime_metadata_hash != [ - 190u8, 141u8, 166u8, 186u8, 44u8, 119u8, 250u8, 170u8, 99u8, 5u8, 93u8, 253u8, - 141u8, 142u8, 175u8, 243u8, 206u8, 208u8, 98u8, 63u8, 166u8, 71u8, 159u8, 227u8, - 34u8, 235u8, 190u8, 96u8, 248u8, 13u8, 47u8, 146u8, + 193u8, 126u8, 5u8, 68u8, 158u8, 198u8, 107u8, 140u8, 166u8, 77u8, 81u8, 160u8, + 213u8, 179u8, 210u8, 41u8, 130u8, 34u8, 133u8, 228u8, 10u8, 134u8, 182u8, 62u8, + 72u8, 116u8, 209u8, 70u8, 115u8, 234u8, 227u8, 18u8, ] { Err(::subxt::error::MetadataError::IncompatibleMetadata) @@ -5085,10 +5099,9 @@ pub mod api { "Events", vec![], [ - 26u8, 210u8, 211u8, 123u8, 212u8, 15u8, 80u8, 216u8, 114u8, 185u8, - 65u8, 128u8, 244u8, 195u8, 118u8, 121u8, 178u8, 141u8, 187u8, 167u8, - 50u8, 176u8, 188u8, 16u8, 166u8, 230u8, 16u8, 138u8, 161u8, 106u8, - 166u8, 190u8, + 78u8, 158u8, 91u8, 165u8, 29u8, 179u8, 204u8, 195u8, 39u8, 3u8, 127u8, + 199u8, 132u8, 93u8, 252u8, 17u8, 84u8, 58u8, 51u8, 56u8, 159u8, 51u8, + 188u8, 138u8, 75u8, 109u8, 148u8, 73u8, 227u8, 56u8, 162u8, 246u8, ], ) } @@ -5527,9 +5540,10 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 164u8, 246u8, 61u8, 87u8, 188u8, 27u8, 147u8, 236u8, 52u8, 8u8, 236u8, - 129u8, 26u8, 72u8, 131u8, 237u8, 251u8, 235u8, 164u8, 113u8, 111u8, - 134u8, 93u8, 90u8, 90u8, 12u8, 212u8, 60u8, 188u8, 209u8, 11u8, 233u8, + 225u8, 142u8, 54u8, 240u8, 129u8, 69u8, 56u8, 230u8, 207u8, 110u8, + 78u8, 150u8, 87u8, 254u8, 95u8, 73u8, 74u8, 204u8, 165u8, 239u8, 246u8, + 132u8, 251u8, 183u8, 36u8, 102u8, 236u8, 244u8, 201u8, 2u8, 233u8, + 255u8, ], ) } @@ -5573,10 +5587,10 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 156u8, 178u8, 81u8, 158u8, 54u8, 35u8, 247u8, 189u8, 201u8, 227u8, - 26u8, 122u8, 219u8, 223u8, 92u8, 151u8, 189u8, 42u8, 137u8, 149u8, - 254u8, 183u8, 77u8, 2u8, 204u8, 112u8, 53u8, 235u8, 150u8, 120u8, 10u8, - 115u8, + 158u8, 202u8, 183u8, 44u8, 48u8, 102u8, 44u8, 53u8, 74u8, 193u8, 176u8, + 21u8, 240u8, 144u8, 135u8, 240u8, 87u8, 70u8, 132u8, 36u8, 229u8, + 233u8, 249u8, 55u8, 129u8, 81u8, 37u8, 193u8, 207u8, 252u8, 49u8, + 165u8, ], ) } @@ -5617,10 +5631,10 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 218u8, 137u8, 252u8, 13u8, 121u8, 128u8, 180u8, 62u8, 53u8, 213u8, - 72u8, 108u8, 241u8, 211u8, 254u8, 111u8, 240u8, 200u8, 251u8, 16u8, - 229u8, 105u8, 202u8, 252u8, 94u8, 76u8, 12u8, 163u8, 115u8, 109u8, - 167u8, 70u8, + 73u8, 79u8, 70u8, 138u8, 189u8, 239u8, 243u8, 180u8, 250u8, 183u8, + 246u8, 40u8, 204u8, 164u8, 154u8, 219u8, 87u8, 144u8, 44u8, 185u8, + 181u8, 130u8, 147u8, 11u8, 156u8, 54u8, 201u8, 207u8, 238u8, 76u8, + 61u8, 179u8, ], ) } @@ -5647,10 +5661,10 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 165u8, 208u8, 120u8, 60u8, 9u8, 191u8, 94u8, 147u8, 17u8, 13u8, 38u8, - 196u8, 105u8, 123u8, 10u8, 222u8, 227u8, 230u8, 145u8, 91u8, 95u8, - 91u8, 93u8, 84u8, 216u8, 176u8, 53u8, 188u8, 251u8, 255u8, 113u8, - 204u8, + 158u8, 154u8, 219u8, 160u8, 184u8, 209u8, 41u8, 234u8, 126u8, 157u8, + 63u8, 92u8, 143u8, 2u8, 82u8, 145u8, 45u8, 145u8, 148u8, 27u8, 48u8, + 255u8, 95u8, 70u8, 182u8, 146u8, 199u8, 252u8, 87u8, 105u8, 12u8, + 187u8, ], ) } @@ -8270,6 +8284,44 @@ pub mod api { const PALLET: &'static str = "Balances"; const EVENT: &'static str = "Unlocked"; } + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + #[doc = "Some balance was frozen."] + pub struct Frozen { + pub who: ::subxt::utils::AccountId32, + pub amount: ::core::primitive::u128, + } + impl ::subxt::events::StaticEvent for Frozen { + const PALLET: &'static str = "Balances"; + const EVENT: &'static str = "Frozen"; + } + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + #[doc = "Some balance was thawed."] + pub struct Thawed { + pub who: ::subxt::utils::AccountId32, + pub amount: ::core::primitive::u128, + } + impl ::subxt::events::StaticEvent for Thawed { + const PALLET: &'static str = "Balances"; + const EVENT: &'static str = "Thawed"; + } } pub mod storage { use super::runtime_types; @@ -12029,63 +12081,6 @@ pub mod api { ], ) } - #[doc = " Enumerates all reports of a kind along with the time they happened."] - #[doc = ""] - #[doc = " All reports are sorted by the time of offence."] - #[doc = ""] - #[doc = " Note that the actual type of this mapping is `Vec`, this is because values of"] - #[doc = " different types are not supported at the moment so we are doing the manual serialization."] - pub fn reports_by_kind_index( - &self, - _0: impl ::std::borrow::Borrow<[::core::primitive::u8; 16usize]>, - ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, - ::std::vec::Vec<::core::primitive::u8>, - ::subxt::storage::address::Yes, - ::subxt::storage::address::Yes, - ::subxt::storage::address::Yes, - > { - ::subxt::storage::address::Address::new_static( - "Offences", - "ReportsByKindIndex", - vec![::subxt::storage::address::make_static_storage_map_key( - _0.borrow(), - )], - [ - 162u8, 66u8, 131u8, 48u8, 250u8, 237u8, 179u8, 214u8, 36u8, 137u8, - 226u8, 136u8, 120u8, 61u8, 215u8, 43u8, 164u8, 50u8, 91u8, 164u8, 20u8, - 96u8, 189u8, 100u8, 242u8, 106u8, 21u8, 136u8, 98u8, 215u8, 180u8, - 145u8, - ], - ) - } - #[doc = " Enumerates all reports of a kind along with the time they happened."] - #[doc = ""] - #[doc = " All reports are sorted by the time of offence."] - #[doc = ""] - #[doc = " Note that the actual type of this mapping is `Vec`, this is because values of"] - #[doc = " different types are not supported at the moment so we are doing the manual serialization."] - pub fn reports_by_kind_index_root( - &self, - ) -> ::subxt::storage::address::Address< - ::subxt::storage::address::StaticStorageMapKey, - ::std::vec::Vec<::core::primitive::u8>, - (), - ::subxt::storage::address::Yes, - ::subxt::storage::address::Yes, - > { - ::subxt::storage::address::Address::new_static( - "Offences", - "ReportsByKindIndex", - Vec::new(), - [ - 162u8, 66u8, 131u8, 48u8, 250u8, 237u8, 179u8, 214u8, 36u8, 137u8, - 226u8, 136u8, 120u8, 61u8, 215u8, 43u8, 164u8, 50u8, 91u8, 164u8, 20u8, - 96u8, 189u8, 100u8, 242u8, 106u8, 21u8, 136u8, 98u8, 215u8, 180u8, - 145u8, - ], - ) - } } } } @@ -15321,10 +15316,9 @@ pub mod api { length_bound, }, [ - 207u8, 27u8, 175u8, 137u8, 87u8, 176u8, 52u8, 110u8, 175u8, 212u8, - 118u8, 136u8, 200u8, 108u8, 251u8, 232u8, 201u8, 155u8, 93u8, 62u8, - 38u8, 186u8, 198u8, 52u8, 26u8, 45u8, 214u8, 101u8, 202u8, 106u8, 99u8, - 219u8, + 0u8, 74u8, 70u8, 223u8, 112u8, 196u8, 199u8, 189u8, 93u8, 14u8, 101u8, + 211u8, 221u8, 38u8, 32u8, 220u8, 90u8, 120u8, 94u8, 107u8, 46u8, 121u8, + 250u8, 150u8, 26u8, 24u8, 20u8, 242u8, 253u8, 229u8, 43u8, 195u8, ], ) } @@ -15357,9 +15351,9 @@ pub mod api { length_bound, }, [ - 254u8, 227u8, 169u8, 126u8, 6u8, 164u8, 171u8, 55u8, 56u8, 151u8, 88u8, - 86u8, 190u8, 117u8, 162u8, 67u8, 200u8, 76u8, 182u8, 147u8, 104u8, - 250u8, 42u8, 76u8, 60u8, 234u8, 210u8, 0u8, 74u8, 178u8, 164u8, 129u8, + 157u8, 103u8, 73u8, 75u8, 15u8, 79u8, 50u8, 64u8, 5u8, 151u8, 194u8, + 216u8, 45u8, 47u8, 128u8, 206u8, 191u8, 52u8, 5u8, 104u8, 70u8, 6u8, + 139u8, 184u8, 12u8, 190u8, 109u8, 132u8, 195u8, 177u8, 197u8, 179u8, ], ) } @@ -15657,9 +15651,9 @@ pub mod api { _0.borrow(), )], [ - 112u8, 100u8, 134u8, 22u8, 5u8, 252u8, 154u8, 197u8, 212u8, 0u8, 30u8, - 67u8, 152u8, 38u8, 106u8, 78u8, 241u8, 69u8, 252u8, 61u8, 156u8, 34u8, - 151u8, 254u8, 20u8, 47u8, 22u8, 70u8, 136u8, 146u8, 55u8, 120u8, + 6u8, 23u8, 244u8, 48u8, 73u8, 203u8, 222u8, 109u8, 218u8, 166u8, 6u8, + 137u8, 121u8, 88u8, 54u8, 188u8, 37u8, 8u8, 229u8, 217u8, 170u8, 108u8, + 198u8, 66u8, 36u8, 92u8, 107u8, 168u8, 162u8, 204u8, 210u8, 20u8, ], ) } @@ -15678,9 +15672,9 @@ pub mod api { "ProposalOf", Vec::new(), [ - 112u8, 100u8, 134u8, 22u8, 5u8, 252u8, 154u8, 197u8, 212u8, 0u8, 30u8, - 67u8, 152u8, 38u8, 106u8, 78u8, 241u8, 69u8, 252u8, 61u8, 156u8, 34u8, - 151u8, 254u8, 20u8, 47u8, 22u8, 70u8, 136u8, 146u8, 55u8, 120u8, + 6u8, 23u8, 244u8, 48u8, 73u8, 203u8, 222u8, 109u8, 218u8, 166u8, 6u8, + 137u8, 121u8, 88u8, 54u8, 188u8, 37u8, 8u8, 229u8, 217u8, 170u8, 108u8, + 198u8, 66u8, 36u8, 92u8, 107u8, 168u8, 162u8, 204u8, 210u8, 20u8, ], ) } @@ -16030,10 +16024,9 @@ pub mod api { length_bound, }, [ - 207u8, 27u8, 175u8, 137u8, 87u8, 176u8, 52u8, 110u8, 175u8, 212u8, - 118u8, 136u8, 200u8, 108u8, 251u8, 232u8, 201u8, 155u8, 93u8, 62u8, - 38u8, 186u8, 198u8, 52u8, 26u8, 45u8, 214u8, 101u8, 202u8, 106u8, 99u8, - 219u8, + 0u8, 74u8, 70u8, 223u8, 112u8, 196u8, 199u8, 189u8, 93u8, 14u8, 101u8, + 211u8, 221u8, 38u8, 32u8, 220u8, 90u8, 120u8, 94u8, 107u8, 46u8, 121u8, + 250u8, 150u8, 26u8, 24u8, 20u8, 242u8, 253u8, 229u8, 43u8, 195u8, ], ) } @@ -16066,9 +16059,9 @@ pub mod api { length_bound, }, [ - 254u8, 227u8, 169u8, 126u8, 6u8, 164u8, 171u8, 55u8, 56u8, 151u8, 88u8, - 86u8, 190u8, 117u8, 162u8, 67u8, 200u8, 76u8, 182u8, 147u8, 104u8, - 250u8, 42u8, 76u8, 60u8, 234u8, 210u8, 0u8, 74u8, 178u8, 164u8, 129u8, + 157u8, 103u8, 73u8, 75u8, 15u8, 79u8, 50u8, 64u8, 5u8, 151u8, 194u8, + 216u8, 45u8, 47u8, 128u8, 206u8, 191u8, 52u8, 5u8, 104u8, 70u8, 6u8, + 139u8, 184u8, 12u8, 190u8, 109u8, 132u8, 195u8, 177u8, 197u8, 179u8, ], ) } @@ -16366,9 +16359,9 @@ pub mod api { _0.borrow(), )], [ - 112u8, 100u8, 134u8, 22u8, 5u8, 252u8, 154u8, 197u8, 212u8, 0u8, 30u8, - 67u8, 152u8, 38u8, 106u8, 78u8, 241u8, 69u8, 252u8, 61u8, 156u8, 34u8, - 151u8, 254u8, 20u8, 47u8, 22u8, 70u8, 136u8, 146u8, 55u8, 120u8, + 6u8, 23u8, 244u8, 48u8, 73u8, 203u8, 222u8, 109u8, 218u8, 166u8, 6u8, + 137u8, 121u8, 88u8, 54u8, 188u8, 37u8, 8u8, 229u8, 217u8, 170u8, 108u8, + 198u8, 66u8, 36u8, 92u8, 107u8, 168u8, 162u8, 204u8, 210u8, 20u8, ], ) } @@ -16387,9 +16380,9 @@ pub mod api { "ProposalOf", Vec::new(), [ - 112u8, 100u8, 134u8, 22u8, 5u8, 252u8, 154u8, 197u8, 212u8, 0u8, 30u8, - 67u8, 152u8, 38u8, 106u8, 78u8, 241u8, 69u8, 252u8, 61u8, 156u8, 34u8, - 151u8, 254u8, 20u8, 47u8, 22u8, 70u8, 136u8, 146u8, 55u8, 120u8, + 6u8, 23u8, 244u8, 48u8, 73u8, 203u8, 222u8, 109u8, 218u8, 166u8, 6u8, + 137u8, 121u8, 88u8, 54u8, 188u8, 37u8, 8u8, 229u8, 217u8, 170u8, 108u8, + 198u8, 66u8, 36u8, 92u8, 107u8, 168u8, 162u8, 204u8, 210u8, 20u8, ], ) } @@ -20155,10 +20148,10 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 123u8, 26u8, 93u8, 35u8, 214u8, 158u8, 129u8, 60u8, 147u8, 163u8, 50u8, - 19u8, 70u8, 25u8, 39u8, 205u8, 251u8, 178u8, 129u8, 202u8, 201u8, - 186u8, 27u8, 115u8, 129u8, 216u8, 139u8, 255u8, 104u8, 38u8, 41u8, - 66u8, + 97u8, 254u8, 134u8, 138u8, 68u8, 168u8, 207u8, 37u8, 107u8, 232u8, + 197u8, 219u8, 22u8, 91u8, 16u8, 162u8, 159u8, 99u8, 232u8, 92u8, 187u8, + 182u8, 231u8, 220u8, 235u8, 215u8, 186u8, 185u8, 40u8, 131u8, 191u8, + 37u8, ], ) } @@ -21439,9 +21432,9 @@ pub mod api { "batch", types::Batch { calls }, [ - 12u8, 135u8, 86u8, 65u8, 103u8, 75u8, 121u8, 211u8, 245u8, 38u8, 169u8, - 197u8, 234u8, 144u8, 84u8, 134u8, 129u8, 181u8, 119u8, 60u8, 213u8, - 152u8, 51u8, 172u8, 5u8, 146u8, 191u8, 24u8, 95u8, 241u8, 231u8, 209u8, + 221u8, 151u8, 56u8, 10u8, 237u8, 176u8, 153u8, 88u8, 29u8, 225u8, 27u8, + 231u8, 98u8, 222u8, 51u8, 94u8, 88u8, 16u8, 40u8, 253u8, 61u8, 35u8, + 70u8, 110u8, 15u8, 75u8, 102u8, 140u8, 125u8, 54u8, 223u8, 231u8, ], ) } @@ -21471,9 +21464,9 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 89u8, 62u8, 73u8, 74u8, 166u8, 135u8, 73u8, 171u8, 138u8, 219u8, 165u8, - 15u8, 77u8, 52u8, 179u8, 117u8, 96u8, 118u8, 50u8, 56u8, 187u8, 159u8, - 9u8, 185u8, 58u8, 183u8, 31u8, 128u8, 108u8, 62u8, 102u8, 197u8, + 154u8, 209u8, 156u8, 16u8, 183u8, 67u8, 69u8, 4u8, 187u8, 100u8, 27u8, + 221u8, 195u8, 187u8, 165u8, 6u8, 121u8, 94u8, 27u8, 111u8, 214u8, 91u8, + 83u8, 160u8, 242u8, 13u8, 236u8, 70u8, 155u8, 94u8, 78u8, 71u8, ], ) } @@ -21499,9 +21492,10 @@ pub mod api { "batch_all", types::BatchAll { calls }, [ - 126u8, 64u8, 7u8, 172u8, 174u8, 142u8, 40u8, 181u8, 203u8, 6u8, 157u8, - 178u8, 112u8, 250u8, 152u8, 101u8, 16u8, 93u8, 4u8, 39u8, 14u8, 180u8, - 217u8, 51u8, 19u8, 100u8, 77u8, 65u8, 50u8, 98u8, 183u8, 79u8, + 255u8, 107u8, 81u8, 108u8, 78u8, 19u8, 231u8, 220u8, 177u8, 177u8, + 28u8, 24u8, 100u8, 228u8, 227u8, 45u8, 3u8, 51u8, 132u8, 12u8, 48u8, + 158u8, 67u8, 201u8, 193u8, 126u8, 251u8, 177u8, 102u8, 251u8, 90u8, + 81u8, ], ) } @@ -21524,9 +21518,9 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 70u8, 103u8, 7u8, 7u8, 211u8, 56u8, 21u8, 249u8, 171u8, 126u8, 62u8, - 205u8, 184u8, 235u8, 35u8, 45u8, 101u8, 204u8, 176u8, 223u8, 38u8, - 15u8, 93u8, 189u8, 254u8, 195u8, 12u8, 157u8, 234u8, 96u8, 15u8, 50u8, + 74u8, 215u8, 136u8, 17u8, 87u8, 74u8, 107u8, 176u8, 229u8, 23u8, 109u8, + 233u8, 84u8, 229u8, 27u8, 35u8, 154u8, 93u8, 104u8, 222u8, 71u8, 167u8, + 39u8, 12u8, 235u8, 46u8, 204u8, 125u8, 67u8, 96u8, 236u8, 91u8, ], ) } @@ -21552,9 +21546,10 @@ pub mod api { "force_batch", types::ForceBatch { calls }, [ - 46u8, 245u8, 217u8, 95u8, 0u8, 142u8, 186u8, 62u8, 104u8, 197u8, 181u8, - 213u8, 218u8, 35u8, 75u8, 227u8, 67u8, 210u8, 215u8, 187u8, 5u8, 41u8, - 210u8, 165u8, 155u8, 35u8, 184u8, 71u8, 114u8, 184u8, 151u8, 82u8, + 183u8, 158u8, 12u8, 76u8, 9u8, 251u8, 54u8, 89u8, 139u8, 70u8, 51u8, + 72u8, 181u8, 28u8, 110u8, 207u8, 211u8, 236u8, 224u8, 44u8, 104u8, + 231u8, 238u8, 141u8, 176u8, 194u8, 100u8, 217u8, 63u8, 127u8, 166u8, + 24u8, ], ) } @@ -21577,9 +21572,9 @@ pub mod api { weight, }, [ - 127u8, 67u8, 196u8, 63u8, 164u8, 121u8, 43u8, 61u8, 37u8, 147u8, 131u8, - 88u8, 217u8, 192u8, 202u8, 66u8, 93u8, 42u8, 210u8, 128u8, 227u8, 8u8, - 6u8, 93u8, 232u8, 26u8, 240u8, 67u8, 30u8, 152u8, 94u8, 153u8, + 206u8, 4u8, 190u8, 61u8, 107u8, 61u8, 249u8, 88u8, 255u8, 170u8, 65u8, + 96u8, 12u8, 54u8, 149u8, 75u8, 250u8, 153u8, 103u8, 142u8, 117u8, 64u8, + 45u8, 189u8, 129u8, 28u8, 143u8, 78u8, 53u8, 188u8, 178u8, 19u8, ], ) } @@ -23176,10 +23171,10 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 14u8, 42u8, 86u8, 28u8, 32u8, 98u8, 119u8, 113u8, 168u8, 61u8, 112u8, - 87u8, 153u8, 37u8, 135u8, 82u8, 131u8, 185u8, 116u8, 230u8, 182u8, - 38u8, 134u8, 76u8, 161u8, 103u8, 131u8, 167u8, 138u8, 123u8, 34u8, - 104u8, + 29u8, 33u8, 67u8, 179u8, 234u8, 241u8, 45u8, 167u8, 110u8, 23u8, 85u8, + 27u8, 1u8, 184u8, 223u8, 187u8, 129u8, 206u8, 75u8, 237u8, 235u8, + 207u8, 43u8, 201u8, 194u8, 145u8, 149u8, 184u8, 95u8, 185u8, 205u8, + 248u8, ], ) } @@ -23459,9 +23454,10 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 8u8, 182u8, 157u8, 71u8, 2u8, 217u8, 103u8, 34u8, 52u8, 133u8, 231u8, - 248u8, 189u8, 158u8, 103u8, 53u8, 149u8, 166u8, 108u8, 226u8, 32u8, - 92u8, 174u8, 134u8, 220u8, 98u8, 17u8, 32u8, 140u8, 38u8, 200u8, 184u8, + 144u8, 103u8, 250u8, 31u8, 18u8, 158u8, 175u8, 139u8, 73u8, 56u8, + 178u8, 80u8, 164u8, 100u8, 162u8, 163u8, 119u8, 102u8, 177u8, 28u8, + 229u8, 128u8, 250u8, 242u8, 26u8, 223u8, 74u8, 180u8, 127u8, 124u8, + 134u8, 123u8, ], ) } @@ -23938,9 +23934,10 @@ pub mod api { call: ::std::boxed::Box::new(call), }, [ - 0u8, 101u8, 233u8, 4u8, 27u8, 61u8, 6u8, 243u8, 253u8, 208u8, 93u8, - 58u8, 221u8, 46u8, 248u8, 243u8, 6u8, 162u8, 59u8, 209u8, 185u8, 2u8, - 76u8, 95u8, 189u8, 8u8, 84u8, 89u8, 119u8, 25u8, 25u8, 116u8, + 113u8, 140u8, 77u8, 180u8, 170u8, 232u8, 85u8, 229u8, 218u8, 187u8, + 62u8, 64u8, 168u8, 186u8, 173u8, 27u8, 125u8, 216u8, 54u8, 167u8, + 225u8, 241u8, 10u8, 226u8, 138u8, 151u8, 242u8, 255u8, 212u8, 160u8, + 106u8, 69u8, ], ) } @@ -24004,10 +24001,10 @@ pub mod api { max_weight, }, [ - 172u8, 94u8, 125u8, 12u8, 125u8, 129u8, 89u8, 29u8, 172u8, 187u8, - 194u8, 188u8, 111u8, 34u8, 41u8, 94u8, 237u8, 82u8, 167u8, 33u8, 30u8, - 145u8, 155u8, 185u8, 169u8, 83u8, 60u8, 212u8, 138u8, 184u8, 152u8, - 58u8, + 167u8, 155u8, 31u8, 18u8, 196u8, 45u8, 139u8, 126u8, 185u8, 246u8, + 31u8, 88u8, 200u8, 228u8, 82u8, 139u8, 123u8, 239u8, 169u8, 185u8, + 227u8, 160u8, 71u8, 242u8, 152u8, 146u8, 87u8, 243u8, 170u8, 237u8, + 11u8, 6u8, ], ) } @@ -34073,18 +34070,6 @@ pub mod api { pub mod dmp { use super::root_mod; use super::runtime_types; - #[doc = "Contains one variant per dispatchable that can be called by an extrinsic."] - pub type Call = runtime_types::polkadot_runtime_parachains::dmp::pallet::Call; - pub mod calls { - use super::root_mod; - use super::runtime_types; - type DispatchError = runtime_types::sp_runtime::DispatchError; - pub mod types { - use super::runtime_types; - } - pub struct TransactionApi; - impl TransactionApi {} - } pub mod storage { use super::runtime_types; pub struct StorageApi; @@ -34201,6 +34186,53 @@ pub mod api { ], ) } + #[doc = " The number to multiply the base delivery fee by."] + pub fn delivery_fee_factor( + &self, + _0: impl ::std::borrow::Borrow, + ) -> ::subxt::storage::address::Address< + ::subxt::storage::address::StaticStorageMapKey, + runtime_types::sp_arithmetic::fixed_point::FixedU128, + ::subxt::storage::address::Yes, + ::subxt::storage::address::Yes, + ::subxt::storage::address::Yes, + > { + ::subxt::storage::address::Address::new_static( + "Dmp", + "DeliveryFeeFactor", + vec![::subxt::storage::address::make_static_storage_map_key( + _0.borrow(), + )], + [ + 74u8, 221u8, 160u8, 244u8, 128u8, 163u8, 79u8, 26u8, 35u8, 182u8, + 211u8, 224u8, 181u8, 42u8, 98u8, 193u8, 128u8, 249u8, 40u8, 122u8, + 208u8, 19u8, 64u8, 8u8, 156u8, 165u8, 156u8, 59u8, 112u8, 197u8, 160u8, + 87u8, + ], + ) + } + #[doc = " The number to multiply the base delivery fee by."] + pub fn delivery_fee_factor_root( + &self, + ) -> ::subxt::storage::address::Address< + ::subxt::storage::address::StaticStorageMapKey, + runtime_types::sp_arithmetic::fixed_point::FixedU128, + (), + ::subxt::storage::address::Yes, + ::subxt::storage::address::Yes, + > { + ::subxt::storage::address::Address::new_static( + "Dmp", + "DeliveryFeeFactor", + Vec::new(), + [ + 74u8, 221u8, 160u8, 244u8, 128u8, 163u8, 79u8, 26u8, 35u8, 182u8, + 211u8, 224u8, 181u8, 42u8, 98u8, 193u8, 128u8, 249u8, 40u8, 122u8, + 208u8, 19u8, 64u8, 8u8, 156u8, 165u8, 156u8, 59u8, 112u8, 197u8, 160u8, + 87u8, + ], + ) + } } } } @@ -36285,6 +36317,164 @@ pub mod api { } } } + pub mod paras_slashing { + use super::root_mod; + use super::runtime_types; + #[doc = "\n\t\t\tCustom [dispatch errors](https://docs.substrate.io/main-docs/build/events-errors/)\n\t\t\tof this pallet.\n\t\t\t"] + pub type Error = + runtime_types::polkadot_runtime_parachains::disputes::slashing::pallet::Error; + #[doc = "Contains one variant per dispatchable that can be called by an extrinsic."] + pub type Call = + runtime_types::polkadot_runtime_parachains::disputes::slashing::pallet::Call; + pub mod calls { + use super::root_mod; + use super::runtime_types; + type DispatchError = runtime_types::sp_runtime::DispatchError; + pub mod types { + use super::runtime_types; + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + pub struct ReportDisputeLostUnsigned { pub dispute_proof : :: std :: boxed :: Box < runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: DisputeProof > , pub key_owner_proof : runtime_types :: sp_session :: MembershipProof , } + impl ::subxt::blocks::StaticExtrinsic for ReportDisputeLostUnsigned { + const PALLET: &'static str = "ParasSlashing"; + const CALL: &'static str = "report_dispute_lost_unsigned"; + } + } + pub struct TransactionApi; + impl TransactionApi { + pub fn report_dispute_lost_unsigned( + &self, + dispute_proof : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: DisputeProof, + key_owner_proof: runtime_types::sp_session::MembershipProof, + ) -> ::subxt::tx::Payload { + ::subxt::tx::Payload::new_static( + "ParasSlashing", + "report_dispute_lost_unsigned", + types::ReportDisputeLostUnsigned { + dispute_proof: ::std::boxed::Box::new(dispute_proof), + key_owner_proof, + }, + [ + 56u8, 94u8, 136u8, 125u8, 219u8, 155u8, 79u8, 241u8, 109u8, 125u8, + 106u8, 175u8, 5u8, 189u8, 34u8, 232u8, 132u8, 113u8, 157u8, 184u8, + 10u8, 34u8, 135u8, 184u8, 36u8, 224u8, 234u8, 141u8, 35u8, 69u8, 254u8, + 125u8, + ], + ) + } + } + } + pub mod storage { + use super::runtime_types; + pub struct StorageApi; + impl StorageApi { + #[doc = " Validators pending dispute slashes."] + pub fn unapplied_slashes( + &self, + _0: impl ::std::borrow::Borrow<::core::primitive::u32>, + _1: impl ::std::borrow::Borrow< + runtime_types::polkadot_core_primitives::CandidateHash, + >, + ) -> ::subxt::storage::address::Address< + ::subxt::storage::address::StaticStorageMapKey, + runtime_types::polkadot_runtime_parachains::disputes::slashing::PendingSlashes, + ::subxt::storage::address::Yes, + (), + ::subxt::storage::address::Yes, + > { + ::subxt::storage::address::Address::new_static( + "ParasSlashing", + "UnappliedSlashes", + vec![ + ::subxt::storage::address::make_static_storage_map_key(_0.borrow()), + ::subxt::storage::address::make_static_storage_map_key(_1.borrow()), + ], + [ + 54u8, 95u8, 76u8, 24u8, 68u8, 137u8, 201u8, 120u8, 51u8, 146u8, 12u8, + 14u8, 39u8, 109u8, 69u8, 148u8, 117u8, 193u8, 139u8, 82u8, 23u8, 77u8, + 0u8, 16u8, 64u8, 125u8, 181u8, 249u8, 23u8, 156u8, 70u8, 90u8, + ], + ) + } + #[doc = " Validators pending dispute slashes."] + pub fn unapplied_slashes_root( + &self, + ) -> ::subxt::storage::address::Address< + ::subxt::storage::address::StaticStorageMapKey, + runtime_types::polkadot_runtime_parachains::disputes::slashing::PendingSlashes, + (), + (), + ::subxt::storage::address::Yes, + > { + ::subxt::storage::address::Address::new_static( + "ParasSlashing", + "UnappliedSlashes", + Vec::new(), + [ + 54u8, 95u8, 76u8, 24u8, 68u8, 137u8, 201u8, 120u8, 51u8, 146u8, 12u8, + 14u8, 39u8, 109u8, 69u8, 148u8, 117u8, 193u8, 139u8, 82u8, 23u8, 77u8, + 0u8, 16u8, 64u8, 125u8, 181u8, 249u8, 23u8, 156u8, 70u8, 90u8, + ], + ) + } + #[doc = " `ValidatorSetCount` per session."] + pub fn validator_set_counts( + &self, + _0: impl ::std::borrow::Borrow<::core::primitive::u32>, + ) -> ::subxt::storage::address::Address< + ::subxt::storage::address::StaticStorageMapKey, + ::core::primitive::u32, + ::subxt::storage::address::Yes, + (), + ::subxt::storage::address::Yes, + > { + ::subxt::storage::address::Address::new_static( + "ParasSlashing", + "ValidatorSetCounts", + vec![::subxt::storage::address::make_static_storage_map_key( + _0.borrow(), + )], + [ + 121u8, 241u8, 222u8, 61u8, 186u8, 55u8, 206u8, 246u8, 31u8, 128u8, + 103u8, 53u8, 6u8, 73u8, 13u8, 120u8, 63u8, 56u8, 167u8, 75u8, 113u8, + 102u8, 221u8, 129u8, 151u8, 186u8, 225u8, 169u8, 128u8, 192u8, 107u8, + 214u8, + ], + ) + } + #[doc = " `ValidatorSetCount` per session."] + pub fn validator_set_counts_root( + &self, + ) -> ::subxt::storage::address::Address< + ::subxt::storage::address::StaticStorageMapKey, + ::core::primitive::u32, + (), + (), + ::subxt::storage::address::Yes, + > { + ::subxt::storage::address::Address::new_static( + "ParasSlashing", + "ValidatorSetCounts", + Vec::new(), + [ + 121u8, 241u8, 222u8, 61u8, 186u8, 55u8, 206u8, 246u8, 31u8, 128u8, + 103u8, 53u8, 6u8, 73u8, 13u8, 120u8, 63u8, 56u8, 167u8, 75u8, 113u8, + 102u8, 221u8, 129u8, 151u8, 186u8, 225u8, 169u8, 128u8, 192u8, 107u8, + 214u8, + ], + ) + } + } + } + } pub mod registrar { use super::root_mod; use super::runtime_types; @@ -36737,6 +36927,24 @@ pub mod api { const PALLET: &'static str = "Registrar"; const EVENT: &'static str = "Reserved"; } + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + pub struct Swapped { + pub para_id: runtime_types::polkadot_parachain::primitives::Id, + pub other_id: runtime_types::polkadot_parachain::primitives::Id, + } + impl ::subxt::events::StaticEvent for Swapped { + const PALLET: &'static str = "Registrar"; + const EVENT: &'static str = "Swapped"; + } } pub mod storage { use super::runtime_types; @@ -38738,6 +38946,23 @@ pub mod api { const PALLET: &'static str = "XcmPallet"; const CALL: &'static str = "limited_teleport_assets"; } + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + pub struct ForceSuspension { + pub suspended: ::core::primitive::bool, + } + impl ::subxt::blocks::StaticExtrinsic for ForceSuspension { + const PALLET: &'static str = "XcmPallet"; + const CALL: &'static str = "force_suspension"; + } } pub struct TransactionApi; impl TransactionApi { @@ -38870,7 +39095,7 @@ pub mod api { #[doc = "Extoll that a particular destination can be communicated with through a particular"] #[doc = "version of XCM."] #[doc = ""] - #[doc = "- `origin`: Must be Root."] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] #[doc = "- `location`: The destination that is being described."] #[doc = "- `xcm_version`: The latest version of XCM that `location` supports."] pub fn force_xcm_version( @@ -38895,7 +39120,7 @@ pub mod api { #[doc = "Set a safe XCM version (the version that XCM should be encoded with if the most recent"] #[doc = "version a destination can accept is unknown)."] #[doc = ""] - #[doc = "- `origin`: Must be Root."] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] #[doc = "- `maybe_xcm_version`: The default XCM encoding version, or `None` to disable."] pub fn force_default_xcm_version( &self, @@ -38914,7 +39139,7 @@ pub mod api { } #[doc = "Ask a location to notify us regarding their XCM version and any changes to it."] #[doc = ""] - #[doc = "- `origin`: Must be Root."] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] #[doc = "- `location`: The location to which we should subscribe for XCM version notifications."] pub fn force_subscribe_version_notify( &self, @@ -38936,7 +39161,7 @@ pub mod api { #[doc = "Require that a particular destination should no longer notify us regarding any XCM"] #[doc = "version changes."] #[doc = ""] - #[doc = "- `origin`: Must be Root."] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] #[doc = "- `location`: The location to which we are currently subscribed for XCM version"] #[doc = " notifications which we no longer desire."] pub fn force_unsubscribe_version_notify( @@ -39042,6 +39267,25 @@ pub mod api { ], ) } + #[doc = "Set or unset the global suspension state of the XCM executor."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `suspended`: `true` to suspend, `false` to resume."] + pub fn force_suspension( + &self, + suspended: ::core::primitive::bool, + ) -> ::subxt::tx::Payload { + ::subxt::tx::Payload::new_static( + "XcmPallet", + "force_suspension", + types::ForceSuspension { suspended }, + [ + 147u8, 1u8, 117u8, 148u8, 8u8, 14u8, 53u8, 167u8, 85u8, 184u8, 25u8, + 183u8, 52u8, 197u8, 12u8, 135u8, 45u8, 88u8, 13u8, 27u8, 218u8, 31u8, + 80u8, 27u8, 183u8, 36u8, 0u8, 243u8, 235u8, 85u8, 75u8, 81u8, + ], + ) + } } } #[doc = "\n\t\t\tThe [event](https://docs.substrate.io/main-docs/build/events-errors/) emitted\n\t\t\tby this pallet.\n\t\t\t"] @@ -40021,6 +40265,28 @@ pub mod api { ], ) } + #[doc = " Global suspension state of the XCM executor."] + pub fn xcm_execution_suspended( + &self, + ) -> ::subxt::storage::address::Address< + ::subxt::storage::address::StaticStorageMapKey, + ::core::primitive::bool, + ::subxt::storage::address::Yes, + ::subxt::storage::address::Yes, + (), + > { + ::subxt::storage::address::Address::new_static( + "XcmPallet", + "XcmExecutionSuspended", + vec![], + [ + 182u8, 20u8, 35u8, 10u8, 65u8, 208u8, 52u8, 141u8, 158u8, 23u8, 46u8, + 221u8, 172u8, 110u8, 39u8, 121u8, 106u8, 104u8, 19u8, 64u8, 90u8, + 137u8, 173u8, 31u8, 112u8, 219u8, 64u8, 238u8, 125u8, 242u8, 24u8, + 107u8, + ], + ) + } } } } @@ -41215,6 +41481,18 @@ pub mod api { who: ::subxt::utils::AccountId32, amount: ::core::primitive::u128, }, + #[codec(index = 19)] + #[doc = "Some balance was frozen."] + Frozen { + who: ::subxt::utils::AccountId32, + amount: ::core::primitive::u128, + }, + #[codec(index = 20)] + #[doc = "Some balance was thawed."] + Thawed { + who: ::subxt::utils::AccountId32, + amount: ::core::primitive::u128, + }, } } pub mod types { @@ -49531,7 +49809,7 @@ pub mod api { #[doc = "Extoll that a particular destination can be communicated with through a particular"] #[doc = "version of XCM."] #[doc = ""] - #[doc = "- `origin`: Must be Root."] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] #[doc = "- `location`: The destination that is being described."] #[doc = "- `xcm_version`: The latest version of XCM that `location` supports."] force_xcm_version { @@ -49543,7 +49821,7 @@ pub mod api { #[doc = "Set a safe XCM version (the version that XCM should be encoded with if the most recent"] #[doc = "version a destination can accept is unknown)."] #[doc = ""] - #[doc = "- `origin`: Must be Root."] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] #[doc = "- `maybe_xcm_version`: The default XCM encoding version, or `None` to disable."] force_default_xcm_version { maybe_xcm_version: ::core::option::Option<::core::primitive::u32>, @@ -49551,7 +49829,7 @@ pub mod api { #[codec(index = 6)] #[doc = "Ask a location to notify us regarding their XCM version and any changes to it."] #[doc = ""] - #[doc = "- `origin`: Must be Root."] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] #[doc = "- `location`: The location to which we should subscribe for XCM version notifications."] force_subscribe_version_notify { location: ::std::boxed::Box, @@ -49560,7 +49838,7 @@ pub mod api { #[doc = "Require that a particular destination should no longer notify us regarding any XCM"] #[doc = "version changes."] #[doc = ""] - #[doc = "- `origin`: Must be Root."] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] #[doc = "- `location`: The location to which we are currently subscribed for XCM version"] #[doc = " notifications which we no longer desire."] force_unsubscribe_version_notify { @@ -49617,6 +49895,12 @@ pub mod api { fee_asset_item: ::core::primitive::u32, weight_limit: runtime_types::xcm::v3::WeightLimit, }, + #[codec(index = 10)] + #[doc = "Set or unset the global suspension state of the XCM executor."] + #[doc = ""] + #[doc = "- `origin`: Must be an origin specified by AdminOrigin."] + #[doc = "- `suspended`: `true` to suspend, `false` to resume."] + force_suspension { suspended: ::core::primitive::bool }, } #[derive( :: subxt :: ext :: codec :: Decode, @@ -51284,14 +51568,16 @@ pub mod api { Paras(runtime_types::polkadot_runtime_parachains::paras::pallet::Call), #[codec(index = 57)] Initializer(runtime_types::polkadot_runtime_parachains::initializer::pallet::Call), - #[codec(index = 58)] - Dmp(runtime_types::polkadot_runtime_parachains::dmp::pallet::Call), #[codec(index = 59)] Ump(runtime_types::polkadot_runtime_parachains::ump::pallet::Call), #[codec(index = 60)] Hrmp(runtime_types::polkadot_runtime_parachains::hrmp::pallet::Call), #[codec(index = 62)] ParasDisputes(runtime_types::polkadot_runtime_parachains::disputes::pallet::Call), + #[codec(index = 63)] + ParasSlashing( + runtime_types::polkadot_runtime_parachains::disputes::slashing::pallet::Call, + ), #[codec(index = 70)] Registrar(runtime_types::polkadot_runtime_common::paras_registrar::pallet::Call), #[codec(index = 71)] @@ -52360,6 +52646,11 @@ pub mod api { para_id: runtime_types::polkadot_parachain::primitives::Id, who: ::subxt::utils::AccountId32, }, + #[codec(index = 3)] + Swapped { + para_id: runtime_types::polkadot_parachain::primitives::Id, + other_id: runtime_types::polkadot_parachain::primitives::Id, + }, } } #[derive( @@ -52663,6 +52954,109 @@ pub mod api { Revert(::core::primitive::u32), } } + pub mod slashing { + use super::runtime_types; + pub mod pallet { + use super::runtime_types; + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + #[doc = "Contains one variant per dispatchable that can be called by an extrinsic."] + pub enum Call { + # [codec (index = 0)] report_dispute_lost_unsigned { dispute_proof : :: std :: boxed :: Box < runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: DisputeProof > , key_owner_proof : runtime_types :: sp_session :: MembershipProof , } , } + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + #[doc = "\n\t\t\tCustom [dispatch errors](https://docs.substrate.io/main-docs/build/events-errors/)\n\t\t\tof this pallet.\n\t\t\t"] + pub enum Error { + #[codec(index = 0)] + #[doc = "The key ownership proof is invalid."] + InvalidKeyOwnershipProof, + #[codec(index = 1)] + #[doc = "The session index is too old or invalid."] + InvalidSessionIndex, + #[codec(index = 2)] + #[doc = "The candidate hash is invalid."] + InvalidCandidateHash, + #[codec(index = 3)] + #[doc = "There is no pending slash for the given validator index and time"] + #[doc = "slot."] + InvalidValidatorIndex, + #[codec(index = 4)] + #[doc = "The validator index does not match the validator id."] + ValidatorIndexIdMismatch, + #[codec(index = 5)] + #[doc = "The given slashing report is valid but already previously reported."] + DuplicateSlashingReport, + } + } + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + pub struct DisputeProof { pub time_slot : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: DisputesTimeSlot , pub kind : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: SlashingOffenceKind , pub validator_index : runtime_types :: polkadot_primitives :: v4 :: ValidatorIndex , pub validator_id : runtime_types :: polkadot_primitives :: v4 :: validator_app :: Public , } + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + pub struct DisputesTimeSlot { + pub session_index: ::core::primitive::u32, + pub candidate_hash: runtime_types::polkadot_core_primitives::CandidateHash, + } + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + pub struct PendingSlashes { pub keys : :: subxt :: utils :: KeyedVec < runtime_types :: polkadot_primitives :: v4 :: ValidatorIndex , runtime_types :: polkadot_primitives :: v4 :: validator_app :: Public > , pub kind : runtime_types :: polkadot_runtime_parachains :: disputes :: slashing :: SlashingOffenceKind , } + #[derive( + :: subxt :: ext :: codec :: Decode, + :: subxt :: ext :: codec :: Encode, + :: subxt :: ext :: scale_decode :: DecodeAsType, + :: subxt :: ext :: scale_encode :: EncodeAsType, + Debug, + )] + # [codec (crate = :: subxt :: ext :: codec)] + #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] + #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] + pub enum SlashingOffenceKind { + #[codec(index = 0)] + ForInvalid, + #[codec(index = 1)] + AgainstValid, + } + } #[derive( :: subxt :: ext :: codec :: Decode, :: subxt :: ext :: codec :: Encode, @@ -52696,24 +53090,6 @@ pub mod api { Invalid, } } - pub mod dmp { - use super::runtime_types; - pub mod pallet { - use super::runtime_types; - #[derive( - :: subxt :: ext :: codec :: Decode, - :: subxt :: ext :: codec :: Encode, - :: subxt :: ext :: scale_decode :: DecodeAsType, - :: subxt :: ext :: scale_encode :: EncodeAsType, - Debug, - )] - # [codec (crate = :: subxt :: ext :: codec)] - #[decode_as_type(crate_path = ":: subxt :: ext :: scale_decode")] - #[encode_as_type(crate_path = ":: subxt :: ext :: scale_encode")] - #[doc = "Contains one variant per dispatchable that can be called by an extrinsic."] - pub enum Call {} - } - } pub mod hrmp { use super::runtime_types; pub mod pallet { diff --git a/testing/ui-tests/src/correct/generic_params.rs b/testing/ui-tests/src/correct/generic_params.rs index 72db6f196f..30f024fe12 100644 --- a/testing/ui-tests/src/correct/generic_params.rs +++ b/testing/ui-tests/src/correct/generic_params.rs @@ -20,7 +20,7 @@ pub struct Second(T, U); pub struct DoesntImplEncodeDecodeAsType(u16); #[subxt::subxt( - runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale", + runtime_metadata_path = "../../../../artifacts/polkadot_metadata_small.scale", substitute_type( path = "sp_runtime::multiaddress::MultiAddress", // Discarding both params: @@ -30,7 +30,7 @@ pub struct DoesntImplEncodeDecodeAsType(u16); pub mod node_runtime {} #[subxt::subxt( - runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale", + runtime_metadata_path = "../../../../artifacts/polkadot_metadata_small.scale", substitute_type( path = "sp_runtime::multiaddress::MultiAddress", // Discarding second param: @@ -40,7 +40,7 @@ pub mod node_runtime {} pub mod node_runtime2 {} #[subxt::subxt( - runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale", + runtime_metadata_path = "../../../../artifacts/polkadot_metadata_small.scale", substitute_type( path = "sp_runtime::multiaddress::MultiAddress", // Discarding first param: @@ -50,7 +50,7 @@ pub mod node_runtime2 {} pub mod node_runtime3 {} #[subxt::subxt( - runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale", + runtime_metadata_path = "../../../../artifacts/polkadot_metadata_small.scale", substitute_type( path = "sp_runtime::multiaddress::MultiAddress", // Swapping params: @@ -60,7 +60,7 @@ pub mod node_runtime3 {} pub mod node_runtime4 {} #[subxt::subxt( - runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale", + runtime_metadata_path = "../../../../artifacts/polkadot_metadata_small.scale", substitute_type( path = "sp_runtime::multiaddress::MultiAddress", // Ignore input params and just use concrete types on output: @@ -70,7 +70,7 @@ pub mod node_runtime4 {} pub mod node_runtime5 {} #[subxt::subxt( - runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale", + runtime_metadata_path = "../../../../artifacts/polkadot_metadata_small.scale", substitute_type( path = "sp_runtime::multiaddress::MultiAddress", // We can put a static type in, too: @@ -80,7 +80,7 @@ pub mod node_runtime5 {} pub mod node_runtime6 {} #[subxt::subxt( - runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale", + runtime_metadata_path = "../../../../artifacts/polkadot_metadata_small.scale", substitute_type( path = "sp_runtime::multiaddress::MultiAddress", // Check that things can be wrapped in our Static type: @@ -90,7 +90,7 @@ pub mod node_runtime6 {} pub mod node_runtime7 {} #[subxt::subxt( - runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale", + runtime_metadata_path = "../../../../artifacts/polkadot_metadata_small.scale", substitute_type( path = "sp_runtime::multiaddress::MultiAddress", // Recursive type param substitution should work too (swapping out nested A and B): diff --git a/testing/ui-tests/src/correct/rust_items_preserved.rs b/testing/ui-tests/src/correct/rust_items_preserved.rs index e8269e768b..f784e0dda6 100644 --- a/testing/ui-tests/src/correct/rust_items_preserved.rs +++ b/testing/ui-tests/src/correct/rust_items_preserved.rs @@ -1,4 +1,4 @@ -#[subxt::subxt(runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale")] +#[subxt::subxt(runtime_metadata_path = "../../../../artifacts/polkadot_metadata_tiny.scale")] pub mod node_runtime { pub struct SomeStruct; pub enum SomeEnum { diff --git a/testing/ui-tests/src/incorrect/substitute_path_not_absolute.rs b/testing/ui-tests/src/incorrect/substitute_path_not_absolute.rs index 8cac806198..470ea83a7b 100644 --- a/testing/ui-tests/src/incorrect/substitute_path_not_absolute.rs +++ b/testing/ui-tests/src/incorrect/substitute_path_not_absolute.rs @@ -1,5 +1,5 @@ #[subxt::subxt( - runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale", + runtime_metadata_path = "../../../../artifacts/polkadot_metadata_tiny.scale", substitute_type( path = "sp_arithmetic::per_things::Perbill", with = "sp_runtime::Perbill" diff --git a/testing/ui-tests/src/incorrect/url_and_path_provided.rs b/testing/ui-tests/src/incorrect/url_and_path_provided.rs index 47fd5b5d26..90cc5cca57 100644 --- a/testing/ui-tests/src/incorrect/url_and_path_provided.rs +++ b/testing/ui-tests/src/incorrect/url_and_path_provided.rs @@ -1,5 +1,5 @@ #[subxt::subxt( - runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale", + runtime_metadata_path = "../../../../artifacts/polkadot_metadata_tiny.scale", runtime_metadata_url = "wss://rpc.polkadot.io:443" )] pub mod node_runtime {} diff --git a/testing/ui-tests/src/incorrect/url_and_path_provided.stderr b/testing/ui-tests/src/incorrect/url_and_path_provided.stderr index 5a98277e76..2c9d48feb8 100644 --- a/testing/ui-tests/src/incorrect/url_and_path_provided.stderr +++ b/testing/ui-tests/src/incorrect/url_and_path_provided.stderr @@ -2,7 +2,7 @@ error: Only one of 'runtime_metadata_path' or 'runtime_metadata_url' can be prov --> src/incorrect/url_and_path_provided.rs:1:1 | 1 | / #[subxt::subxt( -2 | | runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale", +2 | | runtime_metadata_path = "../../../../artifacts/polkadot_metadata_tiny.scale", 3 | | runtime_metadata_url = "wss://rpc.polkadot.io:443" 4 | | )] | |__^ diff --git a/testing/ui-tests/src/lib.rs b/testing/ui-tests/src/lib.rs index 702577204b..f9f20720d5 100644 --- a/testing/ui-tests/src/lib.rs +++ b/testing/ui-tests/src/lib.rs @@ -23,7 +23,8 @@ use crate::utils::{MetadataTestRunner, PalletMetadataTestRunner}; #[test] fn ui_tests() { let mut m = MetadataTestRunner::default(); - let mut p = PalletMetadataTestRunner::new(); + // specify pallets we want to test the metadata for (None => all pallets, but specifying only Some(..) speeds up test) + let mut p = PalletMetadataTestRunner::new(Some(&["Babe", "Claims", "Grandpa", "Balances"])); let t = trybuild::TestCases::new(); t.pass("src/correct/*.rs"); diff --git a/testing/ui-tests/src/utils/pallet_metadata_test_runner.rs b/testing/ui-tests/src/utils/pallet_metadata_test_runner.rs index e87c755f23..613a274507 100644 --- a/testing/ui-tests/src/utils/pallet_metadata_test_runner.rs +++ b/testing/ui-tests/src/utils/pallet_metadata_test_runner.rs @@ -8,15 +8,17 @@ use std::io::Read; use subxt_metadata::{metadata_v14_to_latest, retain_metadata_pallets}; static TEST_DIR_PREFIX: &str = "subxt_generated_pallets_ui_tests_"; -static METADATA_FILE: &str = "../../artifacts/polkadot_metadata.scale"; +static METADATA_FILE: &str = "../../artifacts/polkadot_metadata_full.scale"; pub struct PalletMetadataTestRunner { metadata: RuntimeMetadataV15, index: usize, + pallet_names: Option>, } impl PalletMetadataTestRunner { - pub fn new() -> PalletMetadataTestRunner { + /// if pallet_names is Some(..) only the provided pallets will be tested. + pub fn new(pallet_names: Option<&[&str]>) -> PalletMetadataTestRunner { let mut file = std::fs::File::open(METADATA_FILE).expect("Cannot open metadata.scale artifact"); @@ -32,8 +34,12 @@ impl PalletMetadataTestRunner { frame_metadata::RuntimeMetadata::V15(v15) => v15, _ => panic!("Unsupported metadata version {:?}", meta.1), }; - - PalletMetadataTestRunner { metadata, index: 0 } + let pallet_names = pallet_names.map(|v| v.iter().map(|e| e.to_string()).collect()); + PalletMetadataTestRunner { + metadata, + index: 0, + pallet_names, + } } pub fn path_to_next_ui_test(&mut self) -> Option { @@ -41,10 +47,15 @@ impl PalletMetadataTestRunner { return None }; let test_name = &pallet.name; - // Increment test index to avoid overlaps. let index = self.index; self.index += 1; + // if a pallet filter is set (pallet_names is Some), return the next pallet if this pallet is not in the filter. + if let Some(name_filter) = self.pallet_names.as_ref() { + if !name_filter.contains(test_name) { + return self.path_to_next_ui_test(); + } + } // Build custom metadata containing only this pallet. let mut metadata = self.metadata.clone(); @@ -92,9 +103,17 @@ impl PalletMetadataTestRunner { impl Drop for PalletMetadataTestRunner { fn drop(&mut self) { for i in 0..self.index { - let mut tmp_dir = std::env::temp_dir(); - tmp_dir.push(format!("{TEST_DIR_PREFIX}{i}")); - std::fs::remove_dir_all(tmp_dir).expect("cannot cleanup temp files"); + if let Some(pallet) = self.metadata.pallets.get(self.index) { + if let Some(name_filter) = self.pallet_names.as_ref() { + if !name_filter.contains(&pallet.name) { + continue; + } + } + + let mut tmp_dir = std::env::temp_dir(); + tmp_dir.push(format!("{TEST_DIR_PREFIX}{i}")); + std::fs::remove_dir_all(tmp_dir).expect("cannot cleanup temp files"); + }; } } }